wxPython-zombie 3.1.5.8__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1175) hide show
  1. wx/__init__.py +22 -0
  2. wx/__version__.py +9 -0
  3. wx/_adv.cp313-win_amd64.pyd +0 -0
  4. wx/_aui.cp313-win_amd64.pyd +0 -0
  5. wx/_core.cp313-win_amd64.pyd +0 -0
  6. wx/_dataview.cp313-win_amd64.pyd +0 -0
  7. wx/_glcanvas.cp313-win_amd64.pyd +0 -0
  8. wx/_grid.cp313-win_amd64.pyd +0 -0
  9. wx/_html.cp313-win_amd64.pyd +0 -0
  10. wx/_html2.cp313-win_amd64.pyd +0 -0
  11. wx/_media.cp313-win_amd64.pyd +0 -0
  12. wx/_msw.cp313-win_amd64.pyd +0 -0
  13. wx/_propgrid.cp313-win_amd64.pyd +0 -0
  14. wx/_ribbon.cp313-win_amd64.pyd +0 -0
  15. wx/_richtext.cp313-win_amd64.pyd +0 -0
  16. wx/_stc.cp313-win_amd64.pyd +0 -0
  17. wx/_xml.cp313-win_amd64.pyd +0 -0
  18. wx/_xrc.cp313-win_amd64.pyd +0 -0
  19. wx/adv.py +124 -0
  20. wx/adv.pyi +5182 -0
  21. wx/aui.py +77 -0
  22. wx/aui.pyi +3655 -0
  23. wx/core.py +3540 -0
  24. wx/core.pyi +50592 -0
  25. wx/dataview.py +173 -0
  26. wx/dataview.pyi +3491 -0
  27. wx/demo/AUI_DockingWindowMgr.py +1154 -0
  28. wx/demo/AUI_MDI.py +117 -0
  29. wx/demo/AUI_Notebook.py +58 -0
  30. wx/demo/About.py +75 -0
  31. wx/demo/AboutBox.py +75 -0
  32. wx/demo/ActiveXWrapper_Acrobat.py +132 -0
  33. wx/demo/ActiveXWrapper_IE.py +187 -0
  34. wx/demo/ActiveX_FlashWindow.py +107 -0
  35. wx/demo/ActiveX_IEHtmlWindow.py +242 -0
  36. wx/demo/ActiveX_PDFWindow.py +204 -0
  37. wx/demo/ActivityIndicator.py +80 -0
  38. wx/demo/AddPrivateFont.py +116 -0
  39. wx/demo/AdjustChannels.py +178 -0
  40. wx/demo/AlphaDrawing.py +77 -0
  41. wx/demo/AnalogClock.py +144 -0
  42. wx/demo/AnimationCtrl.py +104 -0
  43. wx/demo/ArtProvider.py +893 -0
  44. wx/demo/BannerWindow.py +1 -0
  45. wx/demo/BitmapButton.py +87 -0
  46. wx/demo/BitmapComboBox.py +63 -0
  47. wx/demo/BitmapFromBuffer.py +140 -0
  48. wx/demo/Button.py +77 -0
  49. wx/demo/Cairo.py +197 -0
  50. wx/demo/Cairo_Snippets.py +135 -0
  51. wx/demo/Calendar.py +660 -0
  52. wx/demo/CalendarCtrl.py +122 -0
  53. wx/demo/CheckBox.py +74 -0
  54. wx/demo/CheckListBox.py +79 -0
  55. wx/demo/CheckListCtrl.py +99 -0
  56. wx/demo/Choice.py +55 -0
  57. wx/demo/Choicebook.py +80 -0
  58. wx/demo/CollapsibleHeaderCtrl.py +85 -0
  59. wx/demo/CollapsiblePane.py +126 -0
  60. wx/demo/ColorPanel.py +19 -0
  61. wx/demo/ColourDB.py +203 -0
  62. wx/demo/ColourDialog.py +76 -0
  63. wx/demo/ColourSelect.py +119 -0
  64. wx/demo/ComboBox.py +111 -0
  65. wx/demo/ComboCtrl.py +153 -0
  66. wx/demo/ComboTreeBox.py +71 -0
  67. wx/demo/CommandLinkButton.py +50 -0
  68. wx/demo/ContextHelp.py +112 -0
  69. wx/demo/Cursor.py +336 -0
  70. wx/demo/CustomDragAndDrop.py +353 -0
  71. wx/demo/DVC_CustomRenderer.py +204 -0
  72. wx/demo/DVC_DataViewModel.py +365 -0
  73. wx/demo/DVC_IndexListModel.py +257 -0
  74. wx/demo/DVC_ListCtrl.py +69 -0
  75. wx/demo/DVC_TreeCtrl.py +76 -0
  76. wx/demo/DatePickerCtrl.py +68 -0
  77. wx/demo/DelayedResult.py +239 -0
  78. wx/demo/Dialog.py +169 -0
  79. wx/demo/DialogUnits.py +128 -0
  80. wx/demo/DirDialog.py +58 -0
  81. wx/demo/DragAndDrop.py +265 -0
  82. wx/demo/DragImage.py +316 -0
  83. wx/demo/DragScroller.py +59 -0
  84. wx/demo/DrawXXXList.py +436 -0
  85. wx/demo/DynamicSashWindow.py +177 -0
  86. wx/demo/EditableListBox.py +101 -0
  87. wx/demo/Editor.py +70 -0
  88. wx/demo/EventManager.py +291 -0
  89. wx/demo/ExpandoTextCtrl.py +164 -0
  90. wx/demo/FancyText.py +83 -0
  91. wx/demo/FileBrowseButton.py +100 -0
  92. wx/demo/FileCtrl.py +97 -0
  93. wx/demo/FileDialog.py +144 -0
  94. wx/demo/FileHistory.py +140 -0
  95. wx/demo/FindReplaceDialog.py +123 -0
  96. wx/demo/FloatCanvas.py +1959 -0
  97. wx/demo/FontDialog.py +142 -0
  98. wx/demo/FontEnumerator.py +82 -0
  99. wx/demo/Frame.py +85 -0
  100. wx/demo/GLCanvas.py +371 -0
  101. wx/demo/Gauge.py +66 -0
  102. wx/demo/GenericButtons.py +185 -0
  103. wx/demo/GenericCheckBox.py +65 -0
  104. wx/demo/GenericDirCtrl.py +74 -0
  105. wx/demo/GetMouseState.py +159 -0
  106. wx/demo/GraphicsContext.py +236 -0
  107. wx/demo/GraphicsGradient.py +281 -0
  108. wx/demo/Grid.py +95 -0
  109. wx/demo/GridBagSizer.py +170 -0
  110. wx/demo/GridCustEditor.py +247 -0
  111. wx/demo/GridCustTable.py +170 -0
  112. wx/demo/GridDragAndDrop.py +102 -0
  113. wx/demo/GridDragable.py +206 -0
  114. wx/demo/GridEnterHandler.py +66 -0
  115. wx/demo/GridHugeTable.py +89 -0
  116. wx/demo/GridLabelRenderer.py +114 -0
  117. wx/demo/GridSimple.py +270 -0
  118. wx/demo/GridStdEdRend.py +186 -0
  119. wx/demo/Grid_MegaExample.py +490 -0
  120. wx/demo/HTML2_WebView.py +183 -0
  121. wx/demo/HtmlWindow.py +232 -0
  122. wx/demo/I18N.py +237 -0
  123. wx/demo/Image.py +338 -0
  124. wx/demo/ImageAlpha.py +87 -0
  125. wx/demo/ImageBrowser.py +70 -0
  126. wx/demo/ImageFromStream.py +49 -0
  127. wx/demo/Img2PyArtProvider.py +99 -0
  128. wx/demo/InfoBar.py +127 -0
  129. wx/demo/IntCtrl.py +343 -0
  130. wx/demo/ItemsPicker.py +108 -0
  131. wx/demo/Joystick.py +1083 -0
  132. wx/demo/KeyEvents.py +428 -0
  133. wx/demo/LEDNumberCtrl.py +121 -0
  134. wx/demo/LayoutAnchors.py +258 -0
  135. wx/demo/LayoutConstraints.py +149 -0
  136. wx/demo/Layoutf.py +69 -0
  137. wx/demo/ListBox.py +164 -0
  138. wx/demo/ListCtrl.py +538 -0
  139. wx/demo/ListCtrl_edit.py +155 -0
  140. wx/demo/ListCtrl_virtual.py +145 -0
  141. wx/demo/Listbook.py +104 -0
  142. wx/demo/MDIDemo.py +86 -0
  143. wx/demo/MDISashDemo.py +152 -0
  144. wx/demo/MDIWindows.py +66 -0
  145. wx/demo/Main.py +2768 -0
  146. wx/demo/Mask.py +137 -0
  147. wx/demo/MaskedEditControls.py +648 -0
  148. wx/demo/MaskedNumCtrl.py +359 -0
  149. wx/demo/MediaCtrl.py +190 -0
  150. wx/demo/Menu.py +322 -0
  151. wx/demo/MessageDialog.py +54 -0
  152. wx/demo/MimeTypesManager.py +354 -0
  153. wx/demo/MiniFrame.py +67 -0
  154. wx/demo/MouseGestures.py +198 -0
  155. wx/demo/MultiChoiceDialog.py +59 -0
  156. wx/demo/MultiSash.py +95 -0
  157. wx/demo/MultiSplitterWindow.py +168 -0
  158. wx/demo/MultipleChoiceDialog.py +101 -0
  159. wx/demo/Notebook.py +134 -0
  160. wx/demo/NotificationMessage.py +61 -0
  161. wx/demo/OGL.py +433 -0
  162. wx/demo/Overlay.py +209 -0
  163. wx/demo/OwnerDrawnComboBox.py +152 -0
  164. wx/demo/PDFViewer.py +109 -0
  165. wx/demo/PageSetupDialog.py +70 -0
  166. wx/demo/PenAndBrushStyles.py +208 -0
  167. wx/demo/Pickers.py +120 -0
  168. wx/demo/PlateButton.py +430 -0
  169. wx/demo/PopupControl.py +99 -0
  170. wx/demo/PopupMenu.py +156 -0
  171. wx/demo/PopupWindow.py +227 -0
  172. wx/demo/PrintDialog.py +60 -0
  173. wx/demo/PrintFramework.py +227 -0
  174. wx/demo/Process.py +168 -0
  175. wx/demo/ProgressDialog.py +87 -0
  176. wx/demo/PropertyGrid.py +1045 -0
  177. wx/demo/PropertySheetDialog.py +231 -0
  178. wx/demo/PseudoDC.py +350 -0
  179. wx/demo/PyColourChooser.py +60 -0
  180. wx/demo/PyCrust.py +21 -0
  181. wx/demo/PyPlot.py +83 -0
  182. wx/demo/PyShell.py +22 -0
  183. wx/demo/PythonEvents.py +109 -0
  184. wx/demo/README.txt +7 -0
  185. wx/demo/RadioBox.py +67 -0
  186. wx/demo/RadioButton.py +127 -0
  187. wx/demo/RawBitmapAccess.py +208 -0
  188. wx/demo/RearrangeDialog.py +160 -0
  189. wx/demo/RendererNative.py +170 -0
  190. wx/demo/ResizeWidget.py +76 -0
  191. wx/demo/RichMessageDialog.py +85 -0
  192. wx/demo/RichTextCtrl.py +732 -0
  193. wx/demo/RichToolTip.py +145 -0
  194. wx/demo/SVGImage_Bitmap.py +130 -0
  195. wx/demo/SVGImage_Render.py +138 -0
  196. wx/demo/SashWindow.py +151 -0
  197. wx/demo/ScrolledMessageDialog.py +52 -0
  198. wx/demo/ScrolledPanel.py +124 -0
  199. wx/demo/ScrolledWindow.py +260 -0
  200. wx/demo/SearchCtrl.py +115 -0
  201. wx/demo/ShapedWindow.py +145 -0
  202. wx/demo/Simplebook.py +202 -0
  203. wx/demo/SingleChoiceDialog.py +56 -0
  204. wx/demo/SizedControls.py +433 -0
  205. wx/demo/Sizers.py +609 -0
  206. wx/demo/Slider.py +52 -0
  207. wx/demo/Sound.py +95 -0
  208. wx/demo/SpinButton.py +63 -0
  209. wx/demo/SpinCtrl.py +56 -0
  210. wx/demo/SpinCtrlDouble.py +42 -0
  211. wx/demo/SplitTree.py +146 -0
  212. wx/demo/SplitterWindow.py +62 -0
  213. wx/demo/StandardPaths.py +113 -0
  214. wx/demo/StaticBitmap.py +55 -0
  215. wx/demo/StaticBox.py +62 -0
  216. wx/demo/StaticText.py +69 -0
  217. wx/demo/StatusBar.py +144 -0
  218. wx/demo/StockButtons.py +113 -0
  219. wx/demo/StyledTextCtrl_1.py +303 -0
  220. wx/demo/StyledTextCtrl_2.py +410 -0
  221. wx/demo/SystemSettings.py +333 -0
  222. wx/demo/TablePrint.py +215 -0
  223. wx/demo/TestTable.txt +38 -0
  224. wx/demo/TextCtrl.py +187 -0
  225. wx/demo/TextEntryDialog.py +57 -0
  226. wx/demo/Threads.py +258 -0
  227. wx/demo/Throbber.py +250 -0
  228. wx/demo/Ticker.py +147 -0
  229. wx/demo/TimeCtrl.py +240 -0
  230. wx/demo/TimePickerCtrl.py +60 -0
  231. wx/demo/Timer.py +275 -0
  232. wx/demo/ToggleButton.py +54 -0
  233. wx/demo/ToolBar.py +249 -0
  234. wx/demo/ToolTip.py +71 -0
  235. wx/demo/Toolbook.py +111 -0
  236. wx/demo/TreeCtrl.py +199 -0
  237. wx/demo/TreeListCtrl.py +121 -0
  238. wx/demo/TreeMixin.py +269 -0
  239. wx/demo/Treebook.py +117 -0
  240. wx/demo/UIActionSimulator.py +151 -0
  241. wx/demo/URLDragAndDrop.py +130 -0
  242. wx/demo/Unicode.py +146 -0
  243. wx/demo/VListBox.py +176 -0
  244. wx/demo/Validator.py +237 -0
  245. wx/demo/Wizard.py +248 -0
  246. wx/demo/WrapSizer.py +115 -0
  247. wx/demo/XmlResource.py +80 -0
  248. wx/demo/XmlResourceHandler.py +199 -0
  249. wx/demo/XmlResourceSubclass.py +119 -0
  250. wx/demo/__init__.py +9 -0
  251. wx/demo/agw/AGWInfoBar.py +175 -0
  252. wx/demo/agw/AUI.py +3058 -0
  253. wx/demo/agw/AdvancedSplash.py +59 -0
  254. wx/demo/agw/AquaButton.py +146 -0
  255. wx/demo/agw/BalloonTip.py +378 -0
  256. wx/demo/agw/ButtonPanel.py +890 -0
  257. wx/demo/agw/CubeColourDialog.py +83 -0
  258. wx/demo/agw/CustomTreeCtrl.py +2167 -0
  259. wx/demo/agw/Example1 +67 -0
  260. wx/demo/agw/Example2 +49 -0
  261. wx/demo/agw/FlatMenu.py +876 -0
  262. wx/demo/agw/FlatNotebook.py +994 -0
  263. wx/demo/agw/FloatSpin.py +475 -0
  264. wx/demo/agw/FoldPanelBar.py +953 -0
  265. wx/demo/agw/FourWaySplitter.py +300 -0
  266. wx/demo/agw/GenericMessageDialog.py +207 -0
  267. wx/demo/agw/GradientButton.py +156 -0
  268. wx/demo/agw/HyperLinkCtrl.py +144 -0
  269. wx/demo/agw/HyperTreeList.py +2660 -0
  270. wx/demo/agw/KnobCtrl.py +186 -0
  271. wx/demo/agw/LabelBook.py +567 -0
  272. wx/demo/agw/MacLargeDemo.py +360 -0
  273. wx/demo/agw/MultiDirDialog.py +117 -0
  274. wx/demo/agw/PeakMeter.py +194 -0
  275. wx/demo/agw/PersistentControls.py +589 -0
  276. wx/demo/agw/PieCtrl.py +206 -0
  277. wx/demo/agw/PyBusyInfo.py +64 -0
  278. wx/demo/agw/PyCollapsiblePane.py +308 -0
  279. wx/demo/agw/PyGauge.py +162 -0
  280. wx/demo/agw/PyProgress.py +155 -0
  281. wx/demo/agw/RibbonBar.py +925 -0
  282. wx/demo/agw/RulerCtrl.py +454 -0
  283. wx/demo/agw/ScrolledThumbnail.py +128 -0
  284. wx/demo/agw/ShapedButton.py +603 -0
  285. wx/demo/agw/ShortcutEditor.py +397 -0
  286. wx/demo/agw/SpeedMeter.py +668 -0
  287. wx/demo/agw/SuperToolTip.py +396 -0
  288. wx/demo/agw/ThumbDemoConfig.py +603 -0
  289. wx/demo/agw/ThumbnailCtrl.py +149 -0
  290. wx/demo/agw/ToasterBox.py +410 -0
  291. wx/demo/agw/UltimateListCtrl.py +80 -0
  292. wx/demo/agw/UltimateListIconDemo.py +908 -0
  293. wx/demo/agw/UltimateListListDemo.py +124 -0
  294. wx/demo/agw/UltimateReportDemo.py +1146 -0
  295. wx/demo/agw/UltimateVirtualDemo.py +207 -0
  296. wx/demo/agw/Windows7Explorer_Contents.py +368 -0
  297. wx/demo/agw/XLSGrid.py +238 -0
  298. wx/demo/agw/ZoomBar.py +230 -0
  299. wx/demo/agw/__demo__.py +183 -0
  300. wx/demo/agw/bitmaps/Explorer96.png +0 -0
  301. wx/demo/agw/bitmaps/Explorer96Flip40.png +0 -0
  302. wx/demo/agw/bitmaps/Folder96.png +0 -0
  303. wx/demo/agw/bitmaps/Folder96Flip40.png +0 -0
  304. wx/demo/agw/bitmaps/Monitor96.png +0 -0
  305. wx/demo/agw/bitmaps/Monitor96Flip40.png +0 -0
  306. wx/demo/agw/bitmaps/Music96.png +0 -0
  307. wx/demo/agw/bitmaps/Music96Flip40.png +0 -0
  308. wx/demo/agw/bitmaps/Photo96.png +0 -0
  309. wx/demo/agw/bitmaps/Photo96Flip40.png +0 -0
  310. wx/demo/agw/bitmaps/Search96.png +0 -0
  311. wx/demo/agw/bitmaps/Search96Flip40.png +0 -0
  312. wx/demo/agw/bitmaps/Wizard96.png +0 -0
  313. wx/demo/agw/bitmaps/Wizard96Flip40.png +0 -0
  314. wx/demo/agw/bitmaps/advancedsplash.png +0 -0
  315. wx/demo/agw/bitmaps/aquabutton.png +0 -0
  316. wx/demo/agw/bitmaps/aquachecked.ico +0 -0
  317. wx/demo/agw/bitmaps/aquaflagged.ico +0 -0
  318. wx/demo/agw/bitmaps/aquanotchecked.ico +0 -0
  319. wx/demo/agw/bitmaps/aquanotflagged.ico +0 -0
  320. wx/demo/agw/bitmaps/canada.gif +0 -0
  321. wx/demo/agw/bitmaps/checked.ico +0 -0
  322. wx/demo/agw/bitmaps/columns.png +0 -0
  323. wx/demo/agw/bitmaps/contexthelp-16.png +0 -0
  324. wx/demo/agw/bitmaps/contexthelp.png +0 -0
  325. wx/demo/agw/bitmaps/copy.png +0 -0
  326. wx/demo/agw/bitmaps/cut.png +0 -0
  327. wx/demo/agw/bitmaps/editcopy.png +0 -0
  328. wx/demo/agw/bitmaps/editcut.png +0 -0
  329. wx/demo/agw/bitmaps/editpaste.png +0 -0
  330. wx/demo/agw/bitmaps/empty_icon.png +0 -0
  331. wx/demo/agw/bitmaps/exit-16.png +0 -0
  332. wx/demo/agw/bitmaps/exit.ico +0 -0
  333. wx/demo/agw/bitmaps/ffwd.png +0 -0
  334. wx/demo/agw/bitmaps/ffwddisabled.png +0 -0
  335. wx/demo/agw/bitmaps/field-16.png +0 -0
  336. wx/demo/agw/bitmaps/filenew.png +0 -0
  337. wx/demo/agw/bitmaps/fileopen.png +0 -0
  338. wx/demo/agw/bitmaps/filesave.png +0 -0
  339. wx/demo/agw/bitmaps/flagged.ico +0 -0
  340. wx/demo/agw/bitmaps/folder.png +0 -0
  341. wx/demo/agw/bitmaps/folder_new.png +0 -0
  342. wx/demo/agw/bitmaps/ghost.png +0 -0
  343. wx/demo/agw/bitmaps/gradientbutton.png +0 -0
  344. wx/demo/agw/bitmaps/help-16.png +0 -0
  345. wx/demo/agw/bitmaps/help.ico +0 -0
  346. wx/demo/agw/bitmaps/italy.gif +0 -0
  347. wx/demo/agw/bitmaps/lbadd.png +0 -0
  348. wx/demo/agw/bitmaps/lbcharge.png +0 -0
  349. wx/demo/agw/bitmaps/lbdecrypted.png +0 -0
  350. wx/demo/agw/bitmaps/lbnews.png +0 -0
  351. wx/demo/agw/bitmaps/lbroll.png +0 -0
  352. wx/demo/agw/bitmaps/minus1.ico +0 -0
  353. wx/demo/agw/bitmaps/minus2.ico +0 -0
  354. wx/demo/agw/bitmaps/minus3.ico +0 -0
  355. wx/demo/agw/bitmaps/minus4.ico +0 -0
  356. wx/demo/agw/bitmaps/minus5.ico +0 -0
  357. wx/demo/agw/bitmaps/month-16.png +0 -0
  358. wx/demo/agw/bitmaps/new_file.png +0 -0
  359. wx/demo/agw/bitmaps/new_folder.png +0 -0
  360. wx/demo/agw/bitmaps/notchecked.ico +0 -0
  361. wx/demo/agw/bitmaps/notflagged.ico +0 -0
  362. wx/demo/agw/bitmaps/ok-16.png +0 -0
  363. wx/demo/agw/bitmaps/open_folder.png +0 -0
  364. wx/demo/agw/bitmaps/paste.png +0 -0
  365. wx/demo/agw/bitmaps/pause.png +0 -0
  366. wx/demo/agw/bitmaps/pausedisabled.png +0 -0
  367. wx/demo/agw/bitmaps/play.png +0 -0
  368. wx/demo/agw/bitmaps/playdisabled.png +0 -0
  369. wx/demo/agw/bitmaps/plus1.ico +0 -0
  370. wx/demo/agw/bitmaps/plus2.ico +0 -0
  371. wx/demo/agw/bitmaps/plus3.ico +0 -0
  372. wx/demo/agw/bitmaps/plus4.ico +0 -0
  373. wx/demo/agw/bitmaps/plus5.ico +0 -0
  374. wx/demo/agw/bitmaps/record.png +0 -0
  375. wx/demo/agw/bitmaps/recorddisabled.png +0 -0
  376. wx/demo/agw/bitmaps/recording.gif +0 -0
  377. wx/demo/agw/bitmaps/rewind.png +0 -0
  378. wx/demo/agw/bitmaps/rewinddisabled.png +0 -0
  379. wx/demo/agw/bitmaps/round.png +0 -0
  380. wx/demo/agw/bitmaps/save.png +0 -0
  381. wx/demo/agw/bitmaps/separator.gif +0 -0
  382. wx/demo/agw/bitmaps/separatorflip.png +0 -0
  383. wx/demo/agw/bitmaps/smfuel.ico +0 -0
  384. wx/demo/agw/bitmaps/smpi.ico +0 -0
  385. wx/demo/agw/bitmaps/smtemp.ico +0 -0
  386. wx/demo/agw/bitmaps/stop.png +0 -0
  387. wx/demo/agw/bitmaps/stopdisabled.png +0 -0
  388. wx/demo/agw/bitmaps/sttbutton.png +0 -0
  389. wx/demo/agw/bitmaps/sttfont.png +0 -0
  390. wx/demo/agw/bitmaps/sttheader.png +0 -0
  391. wx/demo/agw/bitmaps/stthelp.png +0 -0
  392. wx/demo/agw/bitmaps/view1.png +0 -0
  393. wx/demo/agw/bitmaps/view2.png +0 -0
  394. wx/demo/agw/bitmaps/view_choose.png +0 -0
  395. wx/demo/agw/bitmaps/view_detailed.png +0 -0
  396. wx/demo/agw/bitmaps/view_icon.png +0 -0
  397. wx/demo/agw/bitmaps/view_multicolumn.png +0 -0
  398. wx/demo/agw/bitmaps/viewmag-16.png +0 -0
  399. wx/demo/agw/bitmaps/viewmag-m-16.png +0 -0
  400. wx/demo/agw/bitmaps/viewmag-p-16.png +0 -0
  401. wx/demo/agw/bitmaps/viewmagfit-16.png +0 -0
  402. wx/demo/agw/data/Example_1.xls +0 -0
  403. wx/demo/agw/images.py +6714 -0
  404. wx/demo/bitmaps/AG00028_.gif +0 -0
  405. wx/demo/bitmaps/AG00039_.gif +0 -0
  406. wx/demo/bitmaps/AG00178_.gif +0 -0
  407. wx/demo/bitmaps/AG00183_.gif +0 -0
  408. wx/demo/bitmaps/AG00185_.gif +0 -0
  409. wx/demo/bitmaps/BD13656_.gif +0 -0
  410. wx/demo/bitmaps/advancedsplash.png +0 -0
  411. wx/demo/bitmaps/aquabutton.png +0 -0
  412. wx/demo/bitmaps/aquachecked.ico +0 -0
  413. wx/demo/bitmaps/aquaflagged.ico +0 -0
  414. wx/demo/bitmaps/aquanotchecked.ico +0 -0
  415. wx/demo/bitmaps/aquanotflagged.ico +0 -0
  416. wx/demo/bitmaps/canada.gif +0 -0
  417. wx/demo/bitmaps/checked.ico +0 -0
  418. wx/demo/bitmaps/columns.png +0 -0
  419. wx/demo/bitmaps/contexthelp-16.png +0 -0
  420. wx/demo/bitmaps/contexthelp.png +0 -0
  421. wx/demo/bitmaps/copy.png +0 -0
  422. wx/demo/bitmaps/cropshot24x20.png +0 -0
  423. wx/demo/bitmaps/cut.png +0 -0
  424. wx/demo/bitmaps/editcopy.png +0 -0
  425. wx/demo/bitmaps/editcut.png +0 -0
  426. wx/demo/bitmaps/editpaste.png +0 -0
  427. wx/demo/bitmaps/exit-16.png +0 -0
  428. wx/demo/bitmaps/exit.ico +0 -0
  429. wx/demo/bitmaps/ffwd.png +0 -0
  430. wx/demo/bitmaps/ffwddisabled.png +0 -0
  431. wx/demo/bitmaps/field-16.png +0 -0
  432. wx/demo/bitmaps/filenew.png +0 -0
  433. wx/demo/bitmaps/fileopen.png +0 -0
  434. wx/demo/bitmaps/filesave.png +0 -0
  435. wx/demo/bitmaps/flagged.ico +0 -0
  436. wx/demo/bitmaps/folder_new.png +0 -0
  437. wx/demo/bitmaps/ghost.png +0 -0
  438. wx/demo/bitmaps/gradientbutton.png +0 -0
  439. wx/demo/bitmaps/help-16.png +0 -0
  440. wx/demo/bitmaps/help.ico +0 -0
  441. wx/demo/bitmaps/honeycomb300.png +0 -0
  442. wx/demo/bitmaps/image.bmp +0 -0
  443. wx/demo/bitmaps/image.gif +0 -0
  444. wx/demo/bitmaps/image.ico +0 -0
  445. wx/demo/bitmaps/image.jpg +0 -0
  446. wx/demo/bitmaps/image.png +0 -0
  447. wx/demo/bitmaps/image.tif +0 -0
  448. wx/demo/bitmaps/italy.gif +0 -0
  449. wx/demo/bitmaps/lbadd.png +0 -0
  450. wx/demo/bitmaps/lbcharge.png +0 -0
  451. wx/demo/bitmaps/lbdecrypted.png +0 -0
  452. wx/demo/bitmaps/lbnews.png +0 -0
  453. wx/demo/bitmaps/lbroll.png +0 -0
  454. wx/demo/bitmaps/minus1.ico +0 -0
  455. wx/demo/bitmaps/minus2.ico +0 -0
  456. wx/demo/bitmaps/minus3.ico +0 -0
  457. wx/demo/bitmaps/minus4.ico +0 -0
  458. wx/demo/bitmaps/minus5.ico +0 -0
  459. wx/demo/bitmaps/month-16.png +0 -0
  460. wx/demo/bitmaps/new_file.png +0 -0
  461. wx/demo/bitmaps/new_folder.png +0 -0
  462. wx/demo/bitmaps/notchecked.ico +0 -0
  463. wx/demo/bitmaps/notflagged.ico +0 -0
  464. wx/demo/bitmaps/ok-16.png +0 -0
  465. wx/demo/bitmaps/open_folder.png +0 -0
  466. wx/demo/bitmaps/paste.png +0 -0
  467. wx/demo/bitmaps/pause.png +0 -0
  468. wx/demo/bitmaps/pausedisabled.png +0 -0
  469. wx/demo/bitmaps/phoenix_title.png +0 -0
  470. wx/demo/bitmaps/phoenix_top.png +0 -0
  471. wx/demo/bitmaps/play.png +0 -0
  472. wx/demo/bitmaps/playdisabled.png +0 -0
  473. wx/demo/bitmaps/plus1.ico +0 -0
  474. wx/demo/bitmaps/plus2.ico +0 -0
  475. wx/demo/bitmaps/plus3.ico +0 -0
  476. wx/demo/bitmaps/plus4.ico +0 -0
  477. wx/demo/bitmaps/plus5.ico +0 -0
  478. wx/demo/bitmaps/record.png +0 -0
  479. wx/demo/bitmaps/recorddisabled.png +0 -0
  480. wx/demo/bitmaps/rewind.png +0 -0
  481. wx/demo/bitmaps/rewinddisabled.png +0 -0
  482. wx/demo/bitmaps/round.png +0 -0
  483. wx/demo/bitmaps/save.png +0 -0
  484. wx/demo/bitmaps/smfuel.ico +0 -0
  485. wx/demo/bitmaps/smpi.ico +0 -0
  486. wx/demo/bitmaps/smtemp.ico +0 -0
  487. wx/demo/bitmaps/snakey_render.png +0 -0
  488. wx/demo/bitmaps/splash.png +0 -0
  489. wx/demo/bitmaps/stop.png +0 -0
  490. wx/demo/bitmaps/stopdisabled.png +0 -0
  491. wx/demo/bitmaps/sttbutton.png +0 -0
  492. wx/demo/bitmaps/sttfont.png +0 -0
  493. wx/demo/bitmaps/sttheader.png +0 -0
  494. wx/demo/bitmaps/stthelp.png +0 -0
  495. wx/demo/bitmaps/toucan.png +0 -0
  496. wx/demo/bitmaps/view1.png +0 -0
  497. wx/demo/bitmaps/view2.png +0 -0
  498. wx/demo/bitmaps/view_choose.png +0 -0
  499. wx/demo/bitmaps/view_detailed.png +0 -0
  500. wx/demo/bitmaps/view_icon.png +0 -0
  501. wx/demo/bitmaps/view_multicolumn.png +0 -0
  502. wx/demo/bitmaps/viewmag-16.png +0 -0
  503. wx/demo/bitmaps/viewmag-m-16.png +0 -0
  504. wx/demo/bitmaps/viewmag-p-16.png +0 -0
  505. wx/demo/bitmaps/viewmagfit-16.png +0 -0
  506. wx/demo/bmp_source/001.png +0 -0
  507. wx/demo/bmp_source/002.png +0 -0
  508. wx/demo/bmp_source/003.png +0 -0
  509. wx/demo/bmp_source/004.png +0 -0
  510. wx/demo/bmp_source/005.png +0 -0
  511. wx/demo/bmp_source/006.png +0 -0
  512. wx/demo/bmp_source/007.png +0 -0
  513. wx/demo/bmp_source/008.png +0 -0
  514. wx/demo/bmp_source/009.png +0 -0
  515. wx/demo/bmp_source/010.png +0 -0
  516. wx/demo/bmp_source/011.png +0 -0
  517. wx/demo/bmp_source/012.png +0 -0
  518. wx/demo/bmp_source/013.png +0 -0
  519. wx/demo/bmp_source/014.png +0 -0
  520. wx/demo/bmp_source/015.png +0 -0
  521. wx/demo/bmp_source/016.png +0 -0
  522. wx/demo/bmp_source/017.png +0 -0
  523. wx/demo/bmp_source/018.png +0 -0
  524. wx/demo/bmp_source/019.png +0 -0
  525. wx/demo/bmp_source/020.png +0 -0
  526. wx/demo/bmp_source/021.png +0 -0
  527. wx/demo/bmp_source/022.png +0 -0
  528. wx/demo/bmp_source/023.png +0 -0
  529. wx/demo/bmp_source/024.png +0 -0
  530. wx/demo/bmp_source/025.png +0 -0
  531. wx/demo/bmp_source/026.png +0 -0
  532. wx/demo/bmp_source/027.png +0 -0
  533. wx/demo/bmp_source/028.png +0 -0
  534. wx/demo/bmp_source/029.png +0 -0
  535. wx/demo/bmp_source/030.png +0 -0
  536. wx/demo/bmp_source/DbDec.bmp +0 -0
  537. wx/demo/bmp_source/DbInc.bmp +0 -0
  538. wx/demo/bmp_source/Dec.bmp +0 -0
  539. wx/demo/bmp_source/FRM_0.png +0 -0
  540. wx/demo/bmp_source/FRM_1.png +0 -0
  541. wx/demo/bmp_source/FRM_2.png +0 -0
  542. wx/demo/bmp_source/FRM_3.png +0 -0
  543. wx/demo/bmp_source/FRM_4.png +0 -0
  544. wx/demo/bmp_source/FRM_5.png +0 -0
  545. wx/demo/bmp_source/FRM_6.png +0 -0
  546. wx/demo/bmp_source/FRM_7.png +0 -0
  547. wx/demo/bmp_source/FRM_8.png +0 -0
  548. wx/demo/bmp_source/GridBG.gif +0 -0
  549. wx/demo/bmp_source/Inc.bmp +0 -0
  550. wx/demo/bmp_source/LB01.png +0 -0
  551. wx/demo/bmp_source/LB02.png +0 -0
  552. wx/demo/bmp_source/LB03.png +0 -0
  553. wx/demo/bmp_source/LB04.png +0 -0
  554. wx/demo/bmp_source/LB05.png +0 -0
  555. wx/demo/bmp_source/LB06.png +0 -0
  556. wx/demo/bmp_source/LB07.png +0 -0
  557. wx/demo/bmp_source/LB08.png +0 -0
  558. wx/demo/bmp_source/LB09.png +0 -0
  559. wx/demo/bmp_source/LB10.png +0 -0
  560. wx/demo/bmp_source/LB11.png +0 -0
  561. wx/demo/bmp_source/LB12.png +0 -0
  562. wx/demo/bmp_source/Pt.bmp +0 -0
  563. wx/demo/bmp_source/Vippi.png +0 -0
  564. wx/demo/bmp_source/backgrnd.png +0 -0
  565. wx/demo/bmp_source/book.png +0 -0
  566. wx/demo/bmp_source/book_blue.png +0 -0
  567. wx/demo/bmp_source/book_green.png +0 -0
  568. wx/demo/bmp_source/book_red.png +0 -0
  569. wx/demo/bmp_source/bp_btn1.png +0 -0
  570. wx/demo/bmp_source/bp_btn2.png +0 -0
  571. wx/demo/bmp_source/bp_btn3.png +0 -0
  572. wx/demo/bmp_source/bp_btn4.png +0 -0
  573. wx/demo/bmp_source/bulb1.bmp +0 -0
  574. wx/demo/bmp_source/bulb2.bmp +0 -0
  575. wx/demo/bmp_source/carrot.png +0 -0
  576. wx/demo/bmp_source/clipboard.png +0 -0
  577. wx/demo/bmp_source/code.png +0 -0
  578. wx/demo/bmp_source/core.png +0 -0
  579. wx/demo/bmp_source/custom.png +0 -0
  580. wx/demo/bmp_source/customcontrol.png +0 -0
  581. wx/demo/bmp_source/deletedocs.png +0 -0
  582. wx/demo/bmp_source/deleteperspective.png +0 -0
  583. wx/demo/bmp_source/demo.png +0 -0
  584. wx/demo/bmp_source/dialog.png +0 -0
  585. wx/demo/bmp_source/exit.png +0 -0
  586. wx/demo/bmp_source/expansion.png +0 -0
  587. wx/demo/bmp_source/find.png +0 -0
  588. wx/demo/bmp_source/findnext.png +0 -0
  589. wx/demo/bmp_source/floatcanvas.png +0 -0
  590. wx/demo/bmp_source/frame.png +0 -0
  591. wx/demo/bmp_source/images.png +0 -0
  592. wx/demo/bmp_source/inspect.png +0 -0
  593. wx/demo/bmp_source/layout.png +0 -0
  594. wx/demo/bmp_source/logo.png +0 -0
  595. wx/demo/bmp_source/miscellaneous.png +0 -0
  596. wx/demo/bmp_source/modifiedexists.png +0 -0
  597. wx/demo/bmp_source/mondrian.ico +0 -0
  598. wx/demo/bmp_source/morecontrols.png +0 -0
  599. wx/demo/bmp_source/moredialog.png +0 -0
  600. wx/demo/bmp_source/noicon.png +0 -0
  601. wx/demo/bmp_source/overview.png +0 -0
  602. wx/demo/bmp_source/pencil.png +0 -0
  603. wx/demo/bmp_source/pointy.png +0 -0
  604. wx/demo/bmp_source/process.png +0 -0
  605. wx/demo/bmp_source/pyshell.png +0 -0
  606. wx/demo/bmp_source/recent.png +0 -0
  607. wx/demo/bmp_source/rest.png +0 -0
  608. wx/demo/bmp_source/robin.jpg +0 -0
  609. wx/demo/bmp_source/rt_alignleft.xpm +24 -0
  610. wx/demo/bmp_source/rt_alignright.xpm +24 -0
  611. wx/demo/bmp_source/rt_bold.xpm +24 -0
  612. wx/demo/bmp_source/rt_centre.xpm +24 -0
  613. wx/demo/bmp_source/rt_colour.xpm +59 -0
  614. wx/demo/bmp_source/rt_copy.xpm +44 -0
  615. wx/demo/bmp_source/rt_cut.xpm +46 -0
  616. wx/demo/bmp_source/rt_font.xpm +25 -0
  617. wx/demo/bmp_source/rt_idea.xpm +47 -0
  618. wx/demo/bmp_source/rt_indentless.xpm +25 -0
  619. wx/demo/bmp_source/rt_indentmore.xpm +25 -0
  620. wx/demo/bmp_source/rt_italic.xpm +25 -0
  621. wx/demo/bmp_source/rt_open.xpm +57 -0
  622. wx/demo/bmp_source/rt_paste.xpm +46 -0
  623. wx/demo/bmp_source/rt_redo.xpm +58 -0
  624. wx/demo/bmp_source/rt_sample.xpm +44 -0
  625. wx/demo/bmp_source/rt_save.xpm +42 -0
  626. wx/demo/bmp_source/rt_smiley.xpm +42 -0
  627. wx/demo/bmp_source/rt_underline.xpm +25 -0
  628. wx/demo/bmp_source/rt_undo.xpm +58 -0
  629. wx/demo/bmp_source/rt_zebra.xpm +409 -0
  630. wx/demo/bmp_source/saveperspective.png +0 -0
  631. wx/demo/bmp_source/sm_down.bmp +0 -0
  632. wx/demo/bmp_source/sm_up.bmp +0 -0
  633. wx/demo/bmp_source/smiles2.bmp +0 -0
  634. wx/demo/bmp_source/test2.bmp +0 -0
  635. wx/demo/bmp_source/testmask.bmp +0 -0
  636. wx/demo/bmp_source/teststar.png +0 -0
  637. wx/demo/bmp_source/thekid.png +0 -0
  638. wx/demo/bmp_source/tog1.bmp +0 -0
  639. wx/demo/bmp_source/tog2.bmp +0 -0
  640. wx/demo/bmp_source/wiztest1.bmp +0 -0
  641. wx/demo/bmp_source/wiztest2.bmp +0 -0
  642. wx/demo/bmp_source/wxpdemo.ico +0 -0
  643. wx/demo/cursors/paperairplane_arrow_blue.cur +0 -0
  644. wx/demo/cursors/paperairplane_arrow_blue_fadeout80.cur +0 -0
  645. wx/demo/cursors/paperairplane_arrow_colorshift.ani +0 -0
  646. wx/demo/cursors/paperairplane_arrow_dark.cur +0 -0
  647. wx/demo/cursors/paperairplane_arrow_grey.cur +0 -0
  648. wx/demo/cursors/paperairplane_arrow_red.cur +0 -0
  649. wx/demo/cursors/paperairplane_arrow_white.cur +0 -0
  650. wx/demo/cursors/paperairplane_arrow_white24.png +0 -0
  651. wx/demo/data/0-tiger.svg +725 -0
  652. wx/demo/data/Asteroid_blaster.swf +0 -0
  653. wx/demo/data/SIL_OPEN_FONT_LICENSE.txt +97 -0
  654. wx/demo/data/SourceCodePro-Regular.ttf +0 -0
  655. wx/demo/data/accessories-calculator.svg +636 -0
  656. wx/demo/data/accessories-text-editor.svg +554 -0
  657. wx/demo/data/anykey.wav +0 -0
  658. wx/demo/data/applications-internet.svg +623 -0
  659. wx/demo/data/desktop-accessibility.svg +245 -0
  660. wx/demo/data/desktop-keyboard-shortcuts.svg +839 -0
  661. wx/demo/data/desktop-locale.svg +878 -0
  662. wx/demo/data/desktop-remote-desktop.svg +1479 -0
  663. wx/demo/data/desktop-theme.svg +882 -0
  664. wx/demo/data/desktop-wallpaper.svg +747 -0
  665. wx/demo/data/echo.py +25 -0
  666. wx/demo/data/imagemap.htm +20 -0
  667. wx/demo/data/imagemap.png +0 -0
  668. wx/demo/data/internet-group-chat.svg +312 -0
  669. wx/demo/data/internet-mail.svg +440 -0
  670. wx/demo/data/locale/af/LC_MESSAGES/wxpydemo.mo +0 -0
  671. wx/demo/data/locale/de/LC_MESSAGES/wxpydemo.mo +0 -0
  672. wx/demo/data/locale/es/LC_MESSAGES/wxpydemo.mo +0 -0
  673. wx/demo/data/locale/fr/LC_MESSAGES/wxpydemo.mo +0 -0
  674. wx/demo/data/locale/it/LC_MESSAGES/wxpydemo.mo +0 -0
  675. wx/demo/data/locale-src/af.po +23 -0
  676. wx/demo/data/locale-src/de.po +23 -0
  677. wx/demo/data/locale-src/es.po +22 -0
  678. wx/demo/data/locale-src/fr.po +22 -0
  679. wx/demo/data/locale-src/install +15 -0
  680. wx/demo/data/locale-src/it.po +23 -0
  681. wx/demo/data/locale-src/wxpydemo.po +21 -0
  682. wx/demo/data/office-calendar.svg +316 -0
  683. wx/demo/data/pic.png +0 -0
  684. wx/demo/data/pic2.bmp +0 -0
  685. wx/demo/data/plan.wav +0 -0
  686. wx/demo/data/proclamation.txt +115 -0
  687. wx/demo/data/resource.wdr +0 -0
  688. wx/demo/data/resource_wdr.xrc +146 -0
  689. wx/demo/data/romedalen.png +0 -0
  690. wx/demo/data/stc.h.html +3544 -0
  691. wx/demo/data/system-session.svg +510 -0
  692. wx/demo/data/system-users.svg +539 -0
  693. wx/demo/data/tables.htm +116 -0
  694. wx/demo/data/test-gradient-pen.svg +14 -0
  695. wx/demo/data/test-opacity.svg +7 -0
  696. wx/demo/data/test.htm +253 -0
  697. wx/demo/data/testmovie.mpg +0 -0
  698. wx/demo/data/testtable.txt +38 -0
  699. wx/demo/data/tips.txt +73 -0
  700. wx/demo/data/utilities-system-monitor.svg +435 -0
  701. wx/demo/data/utilities-terminal.svg +500 -0
  702. wx/demo/data/widgetTest.htm +70 -0
  703. wx/demo/data/world.dat +24055 -0
  704. wx/demo/demo.py +4 -0
  705. wx/demo/demo.pyw +4 -0
  706. wx/demo/demodata.py +310 -0
  707. wx/demo/encode_bitmaps.py +181 -0
  708. wx/demo/images.py +6812 -0
  709. wx/demo/infoframe.py +149 -0
  710. wx/demo/run.py +171 -0
  711. wx/demo/snippets/__init__.py +13 -0
  712. wx/demo/snippets/arc.py +21 -0
  713. wx/demo/snippets/arc_negative.py +21 -0
  714. wx/demo/snippets/clip.py +13 -0
  715. wx/demo/snippets/clip_image.py +13 -0
  716. wx/demo/snippets/curve_rectangle.py +53 -0
  717. wx/demo/snippets/curve_to.py +17 -0
  718. wx/demo/snippets/dash.py +18 -0
  719. wx/demo/snippets/ellipse.py +33 -0
  720. wx/demo/snippets/fill_and_stroke.py +12 -0
  721. wx/demo/snippets/fill_and_stroke2.py +18 -0
  722. wx/demo/snippets/fill_style.py +31 -0
  723. wx/demo/snippets/glyph_path.py +21 -0
  724. wx/demo/snippets/gradient.py +16 -0
  725. wx/demo/snippets/gradient_mask.py +12 -0
  726. wx/demo/snippets/group.py +16 -0
  727. wx/demo/snippets/image.py +14 -0
  728. wx/demo/snippets/imagepattern.py +23 -0
  729. wx/demo/snippets/path.py +7 -0
  730. wx/demo/snippets/set_line_cap.py +19 -0
  731. wx/demo/snippets/set_line_join.py +21 -0
  732. wx/demo/snippets/show_glyphs.py +15 -0
  733. wx/demo/snippets/text.py +22 -0
  734. wx/demo/snippets/text_align_center.py +26 -0
  735. wx/demo/snippets/text_extents.py +27 -0
  736. wx/demo/template.py +36 -0
  737. wx/demo/throbImages.py +1277 -0
  738. wx/demo/version.py +3 -0
  739. wx/demo/widgetTest.py +72 -0
  740. wx/demo/wxpdemo.ico +0 -0
  741. wx/glcanvas.py +10 -0
  742. wx/glcanvas.pyi +458 -0
  743. wx/grid.py +229 -0
  744. wx/grid.pyi +4959 -0
  745. wx/html.py +35 -0
  746. wx/html.pyi +2965 -0
  747. wx/html2.py +40 -0
  748. wx/html2.pyi +772 -0
  749. wx/lib/CDate.py +202 -0
  750. wx/lib/ClickableHtmlWindow.py +57 -0
  751. wx/lib/__init__.py +0 -0
  752. wx/lib/activex.py +178 -0
  753. wx/lib/activexwrapper.py +153 -0
  754. wx/lib/agw/__init__.py +128 -0
  755. wx/lib/agw/advancedsplash.py +564 -0
  756. wx/lib/agw/aquabutton.py +1127 -0
  757. wx/lib/agw/artmanager.py +2110 -0
  758. wx/lib/agw/aui/__init__.py +295 -0
  759. wx/lib/agw/aui/aui_constants.py +2628 -0
  760. wx/lib/agw/aui/aui_switcherdialog.py +1227 -0
  761. wx/lib/agw/aui/aui_utilities.py +672 -0
  762. wx/lib/agw/aui/auibar.py +4031 -0
  763. wx/lib/agw/aui/auibook.py +6289 -0
  764. wx/lib/agw/aui/dockart.py +1198 -0
  765. wx/lib/agw/aui/framemanager.py +10409 -0
  766. wx/lib/agw/aui/tabart.py +2771 -0
  767. wx/lib/agw/aui/tabmdi.py +679 -0
  768. wx/lib/agw/balloontip.py +1158 -0
  769. wx/lib/agw/buttonpanel.py +2823 -0
  770. wx/lib/agw/cubecolourdialog.py +3529 -0
  771. wx/lib/agw/customtreectrl.py +8963 -0
  772. wx/lib/agw/data/ShortcutEditor_1.png +0 -0
  773. wx/lib/agw/data/ShortcutEditor_1_thumb.png +0 -0
  774. wx/lib/agw/data/ShortcutEditor_2.png +0 -0
  775. wx/lib/agw/data/ShortcutEditor_2_thumb.png +0 -0
  776. wx/lib/agw/data/ShortcutEditor_3.png +0 -0
  777. wx/lib/agw/data/ShortcutEditor_3_thumb.png +0 -0
  778. wx/lib/agw/data/ShortcutEditor_4.png +0 -0
  779. wx/lib/agw/data/ShortcutEditor_4_thumb.png +0 -0
  780. wx/lib/agw/data/default_help_text.html +105 -0
  781. wx/lib/agw/flatmenu.py +7333 -0
  782. wx/lib/agw/flatnotebook.py +6672 -0
  783. wx/lib/agw/floatspin.py +1823 -0
  784. wx/lib/agw/fmcustomizedlg.py +540 -0
  785. wx/lib/agw/fmresources.py +407 -0
  786. wx/lib/agw/foldpanelbar.py +2282 -0
  787. wx/lib/agw/fourwaysplitter.py +1130 -0
  788. wx/lib/agw/genericmessagedialog.py +1549 -0
  789. wx/lib/agw/gradientbutton.py +732 -0
  790. wx/lib/agw/hyperlink.py +664 -0
  791. wx/lib/agw/hypertreelist.py +5374 -0
  792. wx/lib/agw/infobar.py +885 -0
  793. wx/lib/agw/knobctrl.py +945 -0
  794. wx/lib/agw/labelbook.py +3029 -0
  795. wx/lib/agw/multidirdialog.py +615 -0
  796. wx/lib/agw/peakmeter.py +1029 -0
  797. wx/lib/agw/persist/__init__.py +188 -0
  798. wx/lib/agw/persist/persist_constants.py +284 -0
  799. wx/lib/agw/persist/persist_handlers.py +2614 -0
  800. wx/lib/agw/persist/persistencemanager.py +864 -0
  801. wx/lib/agw/piectrl.py +1082 -0
  802. wx/lib/agw/pybusyinfo.py +399 -0
  803. wx/lib/agw/pycollapsiblepane.py +940 -0
  804. wx/lib/agw/pygauge.py +570 -0
  805. wx/lib/agw/pyprogress.py +917 -0
  806. wx/lib/agw/ribbon/__init__.py +198 -0
  807. wx/lib/agw/ribbon/art.py +219 -0
  808. wx/lib/agw/ribbon/art_aui.py +1284 -0
  809. wx/lib/agw/ribbon/art_default.py +81 -0
  810. wx/lib/agw/ribbon/art_internal.py +244 -0
  811. wx/lib/agw/ribbon/art_msw.py +2736 -0
  812. wx/lib/agw/ribbon/art_osx.py +52 -0
  813. wx/lib/agw/ribbon/bar.py +1261 -0
  814. wx/lib/agw/ribbon/buttonbar.py +1320 -0
  815. wx/lib/agw/ribbon/control.py +205 -0
  816. wx/lib/agw/ribbon/gallery.py +974 -0
  817. wx/lib/agw/ribbon/page.py +946 -0
  818. wx/lib/agw/ribbon/panel.py +1170 -0
  819. wx/lib/agw/ribbon/toolbar.py +1442 -0
  820. wx/lib/agw/rulerctrl.py +1887 -0
  821. wx/lib/agw/scrolledthumbnail.py +2119 -0
  822. wx/lib/agw/shapedbutton.py +1809 -0
  823. wx/lib/agw/shortcuteditor.py +2634 -0
  824. wx/lib/agw/speedmeter.py +1801 -0
  825. wx/lib/agw/supertooltip.py +1444 -0
  826. wx/lib/agw/thumbnailctrl.py +529 -0
  827. wx/lib/agw/toasterbox.py +1327 -0
  828. wx/lib/agw/ultimatelistctrl.py +13666 -0
  829. wx/lib/agw/xlsgrid.py +2113 -0
  830. wx/lib/agw/zoombar.py +1339 -0
  831. wx/lib/analogclock/__init__.py +140 -0
  832. wx/lib/analogclock/analogclock.py +631 -0
  833. wx/lib/analogclock/helpers.py +991 -0
  834. wx/lib/analogclock/lib_setup/__init__.py +0 -0
  835. wx/lib/analogclock/lib_setup/buttontreectrlpanel.py +297 -0
  836. wx/lib/analogclock/lib_setup/fontselect.py +57 -0
  837. wx/lib/analogclock/setup.py +490 -0
  838. wx/lib/analogclock/styles.py +47 -0
  839. wx/lib/anchors.py +103 -0
  840. wx/lib/art/__init__.py +4 -0
  841. wx/lib/art/flagart.py +1583 -0
  842. wx/lib/art/img2pyartprov.py +56 -0
  843. wx/lib/busy.py +146 -0
  844. wx/lib/buttons.py +1141 -0
  845. wx/lib/calendar.py +1597 -0
  846. wx/lib/checkbox.py +837 -0
  847. wx/lib/colourchooser/__init__.py +38 -0
  848. wx/lib/colourchooser/canvas.py +145 -0
  849. wx/lib/colourchooser/intl.py +24 -0
  850. wx/lib/colourchooser/pycolourbox.py +89 -0
  851. wx/lib/colourchooser/pycolourchooser.py +629 -0
  852. wx/lib/colourchooser/pycolourslider.py +100 -0
  853. wx/lib/colourchooser/pypalette.py +211 -0
  854. wx/lib/colourdb.py +740 -0
  855. wx/lib/colourselect.py +385 -0
  856. wx/lib/colourutils.py +118 -0
  857. wx/lib/combotreebox.py +944 -0
  858. wx/lib/delayedresult.py +420 -0
  859. wx/lib/dialogs.py +510 -0
  860. wx/lib/docview.py +3210 -0
  861. wx/lib/dragscroller.py +79 -0
  862. wx/lib/editor/README.txt +77 -0
  863. wx/lib/editor/__init__.py +24 -0
  864. wx/lib/editor/editor.py +974 -0
  865. wx/lib/editor/images.py +15 -0
  866. wx/lib/editor/selection.py +44 -0
  867. wx/lib/embeddedimage.py +76 -0
  868. wx/lib/eventStack.py +136 -0
  869. wx/lib/eventwatcher.py +440 -0
  870. wx/lib/evtmgr.py +521 -0
  871. wx/lib/expando.py +393 -0
  872. wx/lib/fancytext.py +505 -0
  873. wx/lib/filebrowsebutton.py +459 -0
  874. wx/lib/flashwin.py +262 -0
  875. wx/lib/flashwin_old.py +651 -0
  876. wx/lib/floatcanvas/FCEvents.py +53 -0
  877. wx/lib/floatcanvas/FCObjects.py +2923 -0
  878. wx/lib/floatcanvas/FloatCanvas.py +1027 -0
  879. wx/lib/floatcanvas/GUIMode.py +396 -0
  880. wx/lib/floatcanvas/NavCanvas.py +161 -0
  881. wx/lib/floatcanvas/Resources.py +319 -0
  882. wx/lib/floatcanvas/ScreenShot.py +1788 -0
  883. wx/lib/floatcanvas/Utilities/BBox.py +314 -0
  884. wx/lib/floatcanvas/Utilities/Colors.py +137 -0
  885. wx/lib/floatcanvas/Utilities/GUI.py +91 -0
  886. wx/lib/floatcanvas/Utilities/__init__.py +7 -0
  887. wx/lib/floatcanvas/__init__.py +124 -0
  888. wx/lib/foldmenu.py +89 -0
  889. wx/lib/gestures.py +310 -0
  890. wx/lib/gizmos/__init__.py +18 -0
  891. wx/lib/gizmos/dynamicsash.py +1202 -0
  892. wx/lib/gizmos/ledctrl.py +300 -0
  893. wx/lib/gizmos/treelistctrl.py +87 -0
  894. wx/lib/graphics.py +1939 -0
  895. wx/lib/gridmovers.py +511 -0
  896. wx/lib/iewin.py +249 -0
  897. wx/lib/iewin_old.py +894 -0
  898. wx/lib/imagebrowser.py +856 -0
  899. wx/lib/imageutils.py +163 -0
  900. wx/lib/infoframe.py +490 -0
  901. wx/lib/inspection.py +1255 -0
  902. wx/lib/intctrl.py +1001 -0
  903. wx/lib/itemspicker.py +256 -0
  904. wx/lib/langlistctrl.py +480 -0
  905. wx/lib/layoutf.py +271 -0
  906. wx/lib/masked/__init__.py +27 -0
  907. wx/lib/masked/combobox.py +839 -0
  908. wx/lib/masked/ctrl.py +108 -0
  909. wx/lib/masked/ipaddrctrl.py +242 -0
  910. wx/lib/masked/maskededit.py +7279 -0
  911. wx/lib/masked/numctrl.py +2001 -0
  912. wx/lib/masked/textctrl.py +465 -0
  913. wx/lib/masked/timectrl.py +1466 -0
  914. wx/lib/mixins/__init__.py +17 -0
  915. wx/lib/mixins/grid.py +47 -0
  916. wx/lib/mixins/gridlabelrenderer.py +251 -0
  917. wx/lib/mixins/imagelist.py +77 -0
  918. wx/lib/mixins/inspection.py +184 -0
  919. wx/lib/mixins/listctrl.py +894 -0
  920. wx/lib/mixins/rubberband.py +404 -0
  921. wx/lib/mixins/treemixin.py +678 -0
  922. wx/lib/msgpanel.py +95 -0
  923. wx/lib/multisash.py +747 -0
  924. wx/lib/myole4ax.idl +178 -0
  925. wx/lib/myole4ax.tlb +0 -0
  926. wx/lib/newevent.py +229 -0
  927. wx/lib/nvdlg.py +156 -0
  928. wx/lib/ogl/__init__.py +13 -0
  929. wx/lib/ogl/basic.py +3991 -0
  930. wx/lib/ogl/bmpshape.py +87 -0
  931. wx/lib/ogl/canvas.py +467 -0
  932. wx/lib/ogl/composit.py +1577 -0
  933. wx/lib/ogl/diagram.py +230 -0
  934. wx/lib/ogl/divided.py +483 -0
  935. wx/lib/ogl/drawn.py +900 -0
  936. wx/lib/ogl/lines.py +1811 -0
  937. wx/lib/ogl/oglmisc.py +608 -0
  938. wx/lib/pdfviewer/__init__.py +113 -0
  939. wx/lib/pdfviewer/bitmaps/ArrowLeft.png +0 -0
  940. wx/lib/pdfviewer/bitmaps/ArrowRight.png +0 -0
  941. wx/lib/pdfviewer/bitmaps/DirectionH.png +0 -0
  942. wx/lib/pdfviewer/bitmaps/DirectionV.png +0 -0
  943. wx/lib/pdfviewer/bitmaps/PlayerFirst.png +0 -0
  944. wx/lib/pdfviewer/bitmaps/PlayerLast.png +0 -0
  945. wx/lib/pdfviewer/bitmaps/PlayerNext.png +0 -0
  946. wx/lib/pdfviewer/bitmaps/PlayerPrev.png +0 -0
  947. wx/lib/pdfviewer/bitmaps/Printer.png +0 -0
  948. wx/lib/pdfviewer/bitmaps/ReadMe.txt +28 -0
  949. wx/lib/pdfviewer/bitmaps/Save.png +0 -0
  950. wx/lib/pdfviewer/bitmaps/ZoomIn.png +0 -0
  951. wx/lib/pdfviewer/bitmaps/ZoomOut.png +0 -0
  952. wx/lib/pdfviewer/bitmaps/encode_bitmaps.py +37 -0
  953. wx/lib/pdfviewer/buttonpanel.py +279 -0
  954. wx/lib/pdfviewer/images.py +240 -0
  955. wx/lib/pdfviewer/viewer.py +1077 -0
  956. wx/lib/pdfwin.py +295 -0
  957. wx/lib/pdfwin_old.py +789 -0
  958. wx/lib/platebtn.py +789 -0
  959. wx/lib/plot/CHANGELOG.md +150 -0
  960. wx/lib/plot/README.md +16 -0
  961. wx/lib/plot/__init__.py +46 -0
  962. wx/lib/plot/__main__.py +5 -0
  963. wx/lib/plot/examples/__init__.py +0 -0
  964. wx/lib/plot/examples/demo.py +1009 -0
  965. wx/lib/plot/examples/simple_example.py +54 -0
  966. wx/lib/plot/plotcanvas.py +2981 -0
  967. wx/lib/plot/polyobjects.py +1525 -0
  968. wx/lib/plot/utils.py +327 -0
  969. wx/lib/popupctl.py +250 -0
  970. wx/lib/printout.py +1157 -0
  971. wx/lib/progressindicator.py +151 -0
  972. wx/lib/pubsub/LICENSE_BSD_Simple.txt +23 -0
  973. wx/lib/pubsub/README_WxPython.txt +22 -0
  974. wx/lib/pubsub/RELEASE_NOTES.txt +71 -0
  975. wx/lib/pubsub/__init__.py +25 -0
  976. wx/lib/pubsub/core/__init__.py +92 -0
  977. wx/lib/pubsub/core/arg1/__init__.py +16 -0
  978. wx/lib/pubsub/core/arg1/listenerimpl.py +97 -0
  979. wx/lib/pubsub/core/arg1/publisher.py +40 -0
  980. wx/lib/pubsub/core/arg1/publishermixin.py +34 -0
  981. wx/lib/pubsub/core/arg1/topicargspecimpl.py +66 -0
  982. wx/lib/pubsub/core/arg1/topicmgrimpl.py +19 -0
  983. wx/lib/pubsub/core/callables.py +191 -0
  984. wx/lib/pubsub/core/imp2.py +63 -0
  985. wx/lib/pubsub/core/itopicdefnprovider.py +0 -0
  986. wx/lib/pubsub/core/kwargs/__init__.py +16 -0
  987. wx/lib/pubsub/core/kwargs/datamsg.py +27 -0
  988. wx/lib/pubsub/core/kwargs/listenerimpl.py +93 -0
  989. wx/lib/pubsub/core/kwargs/publisher.py +77 -0
  990. wx/lib/pubsub/core/kwargs/publishermixin.py +65 -0
  991. wx/lib/pubsub/core/kwargs/topicargspecimpl.py +217 -0
  992. wx/lib/pubsub/core/kwargs/topicmgrimpl.py +13 -0
  993. wx/lib/pubsub/core/listener.py +40 -0
  994. wx/lib/pubsub/core/listenerbase.py +185 -0
  995. wx/lib/pubsub/core/notificationmgr.py +185 -0
  996. wx/lib/pubsub/core/publisherbase.py +191 -0
  997. wx/lib/pubsub/core/topicargspec.py +77 -0
  998. wx/lib/pubsub/core/topicdefnprovider.py +632 -0
  999. wx/lib/pubsub/core/topicexc.py +72 -0
  1000. wx/lib/pubsub/core/topicmgr.py +456 -0
  1001. wx/lib/pubsub/core/topicobj.py +472 -0
  1002. wx/lib/pubsub/core/topictreetraverser.py +143 -0
  1003. wx/lib/pubsub/core/topicutils.py +118 -0
  1004. wx/lib/pubsub/core/treeconfig.py +21 -0
  1005. wx/lib/pubsub/core/validatedefnargs.py +29 -0
  1006. wx/lib/pubsub/core/weakmethod.py +102 -0
  1007. wx/lib/pubsub/policies.py +24 -0
  1008. wx/lib/pubsub/pub.py +199 -0
  1009. wx/lib/pubsub/py2and3.py +608 -0
  1010. wx/lib/pubsub/setuparg1.py +47 -0
  1011. wx/lib/pubsub/setupkwargs.py +29 -0
  1012. wx/lib/pubsub/utils/__init__.py +27 -0
  1013. wx/lib/pubsub/utils/exchandling.py +100 -0
  1014. wx/lib/pubsub/utils/misc.py +100 -0
  1015. wx/lib/pubsub/utils/notification.py +331 -0
  1016. wx/lib/pubsub/utils/topictreeprinter.py +195 -0
  1017. wx/lib/pubsub/utils/xmltopicdefnprovider.py +287 -0
  1018. wx/lib/pydocview.py +3300 -0
  1019. wx/lib/rcsizer.py +229 -0
  1020. wx/lib/resizewidget.py +357 -0
  1021. wx/lib/scrolledpanel.py +225 -0
  1022. wx/lib/sheet.py +350 -0
  1023. wx/lib/sized_controls.py +691 -0
  1024. wx/lib/softwareupdate.py +361 -0
  1025. wx/lib/splitter.py +925 -0
  1026. wx/lib/statbmp.py +199 -0
  1027. wx/lib/stattext.py +322 -0
  1028. wx/lib/throbber.py +425 -0
  1029. wx/lib/ticker.py +295 -0
  1030. wx/lib/ticker_xrc.py +48 -0
  1031. wx/lib/utils.py +89 -0
  1032. wx/lib/wordwrap.py +97 -0
  1033. wx/lib/wxcairo/__init__.py +124 -0
  1034. wx/lib/wxcairo/wx_cairocffi.py +200 -0
  1035. wx/lib/wxcairo/wx_pycairo.py +463 -0
  1036. wx/lib/wxpTag.py +274 -0
  1037. wx/locale/af/LC_MESSAGES/wxstd.mo +0 -0
  1038. wx/locale/an/LC_MESSAGES/wxstd.mo +0 -0
  1039. wx/locale/ar/LC_MESSAGES/wxstd.mo +0 -0
  1040. wx/locale/ca/LC_MESSAGES/wxstd.mo +0 -0
  1041. wx/locale/ca@valencia/LC_MESSAGES/wxstd.mo +0 -0
  1042. wx/locale/cs/LC_MESSAGES/wxstd.mo +0 -0
  1043. wx/locale/da/LC_MESSAGES/wxstd.mo +0 -0
  1044. wx/locale/de/LC_MESSAGES/wxstd.mo +0 -0
  1045. wx/locale/el/LC_MESSAGES/wxstd.mo +0 -0
  1046. wx/locale/es/LC_MESSAGES/wxstd.mo +0 -0
  1047. wx/locale/eu/LC_MESSAGES/wxstd.mo +0 -0
  1048. wx/locale/fa_IR/LC_MESSAGES/wxstd.mo +0 -0
  1049. wx/locale/fi/LC_MESSAGES/wxstd.mo +0 -0
  1050. wx/locale/fr/LC_MESSAGES/wxstd.mo +0 -0
  1051. wx/locale/gl_ES/LC_MESSAGES/wxstd.mo +0 -0
  1052. wx/locale/hi/LC_MESSAGES/wxstd.mo +0 -0
  1053. wx/locale/hr/LC_MESSAGES/wxstd.mo +0 -0
  1054. wx/locale/hu/LC_MESSAGES/wxstd.mo +0 -0
  1055. wx/locale/id/LC_MESSAGES/wxstd.mo +0 -0
  1056. wx/locale/it/LC_MESSAGES/wxstd.mo +0 -0
  1057. wx/locale/ja/LC_MESSAGES/wxstd.mo +0 -0
  1058. wx/locale/ka/LC_MESSAGES/wxstd.mo +0 -0
  1059. wx/locale/ko_KR/LC_MESSAGES/wxstd.mo +0 -0
  1060. wx/locale/lt/LC_MESSAGES/wxstd.mo +0 -0
  1061. wx/locale/lv/LC_MESSAGES/wxstd.mo +0 -0
  1062. wx/locale/ms/LC_MESSAGES/wxstd.mo +0 -0
  1063. wx/locale/nb/LC_MESSAGES/wxstd.mo +0 -0
  1064. wx/locale/ne/LC_MESSAGES/wxstd.mo +0 -0
  1065. wx/locale/nl/LC_MESSAGES/wxstd.mo +0 -0
  1066. wx/locale/pl/LC_MESSAGES/wxstd.mo +0 -0
  1067. wx/locale/pt/LC_MESSAGES/wxstd.mo +0 -0
  1068. wx/locale/pt_BR/LC_MESSAGES/wxstd.mo +0 -0
  1069. wx/locale/ro/LC_MESSAGES/wxstd.mo +0 -0
  1070. wx/locale/ru/LC_MESSAGES/wxstd.mo +0 -0
  1071. wx/locale/sk/LC_MESSAGES/wxstd.mo +0 -0
  1072. wx/locale/sl/LC_MESSAGES/wxstd.mo +0 -0
  1073. wx/locale/sq/LC_MESSAGES/wxstd.mo +0 -0
  1074. wx/locale/sv/LC_MESSAGES/wxstd.mo +0 -0
  1075. wx/locale/ta/LC_MESSAGES/wxstd.mo +0 -0
  1076. wx/locale/tr/LC_MESSAGES/wxstd.mo +0 -0
  1077. wx/locale/uk/LC_MESSAGES/wxstd.mo +0 -0
  1078. wx/locale/vi/LC_MESSAGES/wxstd.mo +0 -0
  1079. wx/locale/zh_CN/LC_MESSAGES/wxstd.mo +0 -0
  1080. wx/locale/zh_TW/LC_MESSAGES/wxstd.mo +0 -0
  1081. wx/media.py +27 -0
  1082. wx/media.pyi +223 -0
  1083. wx/msw.py +13 -0
  1084. wx/msw.pyi +65 -0
  1085. wx/propgrid.py +1451 -0
  1086. wx/propgrid.pyi +7914 -0
  1087. wx/py/CHANGES.txt +796 -0
  1088. wx/py/Py.ico +0 -0
  1089. wx/py/PyAlaCarte.py +34 -0
  1090. wx/py/PyAlaMode.py +34 -0
  1091. wx/py/PyAlaModeTest.py +33 -0
  1092. wx/py/PyCrust.ico +0 -0
  1093. wx/py/PyCrust.py +78 -0
  1094. wx/py/PyCrust_16.png +0 -0
  1095. wx/py/PyCrust_32.png +0 -0
  1096. wx/py/PyFilling.py +35 -0
  1097. wx/py/PyShell.py +78 -0
  1098. wx/py/PySlices.ico +0 -0
  1099. wx/py/PySlices.py +98 -0
  1100. wx/py/PySlicesShell.py +94 -0
  1101. wx/py/PySlices_16.png +0 -0
  1102. wx/py/PySlices_32.png +0 -0
  1103. wx/py/PyWrap.py +52 -0
  1104. wx/py/README.txt +77 -0
  1105. wx/py/__init__.py +20 -0
  1106. wx/py/buffer.py +136 -0
  1107. wx/py/crust.py +403 -0
  1108. wx/py/crustslices.py +403 -0
  1109. wx/py/dispatcher.py +259 -0
  1110. wx/py/document.py +37 -0
  1111. wx/py/editor.py +844 -0
  1112. wx/py/editwindow.py +299 -0
  1113. wx/py/filling.py +357 -0
  1114. wx/py/frame.py +978 -0
  1115. wx/py/images.py +212 -0
  1116. wx/py/interpreter.py +170 -0
  1117. wx/py/introspect.py +393 -0
  1118. wx/py/magic.py +98 -0
  1119. wx/py/parse.py +134 -0
  1120. wx/py/path.py +36 -0
  1121. wx/py/pseudo.py +99 -0
  1122. wx/py/shell.py +1588 -0
  1123. wx/py/sliceshell.py +3814 -0
  1124. wx/py/tests/test_interpreter.py +71 -0
  1125. wx/py/tests/test_introspect.py +862 -0
  1126. wx/py/tests/test_pseudo.py +70 -0
  1127. wx/py/tests/test_version.py +36 -0
  1128. wx/py/tests/testall.py +22 -0
  1129. wx/py/version.py +7 -0
  1130. wx/ribbon.py +45 -0
  1131. wx/ribbon.pyi +2494 -0
  1132. wx/richtext.py +142 -0
  1133. wx/richtext.pyi +12113 -0
  1134. wx/siplib.cp313-win_amd64.pyd +0 -0
  1135. wx/stc.py +58 -0
  1136. wx/stc.pyi +8463 -0
  1137. wx/svg/__init__.py +364 -0
  1138. wx/svg/_nanosvg.cp313-win_amd64.pyd +0 -0
  1139. wx/tools/__init__.py +18 -0
  1140. wx/tools/dbg.py +268 -0
  1141. wx/tools/genaxmodule.py +50 -0
  1142. wx/tools/helpviewer.py +92 -0
  1143. wx/tools/img2img.py +85 -0
  1144. wx/tools/img2png.py +54 -0
  1145. wx/tools/img2py.py +309 -0
  1146. wx/tools/img2xpm.py +54 -0
  1147. wx/tools/pywxrc.py +949 -0
  1148. wx/tools/wxget.py +254 -0
  1149. wx/tools/wxget_docs_demo.py +186 -0
  1150. wx/wxbase315u_net_vc140_x64.dll +0 -0
  1151. wx/wxbase315u_vc140_x64.dll +0 -0
  1152. wx/wxbase315u_xml_vc140_x64.dll +0 -0
  1153. wx/wxmsw315u_adv_vc140_x64.dll +0 -0
  1154. wx/wxmsw315u_aui_vc140_x64.dll +0 -0
  1155. wx/wxmsw315u_core_vc140_x64.dll +0 -0
  1156. wx/wxmsw315u_gl_vc140_x64.dll +0 -0
  1157. wx/wxmsw315u_html_vc140_x64.dll +0 -0
  1158. wx/wxmsw315u_media_vc140_x64.dll +0 -0
  1159. wx/wxmsw315u_propgrid_vc140_x64.dll +0 -0
  1160. wx/wxmsw315u_qa_vc140_x64.dll +0 -0
  1161. wx/wxmsw315u_ribbon_vc140_x64.dll +0 -0
  1162. wx/wxmsw315u_richtext_vc140_x64.dll +0 -0
  1163. wx/wxmsw315u_stc_vc140_x64.dll +0 -0
  1164. wx/wxmsw315u_webview_vc140_x64.dll +0 -0
  1165. wx/wxmsw315u_xrc_vc140_x64.dll +0 -0
  1166. wx/xml.py +15 -0
  1167. wx/xml.pyi +575 -0
  1168. wx/xrc.py +65 -0
  1169. wx/xrc.pyi +742 -0
  1170. wxPython_zombie-3.1.5.8.dist-info/LICENSE.txt +950 -0
  1171. wxPython_zombie-3.1.5.8.dist-info/METADATA +107 -0
  1172. wxPython_zombie-3.1.5.8.dist-info/RECORD +1175 -0
  1173. wxPython_zombie-3.1.5.8.dist-info/WHEEL +5 -0
  1174. wxPython_zombie-3.1.5.8.dist-info/entry_points.txt +2 -0
  1175. wxPython_zombie-3.1.5.8.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1077 @@
1
+ # Name: viewer.py
2
+ # Package: wx.lib.pdfviewer
3
+ #
4
+ # Purpose: A PDF report viewer class
5
+ #
6
+ # Author: David Hughes dfh@forestfield.co.uk
7
+ # Copyright: Forestfield Software Ltd
8
+ # Licence: Same as wxPython host
9
+
10
+ # History: Created 17 Jun 2009
11
+ #
12
+ # 08 Oct 2011, Michael Hipp michael@redmule.com
13
+ # Added prompt, printer_name, orientation options to
14
+ # pdfViewer.Print(). Added option to pdfViewer.LoadFile() to
15
+ # accept a file-like object as well as a path string
16
+ #
17
+ # Tags: phoenix-port, documented, unittest
18
+ #
19
+ #----------------------------------------------------------------------------
20
+
21
+ """
22
+
23
+ This module provides the :class:`~wx.lib.pdfviewer.viewer.pdfViewer` to view PDF
24
+ files.
25
+ """
26
+
27
+ import sys
28
+ import os
29
+ import time
30
+ import types
31
+ import copy
32
+ import shutil
33
+ from six import BytesIO, string_types
34
+
35
+ import wx
36
+
37
+ VERBOSE = True
38
+
39
+ try:
40
+ # see http://pythonhosted.org/PyMuPDF - documentation & installation
41
+ import fitz
42
+ mupdf = True
43
+ if VERBOSE: print('pdfviewer using PyMuPDF (GPL)')
44
+ except ImportError:
45
+ mupdf = False
46
+ try:
47
+ # see http://pythonhosted.org/PyPDF2
48
+ import PyPDF2
49
+ from PyPDF2 import PdfFileReader
50
+ from PyPDF2.pdf import ContentStream, PageObject
51
+ from PyPDF2.filters import ASCII85Decode, FlateDecode
52
+ if VERBOSE: print('pdfviewer using PyPDF2')
53
+ except ImportError:
54
+ msg = "PyMuPDF or PyPDF2 must be available to use pdfviewer"
55
+ raise ImportError(msg)
56
+
57
+ GraphicsContext = wx.GraphicsContext
58
+ have_cairo = False
59
+ if not mupdf:
60
+ try:
61
+ import wx.lib.wxcairo as wxcairo
62
+ import cairo
63
+ from wx.lib.graphics import GraphicsContext
64
+ have_cairo = True
65
+ if VERBOSE: print('pdfviewer using Cairo')
66
+ except ImportError:
67
+ if VERBOSE: print('pdfviewer using wx.GraphicsContext')
68
+
69
+ # New PageObject method added by Forestfield Software
70
+ def extractOperators(self):
71
+ """
72
+ Locate and return all commands in the order they
73
+ occur in the content stream
74
+ """
75
+ ops = []
76
+ content = self["/Contents"].getObject()
77
+ if not isinstance(content, ContentStream):
78
+ content = ContentStream(content, self.pdf)
79
+ for op in content.operations:
80
+ if type(op[1] == bytes):
81
+ op = (op[0], op[1].decode())
82
+ ops.append(op)
83
+ return ops
84
+ # Inject this method into the PageObject class
85
+ PageObject.extractOperators = extractOperators
86
+
87
+ # If reportlab is installed, use its stringWidth metric. For justifying text,
88
+ # where widths are cumulative, dc.GetTextExtent consistently underestimates,
89
+ # possibly because it returns integer rather than float.
90
+ try:
91
+ from reportlab.pdfbase.pdfmetrics import stringWidth
92
+ have_rlwidth = True
93
+ if VERBOSE: print('pdfviewer using reportlab stringWidth function')
94
+ except ImportError:
95
+ have_rlwidth = False
96
+
97
+ #----------------------------------------------------------------------------
98
+
99
+ class pdfViewer(wx.ScrolledWindow):
100
+ """
101
+ View pdf file in a scrolled window. Contents are read from PDF file
102
+ and rendered in a GraphicsContext. Show visible window contents
103
+ as quickly as possible then, when using pyPDF, read the whole file and build
104
+ the set of drawing commands for each page. This can take time for a big file or if
105
+ there are complex drawings eg. ReportLab's colour shading inside charts and a
106
+ progress bar can be displayed by setting self.ShowLoadProgress = True (default)
107
+ """
108
+ def __init__(self, parent, nid, pos, size, style):
109
+ """
110
+ Default class constructor.
111
+
112
+ :param wx.Window `parent`: parent window. Must not be ``None``;
113
+ :param integer `nid`: window identifier. A value of -1 indicates a default value;
114
+ :param `pos`: the control position. A value of (-1, -1) indicates a default position,
115
+ chosen by either the windowing system or wxPython, depending on platform;
116
+ :type `pos`: tuple or :class:`wx.Point`
117
+ :param `size`: the control size. A value of (-1, -1) indicates a default size,
118
+ chosen by either the windowing system or wxPython, depending on platform;
119
+ :type `size`: tuple or :class:`wx.Size`
120
+ :param integer `style`: the button style (unused);
121
+
122
+ """
123
+ wx.ScrolledWindow.__init__(self, parent, nid, pos, size,
124
+ style | wx.NO_FULL_REPAINT_ON_RESIZE)
125
+ self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) # recommended in wxWidgets docs
126
+ self.buttonpanel = None # reference to panel is set by their common parent
127
+ self._showLoadProgress = (not mupdf)
128
+
129
+ self.Bind(wx.EVT_PAINT, self.OnPaint)
130
+ self.Bind(wx.EVT_SIZE, self.OnResize)
131
+ self.Bind(wx.EVT_SCROLLWIN, self.OnScroll)
132
+ self.Bind(wx.EVT_IDLE, self.OnIdle)
133
+ self.have_file = False
134
+ self.resizing = False
135
+ self.numpages = None
136
+ self.zoomscale = -1 # fit page to screen width
137
+ self.nom_page_gap = 20 # nominal inter-page gap (points)
138
+ self.scrollrate = 20 # pixels per scrollbar increment
139
+ self.page_buffer_valid = False
140
+ self.page_after_zoom_change = None
141
+ self.ClearBackground()
142
+
143
+ def OnIdle(self, event):
144
+ """
145
+ Redraw on resize.
146
+ """
147
+ if self.resizing:
148
+ self.page_buffer_valid = False
149
+ self.Render()
150
+ self.resizing = False
151
+ event.Skip()
152
+
153
+ def OnResize(self, event):
154
+ """
155
+ Buffer size change due to client area resize.
156
+ """
157
+ self.resizing = True
158
+ event.Skip()
159
+
160
+ def OnScroll(self, event):
161
+ """
162
+ Recalculate and redraw visible area. CallAfter is *essential*
163
+ for coordination.
164
+ """
165
+ wx.CallAfter(self.Render)
166
+ event.Skip()
167
+
168
+ def OnPaint(self, event):
169
+ """
170
+ Refresh visible window with bitmap contents.
171
+ """
172
+ paintDC = wx.PaintDC(self)
173
+ paintDC.Clear() # in case buffer now smaller than visible window
174
+ if hasattr(self, 'pdc'):
175
+ paintDC.Blit(0, 0, self.winwidth, self.winheight, self.pdc,
176
+ self.xshift, self.yshift)
177
+
178
+ #----------------------------------------------------------------------------
179
+
180
+ # This section defines the externally callable methods:
181
+ # LoadFile, Save, Print, SetZoom, and GoPage
182
+ # also the getter and setter for ShowLoadProgress
183
+ # that is only applicable if using PyPDF2
184
+
185
+ def LoadFile(self, pdf_file):
186
+ """
187
+ Read pdf file. Assume all pages are same size, for now.
188
+
189
+ :param `pdf_file`: can be either a string holding
190
+ a filename path or a file-like object.
191
+ """
192
+ def create_fileobject(filename):
193
+ """
194
+ Create and return a file object with the contents of filename,
195
+ only used for testing.
196
+ """
197
+ with open(filename, 'rb') as f:
198
+ stream = f.read()
199
+ return BytesIO(stream)
200
+
201
+ self.pdfpathname = ''
202
+ if isinstance(pdf_file, string_types):
203
+ # a filename/path string, save its name
204
+ self.pdfpathname = pdf_file
205
+ # remove comment from next line to test using a file-like object
206
+ # pdf_file = create_fileobject(pdf_file)
207
+ if mupdf:
208
+ self.pdfdoc = mupdfProcessor(self, pdf_file)
209
+ else:
210
+ self.pdfdoc = pypdfProcessor(self, pdf_file, self.ShowLoadProgress)
211
+
212
+ self.numpages = self.pdfdoc.numpages
213
+ self.pagewidth = self.pdfdoc.pagewidth
214
+ self.pageheight = self.pdfdoc.pageheight
215
+ self.page_buffer_valid = False
216
+ self.Scroll(0, 0) # in case this is a re-LoadFile
217
+ self.CalculateDimensions() # to get initial visible page range
218
+ # draw and display the minimal set of pages
219
+ self.pdfdoc.DrawFile(self.frompage, self.topage)
220
+ self.have_file = True
221
+ # now draw full set of pages
222
+ wx.CallAfter(self.pdfdoc.DrawFile, 0, self.numpages-1)
223
+
224
+ def Save(self):
225
+ "Save a copy of the pdf file if it was originally named"
226
+ if self.pdfpathname:
227
+ wild = "Portable document format (*.pdf)|*.pdf"
228
+ dlg = wx.FileDialog(self, message="Save file as ...",
229
+ wildcard=wild, style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
230
+ if dlg.ShowModal() == wx.ID_OK:
231
+ pathname = dlg.GetPath()
232
+ shutil.copy(self.pdfpathname, pathname)
233
+ dlg.Destroy()
234
+
235
+ def Print(self, prompt=True, printer_name=None, orientation=None):
236
+ """
237
+ Print the pdf.
238
+
239
+ :param boolean `prompt`: show the print dialog to the user (True/False). If
240
+ False, the print dialog will not be shown and the pdf will be printed
241
+ immediately. Default: True.
242
+ :param string `printer_name`: the name of the printer that is to
243
+ receive the printout. Default: as set by the O/S.
244
+ :param `orientation`: select the orientation (:class:`wx.PORTRAIT` or
245
+ :class:`wx.LANDSCAPE`) for the printout. Default: as set by the O/S.
246
+ """
247
+ pdd = wx.PrintDialogData()
248
+ pdd.SetMinPage(1)
249
+ pdd.SetFromPage(1)
250
+ pdd.SetMaxPage(self.numpages)
251
+ pdd.SetToPage(self.numpages)
252
+ pdata = pdd.GetPrintData()
253
+ if printer_name:
254
+ pdata.SetPrinterName(printer_name)
255
+ if orientation:
256
+ pdata.SetOrientation(orientation)
257
+ # PrintData does not return actual PrintQuality - it can't as printer_name not known
258
+ # but it defaults to wx.PRINT_QUALITY_HIGH, overriding user's own setting for the
259
+ # printer. However calling SetQuality with a value of 0 seems to leave the printer
260
+ # setting untouched
261
+ pdata.SetQuality(0)
262
+ printer = wx.Printer(pdd)
263
+ printout = pdfPrintout('', self)
264
+ if (not printer.Print(self, printout, prompt=prompt) and
265
+ printer.GetLastError() == wx.PRINTER_ERROR):
266
+ dlg = wx.MessageDialog(self, 'Unable to perform printing',
267
+ 'Printer' , wx.OK | wx.ICON_INFORMATION)
268
+ dlg.ShowModal()
269
+ dlg.Destroy()
270
+ printout.Destroy()
271
+
272
+ def SetZoom(self, zoomscale):
273
+ """
274
+ Positive integer or floating zoom scale will render the file at corresponding
275
+ size where 1.0 is "actual" point size (1/72").
276
+ -1 fits page width and -2 fits page height into client area
277
+ Redisplay the current page(s) at the new size
278
+
279
+ :param `zoomscale`: an integer or float
280
+
281
+ """
282
+ pagenow = self.frompage
283
+ self.zoomscale = zoomscale
284
+ self.page_buffer_valid = False
285
+ # calling GoPage now will trigger rendering at the new size but the page location
286
+ # will be calculated based on the old zoom scale - so save the required page number
287
+ # and call GoPage again *after* rendering at the new size
288
+ self.page_after_zoom_change = pagenow
289
+ self.GoPage(pagenow)
290
+
291
+ def GoPage(self, pagenum):
292
+ """
293
+ Go to page
294
+
295
+ :param integer `pagenum`: go to the provided page number if it is valid
296
+
297
+ """
298
+ if pagenum > 0 and pagenum <= self.numpages:
299
+ self.Scroll(0, pagenum*self.Ypagepixels/self.GetScrollPixelsPerUnit()[1] + 1)
300
+ else:
301
+ self.Scroll(0, 0)
302
+ # calling Scroll sometimes doesn't raise wx.EVT_SCROLLWIN eg Windows 8 64 bit - so
303
+ wx.CallAfter(self.Render)
304
+
305
+ @property
306
+ def ShowLoadProgress(self):
307
+ """Property to control if file reading progress is shown (PyPDF2 only)"""
308
+ return self._showLoadProgress
309
+
310
+ @ShowLoadProgress.setter
311
+ def ShowLoadProgress(self, flag):
312
+ """Setter for showLoadProgress."""
313
+ self._showLoadProgress = flag
314
+
315
+ #----------------------------------------------------------------------------
316
+
317
+ # This section is concerned with rendering a sub-set of drawing commands on demand
318
+
319
+ def CalculateDimensions(self):
320
+ """
321
+ Compute the required buffer sizes to hold the viewed rectangle and
322
+ the range of pages visible. Set self.page_buffer_valid = False if
323
+ the current set of rendered pages changes
324
+ """
325
+ self.frompage = 0
326
+ self.topage = 0
327
+ device_scale = wx.ClientDC(self).GetPPI()[0]/72.0 # pixels per inch/points per inch
328
+ self.font_scale_metrics = 1.0
329
+ self.font_scale_size = 1.0
330
+ # for Windows only with wx.GraphicsContext the rendered font size is too big
331
+ # in the ratio of screen pixels per inch to points per inch
332
+ # and font metrics are too big in the same ratio for both for Cairo and wx.GC
333
+ if wx.PlatformInfo[1] == 'wxMSW':
334
+ self.font_scale_metrics = 1.0 / device_scale
335
+ if not have_cairo:
336
+ self.font_scale_size = 1.0 / device_scale
337
+
338
+ self.winwidth, self.winheight = self.GetClientSize()
339
+ self.Ypage = self.pageheight + self.nom_page_gap
340
+ if self.zoomscale > 0.0:
341
+ self.scale = self.zoomscale * device_scale
342
+ else:
343
+ if int(self.zoomscale) == -1: # fit width
344
+ self.scale = self.winwidth / self.pagewidth
345
+ else: # fit page
346
+ self.scale = self.winheight / self.pageheight
347
+ if self.scale == 0.0: # this could happen if the window was not yet initialized
348
+ self.scale = 1.0
349
+ self.Xpagepixels = int(round(self.pagewidth*self.scale))
350
+ self.Ypagepixels = int(round(self.Ypage*self.scale))
351
+
352
+ # adjust inter-page gap so Ypagepixels is a whole number of scroll increments
353
+ # and page numbers change precisely on a scroll click
354
+ idiv = self.Ypagepixels/self.scrollrate
355
+ nlo = idiv * self.scrollrate
356
+ nhi = (idiv + 1) * self.scrollrate
357
+ if nhi - self.Ypagepixels < self.Ypagepixels - nlo:
358
+ self.Ypagepixels = nhi
359
+ else:
360
+ self.Ypagepixels = nlo
361
+ self.page_gap = self.Ypagepixels/self.scale - self.pageheight
362
+
363
+ self.maxwidth = max(self.winwidth, self.Xpagepixels)
364
+ self.maxheight = max(self.winheight, self.numpages*self.Ypagepixels)
365
+ self.SetVirtualSize((self.maxwidth, self.maxheight))
366
+ self.SetScrollRate(self.scrollrate, self.scrollrate)
367
+
368
+ xv, yv = self.GetViewStart()
369
+ dx, dy = self.GetScrollPixelsPerUnit()
370
+ self.x0, self.y0 = (xv * dx, yv * dy)
371
+ self.frompage = int(min(self.y0/self.Ypagepixels, self.numpages-1))
372
+ self.topage = int(min((self.y0+self.winheight-1)/self.Ypagepixels, self.numpages-1))
373
+ self.pagebufferwidth = max(self.Xpagepixels, self.winwidth)
374
+ self.pagebufferheight = (self.topage - self.frompage + 1) * self.Ypagepixels
375
+
376
+ # Inform buttonpanel controls of any changes
377
+ if self.buttonpanel:
378
+ self.buttonpanel.Update(self.frompage, self.numpages,
379
+ self.scale/device_scale)
380
+
381
+ self.page_y0 = self.frompage * self.Ypagepixels
382
+ self.page_x0 = 0
383
+ self.xshift = self.x0 - self.page_x0
384
+ self.yshift = self.y0 - self.page_y0
385
+ if not self.page_buffer_valid: # via external setting
386
+ self.cur_frompage = self.frompage
387
+ self.cur_topage = self.topage
388
+ else: # page range unchanged? whole visible area will always be inside page buffer
389
+ if self.frompage != self.cur_frompage or self.topage != self.cur_topage:
390
+ self.page_buffer_valid = False # due to page buffer change
391
+ self.cur_frompage = self.frompage
392
+ self.cur_topage = self.topage
393
+ return
394
+
395
+ def Render(self):
396
+ """
397
+ Recalculate dimensions as client area may have been scrolled or resized.
398
+ The smallest unit of rendering that can be done is the pdf page. So render
399
+ the drawing commands for the pages in the visible rectangle into a buffer
400
+ big enough to hold this set of pages. Force re-creating the page buffer
401
+ only when client view moves outside it.
402
+ With PyPDF2, use gc.Translate to render each page wrt the pdf origin,
403
+ which is at the bottom left corner of the page.
404
+ """
405
+ if not self.have_file:
406
+ return
407
+ self.CalculateDimensions()
408
+ if not self.page_buffer_valid:
409
+ # Initialize the buffer bitmap.
410
+ self.pagebuffer = wx.Bitmap(self.pagebufferwidth, self.pagebufferheight)
411
+ self.pdc = wx.MemoryDC(self.pagebuffer) # must persist
412
+
413
+ gc = GraphicsContext.Create(self.pdc) # Cairo/wx.GraphicsContext API
414
+
415
+ # white background
416
+ path = gc.CreatePath()
417
+ path.AddRectangle(0, 0,
418
+ self.pagebuffer.GetWidth(), self.pagebuffer.GetHeight())
419
+ gc.SetBrush(wx.WHITE_BRUSH)
420
+ gc.FillPath(path)
421
+
422
+ for pageno in range(self.frompage, self.topage+1):
423
+ self.xpageoffset = 0 - self.x0
424
+ self.ypageoffset = pageno*self.Ypagepixels - self.page_y0
425
+ gc.PushState()
426
+ if mupdf:
427
+ gc.Translate(self.xpageoffset, self.ypageoffset)
428
+ # scaling is done inside RenderPage
429
+ else:
430
+
431
+ gc.Translate(self.xpageoffset, self.ypageoffset +
432
+ self.pageheight*self.scale)
433
+ gc.Scale(self.scale, self.scale)
434
+ self.pdfdoc.RenderPage(gc, pageno, scale=self.scale)
435
+ # Show inter-page gap
436
+ gc.SetBrush(wx.Brush(wx.Colour(180, 180, 180))) #mid grey
437
+ gc.SetPen(wx.TRANSPARENT_PEN)
438
+ if mupdf:
439
+ gc.DrawRectangle(0, self.pageheight*self.scale,
440
+ self.pagewidth*self.scale, self.page_gap*self.scale)
441
+ else:
442
+ gc.DrawRectangle(0, 0, self.pagewidth, self.page_gap)
443
+ gc.PopState()
444
+ gc.PushState()
445
+ gc.Translate(0-self.x0, 0-self.page_y0)
446
+ self.RenderPageBoundaries(gc)
447
+ gc.PopState()
448
+
449
+ self.page_buffer_valid = True
450
+ self.Refresh(0) # Blit appropriate area of new or existing page buffer to screen
451
+
452
+ # ensure we stay on the same page after zoom scale is changed
453
+ if self.page_after_zoom_change:
454
+ self.GoPage(self.page_after_zoom_change)
455
+ self.page_after_zoom_change = None
456
+
457
+ def RenderPageBoundaries(self, gc):
458
+ """
459
+ Show non-page areas in grey.
460
+ """
461
+ gc.SetBrush(wx.Brush(wx.Colour(180, 180, 180))) #mid grey
462
+ gc.SetPen(wx.TRANSPARENT_PEN)
463
+ gc.Scale(1.0, 1.0)
464
+ extrawidth = self.winwidth - self.Xpagepixels
465
+ if extrawidth > 0:
466
+ gc.DrawRectangle(self.winwidth-extrawidth, 0, extrawidth, self.maxheight)
467
+ extraheight = self.winheight - (self.numpages*self.Ypagepixels - self.y0)
468
+ if extraheight > 0:
469
+ gc.DrawRectangle(0, self.winheight-extraheight, self.maxwidth, extraheight)
470
+
471
+ #============================================================================
472
+
473
+ class mupdfProcessor(object):
474
+ """
475
+ Create an instance of this class to open a PDF file, process the contents of
476
+ each page and render each one on demand using the GPL mupdf library, which is
477
+ accessed via the python-fitz package bindings (version 1.9.1 or later)
478
+ """
479
+ def __init__(self, parent, pdf_file):
480
+ """
481
+ :param `pdf_file`: a File object or an object that supports the standard
482
+ read and seek methods similar to a File object.
483
+ Could also be a string representing a path to a PDF file.
484
+ """
485
+ self.parent = parent
486
+ if isinstance(pdf_file, string_types):
487
+ # a filename/path string, pass the name to fitz.open
488
+ pathname = pdf_file
489
+ self.pdfdoc = fitz.open(pathname)
490
+ else:
491
+ # assume it is a file-like object, pass the stream content to fitz.open
492
+ # and a '.pdf' extension in pathname to identify the stream type
493
+ pathname = 'fileobject.pdf'
494
+ if pdf_file.tell() > 0: # not positioned at start
495
+ pdf_file.seek(0)
496
+ stream = bytearray(pdf_file.read())
497
+ self.pdfdoc = fitz.open(pathname, stream)
498
+
499
+ self.numpages = self.pdfdoc.pageCount
500
+ page = self.pdfdoc.loadPage(0)
501
+ self.pagewidth = page.bound().width
502
+ self.pageheight = page.bound().height
503
+ self.page_rect = page.bound()
504
+ self.zoom_error = False #set if memory errors during render
505
+
506
+ def DrawFile(self, frompage, topage):
507
+ """
508
+ This is a no-op for mupdf. Each page is scaled and drawn on
509
+ demand during RenderPage directly via a call to page.getPixmap()
510
+ """
511
+ self.parent.GoPage(frompage)
512
+
513
+ def RenderPage(self, gc, pageno, scale=1.0):
514
+ " Render the set of pagedrawings into gc for specified page "
515
+ page = self.pdfdoc.loadPage(pageno)
516
+ matrix = fitz.Matrix(scale, scale)
517
+ try:
518
+ pix = page.getPixmap(matrix=matrix, alpha=False) # MUST be keyword arg(s)
519
+ bmp = wx.Bitmap.FromBuffer(pix.width, pix.height, pix.samples)
520
+ gc.DrawBitmap(bmp, 0, 0, pix.width, pix.height)
521
+ self.zoom_error = False
522
+ except (RuntimeError, MemoryError):
523
+ if not self.zoom_error: # report once only
524
+ self.zoom_error = True
525
+ dlg = wx.MessageDialog(self.parent, 'Out of memory. Zoom level too high?',
526
+ 'pdf viewer' , wx.OK |wx.ICON_EXCLAMATION)
527
+ dlg.ShowModal()
528
+ dlg.Destroy()
529
+
530
+ #============================================================================
531
+
532
+ class pypdfProcessor(object):
533
+ """
534
+ Create an instance of this class to open a PDF file, process the contents of
535
+ every page using PyPDF2 then render each one on demand
536
+ """
537
+ def __init__(self, parent, fileobj, showloadprogress):
538
+ self.parent = parent
539
+ self.showloadprogress = showloadprogress
540
+ self.pdfdoc = PdfFileReader(fileobj)
541
+ self.numpages = self.pdfdoc.getNumPages()
542
+ page1 = self.pdfdoc.getPage(0)
543
+ self.pagewidth = float(page1.mediaBox.getUpperRight_x())
544
+ self.pageheight = float(page1.mediaBox.getUpperRight_y())
545
+ self.pagedrawings = {}
546
+ self.unimplemented = {}
547
+ self.formdrawings = {}
548
+ self.page = None
549
+ self.gstate = None
550
+ self.saved_state = None
551
+ self.knownfont = False
552
+ self.progbar = None
553
+
554
+ # These methods interpret the PDF contents as a set of drawing commands
555
+
556
+ def Progress(self, ptype, value):
557
+ " This function is called at regular intervals during Drawfile"
558
+ if ptype == 'start':
559
+ pmsg = 'Reading pdf file'
560
+ self.progbar = wx.ProgressDialog('Load file', pmsg, value, None,
561
+ wx.PD_AUTO_HIDE|
562
+ wx.PD_ESTIMATED_TIME|wx.PD_REMAINING_TIME)
563
+ elif ptype == 'progress':
564
+ self.progbar.Update(value)
565
+ elif ptype == 'end':
566
+ self.progbar.Destroy()
567
+
568
+ def DrawFile(self, frompage, topage):
569
+ """
570
+ Build set of drawing commands from PDF contents. Ideally these could be drawn
571
+ straight into a PseudoDC and the visible section painted directly into
572
+ scrolled window, but we need to be able to zoom and scale the output quickly
573
+ without having to rebuild the drawing commands (slow). So build our
574
+ own command lists, one per page, into self.pagedrawings.
575
+ """
576
+ numpages_generated = 0
577
+ rp = (self.showloadprogress and frompage == 0 and topage == self.numpages-1)
578
+ if rp: self.Progress('start', self.numpages)
579
+ for pageno in range(frompage, topage+1):
580
+ self.gstate = pdfState() # state is reset with every new page
581
+ self.saved_state = []
582
+ self.page = self.pdfdoc.getPage(pageno)
583
+ numpages_generated += 1
584
+ pdf_fonts = self.FetchFonts(self.page)
585
+ self.pagedrawings[pageno] = self.ProcessOperators(
586
+ self.page.extractOperators(), pdf_fonts)
587
+ if rp: self.Progress('progress', numpages_generated)
588
+
589
+ if rp: self.Progress('end', None)
590
+ self.parent.GoPage(frompage)
591
+
592
+ def RenderPage(self, gc, pageno, scale=None):
593
+ """
594
+ Render the set of pagedrawings
595
+ In a pdf file, bitmaps are treated as being of unit width and height and
596
+ are scaled via a previous ConcatTransform containing the corresponding width
597
+ and height as scale factors. wx.GraphicsContext/Cairo appear not to respond to
598
+ this so scaling is removed from transform and width & height are added
599
+ to the Drawbitmap call.
600
+ """
601
+ drawdict = {'ConcatTransform': gc.ConcatTransform,
602
+ 'PushState': gc.PushState,
603
+ 'PopState': gc.PopState,
604
+ 'SetFont': gc.SetFont,
605
+ 'SetPen': gc.SetPen,
606
+ 'SetBrush': gc.SetBrush,
607
+ 'DrawText': gc.DrawText,
608
+ 'DrawBitmap': gc.DrawBitmap,
609
+ 'CreatePath': gc.CreatePath,
610
+ 'DrawPath': gc.DrawPath }
611
+ for drawcmd, args, kwargs in self.pagedrawings[pageno]:
612
+ # scale font if requested by printer DC
613
+ if drawcmd == 'SetFont' and hasattr(gc, 'font_scale'):
614
+ args[0].Scale(gc.font_scale)
615
+ if drawcmd == 'ConcatTransform':
616
+ cm = gc.CreateMatrix(*args, **kwargs)
617
+ args = (cm,)
618
+ if drawcmd == 'CreatePath':
619
+ gp = drawdict[drawcmd](*args, **kwargs)
620
+ continue
621
+ elif drawcmd == 'DrawPath':
622
+ args = (gp, args[1])
623
+ if drawcmd in drawdict:
624
+ drawdict[drawcmd](*args, **kwargs)
625
+ # reset font scaling in case RenderPage call is repeated
626
+ if drawcmd == 'SetFont' and hasattr(gc, 'font_scale'):
627
+ args[0].Scale(1.0/gc.font_scale)
628
+ else:
629
+ pathdict = {'MoveToPoint': gp.MoveToPoint,
630
+ 'AddLineToPoint': gp.AddLineToPoint,
631
+ 'AddCurveToPoint': gp.AddCurveToPoint,
632
+ 'AddRectangle': gp.AddRectangle,
633
+ 'CloseSubpath': gp.CloseSubpath }
634
+ if drawcmd in pathdict:
635
+ pathdict[drawcmd](*args, **kwargs)
636
+
637
+ def FetchFonts(self, currentobject):
638
+ " Return the standard fonts in current page or form"
639
+ pdf_fonts = {}
640
+ try:
641
+ fonts = currentobject["/Resources"].getObject()['/Font']
642
+ for key in fonts:
643
+ pdf_fonts[key] = fonts[key]['/BaseFont'][1:] # remove the leading '/'
644
+ except KeyError:
645
+ pass
646
+ return pdf_fonts
647
+
648
+ def ProcessOperators(self, opslist, pdf_fonts):
649
+ """
650
+ Interpret each operation in opslist and return in drawlist.
651
+ """
652
+ drawlist = []
653
+ path = []
654
+ for operand, operator in opslist :
655
+ g = self.gstate
656
+ if operator == 'cm' and operand: # new transformation matrix
657
+ # some operands need inverting because directions of y axis
658
+ # in pdf and graphics context are opposite
659
+ a, b, c, d, e, f = [float(n) for n in operand]
660
+ drawlist.append(['ConcatTransform', (a, -b, -c, d, e, -f), {}])
661
+ elif operator == 'q': # save state
662
+ self.saved_state.append(copy.deepcopy(g))
663
+ drawlist.append(['PushState', (), {}])
664
+ elif operator == 'Q': # restore state
665
+ self.gstate = self.saved_state.pop()
666
+ drawlist.append(['PopState', (), {}])
667
+ elif operator == 'RG': # Stroke RGB
668
+ rs, gs, bs = [int(float(n)*255) for n in operand]
669
+ g.strokeRGB = wx.Colour(rs, gs, bs)
670
+ elif operator == 'rg': # Fill RGB
671
+ rf, gf, bf = [int(float(n)*255) for n in operand]
672
+ g.fillRGB = wx.Colour(rf, gf, bf)
673
+ elif operator == 'K': # Stroke CMYK
674
+ rs, gs, bs = self.ConvertCMYK(operand)
675
+ g.strokeRGB = wx.Colour(rs, gs, bs)
676
+ elif operator == 'k': # Fill CMYK
677
+ rf, gf, bf = self.ConvertCMYK(operand)
678
+ g.fillRGB = wx.Colour(rf, gf, bf)
679
+ elif operator == 'w': # Line width
680
+ g.lineWidth = max(float(operand[0]), 1.0)
681
+ elif operator == 'J': # Line cap
682
+ ix = float(operand[0])
683
+ g.lineCapStyle = {0: wx.CAP_BUTT, 1: wx.CAP_ROUND,
684
+ 2: wx.CAP_PROJECTING}[ix]
685
+ elif operator == 'j': # Line join
686
+ ix = float(operand[0])
687
+ g.lineJoinStyle = {0: wx.JOIN_MITER, 1: wx.JOIN_ROUND,
688
+ 2: wx.JOIN_BEVEL}[ix]
689
+ elif operator == 'd': # Line dash pattern
690
+ g.lineDashArray = [int(n) for n in operand[0]]
691
+ g.lineDashPhase = int(operand[1])
692
+ elif operator in ('m', 'c', 'l', 're', 'v', 'y', 'h'): # path defining ops
693
+ path.append([[float(n) for n in operand], operator])
694
+ elif operator in ('b', 'B', 'b*', 'B*', 'f', 'F', 'f*',
695
+ 's', 'S', 'n'): # path drawing ops
696
+ drawlist.extend(self.DrawPath(path, operator))
697
+ path = []
698
+ elif operator == 'BT': # begin text object
699
+ g.textMatrix = [1, 0, 0, 1, 0, 0]
700
+ g.textLineMatrix = [1, 0, 0, 1, 0, 0]
701
+ elif operator == 'ET': # end text object
702
+ continue
703
+ elif operator == 'Tm': # text matrix
704
+ g.textMatrix = [float(n) for n in operand]
705
+ g.textLineMatrix = [float(n) for n in operand]
706
+ elif operator == 'TL': # text leading
707
+ g.leading = float(operand[0])
708
+ #elif operator == 'Tc': # character spacing
709
+ # g.charSpacing = float(operand[0])
710
+ elif operator == 'Tw': # word spacing
711
+ g.wordSpacing = float(operand[0])
712
+ elif operator == 'Ts': # super/subscript
713
+ g.textRise = float(operand[0])
714
+ elif operator == 'Td': # next line via offsets
715
+ g.textLineMatrix[4] += float(operand[0])
716
+ g.textLineMatrix[5] += float(operand[1])
717
+ g.textMatrix = copy.copy(g.textLineMatrix)
718
+ elif operator == 'T*': # next line via leading
719
+ g.textLineMatrix[4] += 0
720
+ g.textLineMatrix[5] -= g.leading if g.leading is not None else 0
721
+ g.textMatrix = copy.copy(g.textLineMatrix)
722
+ elif operator == 'Tf': # text font
723
+ g.font = pdf_fonts[operand[0]]
724
+ g.fontSize = float(operand[1])
725
+ elif operator == 'Tj': # show text
726
+ drawlist.extend(self.DrawTextString(
727
+ operand[0].original_bytes.decode('latin-1')))
728
+ elif operator == 'Do': # invoke named XObject
729
+ dlist = self.InsertXObject(operand[0])
730
+ if dlist: # may be unimplemented decode
731
+ drawlist.extend(dlist)
732
+ elif operator == 'INLINE IMAGE': # special pyPdf case + operand is a dict
733
+ dlist = self.InlineImage(operand)
734
+ if dlist: # may be unimplemented decode
735
+ drawlist.extend(dlist)
736
+ else: # report once
737
+ if operator not in self.unimplemented:
738
+ if VERBOSE: print('PDF operator %s is not implemented' % operator)
739
+ self.unimplemented[operator] = 1
740
+
741
+ # Fix bitmap transform. Move the scaling from any transform matrix that precedes
742
+ # a DrawBitmap operation into the op itself - the width and height extracted from
743
+ # the bitmap is the size of the original PDF image not the size it is to be drawn
744
+ for k in range(len(drawlist)-1):
745
+ if drawlist[k][0] == 'ConcatTransform' and drawlist[k+1][0] == 'DrawBitmap':
746
+ ctargs = list(drawlist[k][1])
747
+ bmargs = list(drawlist[k+1][1])
748
+ bmargs[2] = -ctargs[3] # y position
749
+ bmargs[3] = ctargs[0] # width
750
+ bmargs[4] = ctargs[3] # height
751
+ ctargs[0] = 1.0
752
+ ctargs[3] = 1.0
753
+ drawlist[k][1] = tuple(ctargs)
754
+ drawlist[k+1][1] = tuple(bmargs)
755
+ return drawlist
756
+
757
+ def SetFont(self, pdfont, size):
758
+ """
759
+ Returns :class:`wx.Font` instance from supplied pdf font information.
760
+ """
761
+ self.knownfont = True
762
+ pdfont = pdfont.lower()
763
+ if pdfont.count('courier'):
764
+ family = wx.FONTFAMILY_MODERN
765
+ font = 'Courier New'
766
+ elif pdfont.count('helvetica'):
767
+ family = wx.FONTFAMILY_SWISS
768
+ font = 'Arial'
769
+ elif pdfont.count('times'):
770
+ family = wx.FONTFAMILY_ROMAN
771
+ font = 'Times New Roman'
772
+ elif pdfont.count('symbol'):
773
+ family = wx.FONTFAMILY_DEFAULT
774
+ font = 'Symbol'
775
+ elif pdfont.count('zapfdingbats'):
776
+ family = wx.FONTFAMILY_DEFAULT
777
+ font = 'Wingdings'
778
+ else:
779
+ if VERBOSE: print('Unknown font %s' % pdfont)
780
+ self.knownfont = False
781
+ family = wx.FONTFAMILY_SWISS
782
+ font = 'Arial'
783
+
784
+ weight = wx.FONTWEIGHT_NORMAL
785
+ if pdfont.count('bold'):
786
+ weight = wx.FONTWEIGHT_BOLD
787
+ style = wx.FONTSTYLE_NORMAL
788
+ if pdfont.count('oblique') or pdfont.count('italic'):
789
+ style = wx.FONTSTYLE_ITALIC
790
+ return wx.Font(max(1, size), family, style, weight, faceName=font)
791
+
792
+ def DrawTextString(self, text):
793
+ """
794
+ Draw a text string. Word spacing only works for horizontal text.
795
+
796
+ :param string `text`: the text to draw
797
+
798
+ """
799
+ dlist = []
800
+ g = self.gstate
801
+ f0 = self.SetFont(g.font, g.fontSize)
802
+ f0.Scale(self.parent.font_scale_metrics)
803
+ f1 = self.SetFont(g.font, g.fontSize)
804
+ f1.Scale(self.parent.font_scale_size)
805
+ dlist.append(['SetFont', (f1, g.fillRGB), {}])
806
+ if g.wordSpacing > 0:
807
+ textlist = text.split(' ')
808
+ else:
809
+ textlist = [text,]
810
+ for item in textlist:
811
+ dlist.append(self.DrawTextItem(item, f0))
812
+ return dlist
813
+
814
+ def DrawTextItem(self, textitem, f):
815
+ """
816
+ Draw a text item.
817
+
818
+ :param `textitem`: the item to draw
819
+ :param `f`: the font to use for text extent measuring
820
+
821
+ """
822
+ dc = wx.ClientDC(self.parent) # dummy dc for text extents
823
+ g = self.gstate
824
+ x = g.textMatrix[4]
825
+ y = g.textMatrix[5] + g.textRise
826
+ if g.wordSpacing > 0:
827
+ textitem += ' '
828
+ wid, ht, descend, x_lead = dc.GetFullTextExtent(textitem, f)
829
+ if have_rlwidth and self.knownfont: # use ReportLab stringWidth if available
830
+ width = stringWidth(textitem, g.font, g.fontSize)
831
+ else:
832
+ width = wid
833
+ g.textMatrix[4] += (width + g.wordSpacing) # update current x position
834
+ return ['DrawText', (textitem, x, -y-(ht-descend)), {}]
835
+
836
+ def DrawPath(self, path, action):
837
+ """
838
+ Stroke and/or fill the defined path depending on operator.
839
+ """
840
+ dlist = []
841
+ g = self.gstate
842
+ acts = {'S': (1, 0, 0),
843
+ 's': (1, 0, 0),
844
+ 'f': (0, 1, wx.WINDING_RULE),
845
+ 'F': (0, 1, wx.WINDING_RULE),
846
+ 'f*': (0, 1, wx.ODDEVEN_RULE),
847
+ 'B': (1, 1, wx.WINDING_RULE),
848
+ 'B*': (1, 1, wx.ODDEVEN_RULE),
849
+ 'b': (1, 1, wx.WINDING_RULE),
850
+ 'b*': (1, 1, wx.ODDEVEN_RULE),
851
+ 'n': (0, 0, 0) }
852
+ stroke, fill, rule = acts[action]
853
+ if action in ('s', 'b', 'b*'):
854
+ path.append([[], 'h']) # close path
855
+
856
+ if stroke:
857
+ if g.lineDashArray:
858
+ style = wx.PENSTYLE_USER_DASH
859
+ else:
860
+ style = wx.PENSTYLE_SOLID
861
+ cpen = wx.Pen(g.strokeRGB, g.lineWidth, style)
862
+ cpen.SetCap(g.lineCapStyle)
863
+ cpen.SetJoin(g.lineJoinStyle)
864
+ if g.lineDashArray:
865
+ cpen.SetDashes(g.lineDashArray)
866
+ dlist.append(['SetPen', (cpen,), {}])
867
+ else:
868
+ dlist.append(['SetPen', (wx.TRANSPARENT_PEN,), {}])
869
+
870
+ if fill:
871
+ dlist.append(['SetBrush', (wx.Brush(g.fillRGB),), {}])
872
+ else:
873
+ dlist.append(['SetBrush', (wx.TRANSPARENT_BRUSH,), {}])
874
+
875
+ dlist.append(['CreatePath', (), {}])
876
+ for xylist, op in path:
877
+ if op == 'm': # move (to) current point
878
+ x0 = xc = xylist[0]
879
+ y0 = yc = -xylist[1]
880
+ dlist.append(['MoveToPoint', (x0, y0), {}])
881
+ elif op == 'l': # draw line
882
+ x2 = xylist[0]
883
+ y2 = -xylist[1]
884
+ dlist.append(['AddLineToPoint', (x2, y2), {}])
885
+ xc = x2
886
+ yc = y2
887
+ elif op == 're': # draw rectangle
888
+ x = xylist[0]
889
+ y = -xylist[1]
890
+ w = xylist[2]
891
+ h = xylist[3]
892
+ retuple = (x, y-h, w, h)
893
+ if h < 0.0:
894
+ retuple = (x, y, w, -h)
895
+ dlist.append(['AddRectangle', retuple, {}])
896
+ elif op in ('c', 'v', 'y'): # draw Bezier curve
897
+ args = []
898
+ if op == 'v':
899
+ args.extend([xc, yc])
900
+ args.extend([xylist[0], -xylist[1],
901
+ xylist[2], -xylist[3]])
902
+ if op == 'y':
903
+ args.extend([xylist[2], -xylist[3]])
904
+ if op == 'c':
905
+ args.extend([xylist[4], -xylist[5]])
906
+ dlist.append(['AddCurveToPoint', args, {}])
907
+ elif op == 'h':
908
+ dlist.append(['CloseSubpath', (), {}])
909
+ dlist.append(['DrawPath', ('GraphicsPath', rule), {}])
910
+ return dlist
911
+
912
+ def InsertXObject(self, name):
913
+ """
914
+ XObject can be an image or a 'form' (an arbitrary PDF sequence).
915
+ """
916
+ dlist = []
917
+ xobject = self.page["/Resources"].getObject()['/XObject']
918
+ stream = xobject[name]
919
+ if stream.get('/Subtype') == '/Form':
920
+ # insert contents into current page drawing
921
+ if not name in self.formdrawings: # extract if not already done
922
+ pdf_fonts = self.FetchFonts(stream)
923
+ x_bbox = stream.get('/BBox')
924
+ matrix = stream.get('/Matrix')
925
+ form_ops = ContentStream(stream, self.pdfdoc).operations
926
+ oplist = [([], 'q'), (matrix, 'cm')] # push state & apply matrix
927
+ oplist.extend(form_ops) # add form contents
928
+ oplist.append(([], 'Q')) # restore original state
929
+ self.formdrawings[name] = self.ProcessOperators(oplist, pdf_fonts)
930
+ dlist.extend(self.formdrawings[name])
931
+ elif stream.get('/Subtype') == '/Image':
932
+ width = stream['/Width']
933
+ height = stream['/Height']
934
+ x_depth = stream['/BitsPerComponent']
935
+ filters = stream["/Filter"]
936
+ item = self.AddBitmap(stream._data, width, height, filters)
937
+ if item: # may be unimplemented
938
+ dlist.append(item)
939
+ return dlist
940
+
941
+ def InlineImage(self, operand):
942
+ """ operand contains an image"""
943
+ dlist = []
944
+ data = operand.get('data')
945
+ settings = operand.get('settings')
946
+ width = settings['/W']
947
+ height = settings['/H']
948
+ x_depth = settings['/BPC']
949
+ filters = settings['/F']
950
+ item = self.AddBitmap(data, width, height, filters)
951
+ if item: # may be unimplemented
952
+ dlist.append(item)
953
+ return dlist
954
+
955
+ def AddBitmap(self, data, width, height, filters):
956
+ """
957
+ Add wx.Bitmap from data, processed by filters.
958
+ """
959
+ if '/A85' in filters or '/ASCII85Decode' in filters:
960
+ data = ASCII85Decode.decode(data)
961
+ if '/Fl' in filters or '/FlateDecode' in filters:
962
+ data = FlateDecode.decode(data, None)
963
+ if '/CCF' in filters or '/CCITTFaxDecode' in filters:
964
+ if VERBOSE:
965
+ print('PDF operation /CCITTFaxDecode is not implemented')
966
+ return []
967
+ if '/DCT' in filters or '/DCTDecode' in filters:
968
+ stream = BytesIO(data)
969
+ image = wx.Image(stream, wx.BITMAP_TYPE_JPEG)
970
+ bitmap = wx.Bitmap(image)
971
+ else:
972
+ try:
973
+ bitmap = wx.Bitmap.FromBuffer(width, height, data)
974
+ except:
975
+ return [] # any error
976
+ return ['DrawBitmap', (bitmap, 0, 0-height, width, height), {}]
977
+
978
+ def ConvertCMYK(self, operand):
979
+ """
980
+ Convert CMYK values (0 to 1.0) in operand to nearest RGB.
981
+ """
982
+ c, m, y, k = operand
983
+ r = round((1-c)*(1-k)*255)
984
+ b = round((1-y)*(1-k)*255)
985
+ g = round((1-m)*(1-k)*255)
986
+ return (r, g, b)
987
+
988
+ #----------------------------------------------------------------------------
989
+
990
+ class pdfState(object):
991
+ """
992
+ Instance holds the current pdf graphics and text state. It can be
993
+ saved (pushed) and restored (popped) by the owning parent
994
+ """
995
+ def __init__ (self):
996
+ """
997
+ Creates an instance with default values. Individual attributes
998
+ are modified directly not via getters and setters
999
+ """
1000
+ self.lineWidth = 1.0
1001
+ self.lineCapStyle = wx.CAP_BUTT
1002
+ self.lineJoinStyle = wx.JOIN_MITER
1003
+ self.lineDashArray = []
1004
+ self.lineDashPhase = 0
1005
+ self.miterLimit = None
1006
+ self.strokeRGB = wx.BLACK
1007
+ self.fillRGB = wx.BLACK # used for both shapes & text
1008
+ self.fillMode = None
1009
+
1010
+ self.textMatrix = [1, 0, 0, 1, 0, 0]
1011
+ self.textLineMatrix = [1, 0, 0, 1, 0, 0]
1012
+ self.charSpacing = 0
1013
+ self.wordSpacing = 0
1014
+ self.horizontalScaling = None
1015
+ self.leading = None
1016
+ self.font = None
1017
+ self.fontSize = None
1018
+ self.textRenderMode = None
1019
+ self.textRise = 0
1020
+
1021
+ #------------------------------------------------------------------------------
1022
+
1023
+ class pdfPrintout(wx.Printout):
1024
+ """
1025
+ Class encapsulating the functionality of printing out the document. The methods below
1026
+ over-ride those of the base class and supply document-specific information to the
1027
+ printing framework that calls them internally.
1028
+ """
1029
+ def __init__(self, title, view):
1030
+ """
1031
+ Pass in the instance of dpViewer to be printed.
1032
+ """
1033
+ wx.Printout.__init__(self, title)
1034
+ self.view = view
1035
+
1036
+ def HasPage(self, pageno):
1037
+ """
1038
+ Report whether pageno exists.
1039
+ """
1040
+ if pageno <= self.view.numpages:
1041
+ return True
1042
+ else:
1043
+ return False
1044
+
1045
+ def GetPageInfo(self):
1046
+ """
1047
+ Supply maximum range of pages and the range to be printed
1048
+ These are initial values passed to Printer dialog, where they
1049
+ can be amended by user.
1050
+ """
1051
+ maxnum = self.view.numpages
1052
+ return (1, maxnum, 1, maxnum)
1053
+
1054
+ def OnPrintPage(self, page):
1055
+ """
1056
+ Provide the data for page by rendering the drawing commands
1057
+ to the printer DC, MuPDF returns the page content from an internally
1058
+ generated bitmap and sfac sets it to a high enough resolution that
1059
+ reduces anti-aliasing blur but keeps it small to minimise printing time
1060
+ """
1061
+ sfac = 1.0
1062
+ if mupdf:
1063
+ sfac = 4.0
1064
+ pageno = page - 1 # zero based
1065
+ width = self.view.pagewidth
1066
+ height = self.view.pageheight
1067
+ self.FitThisSizeToPage(wx.Size(width*sfac, height*sfac))
1068
+ dc = self.GetDC()
1069
+ gc = wx.GraphicsContext.Create(dc)
1070
+ if not mupdf:
1071
+ gc.Translate(0, height)
1072
+ if wx.PlatformInfo[1] == 'wxMSW' and have_cairo:
1073
+ device_scale = wx.ClientDC(self.view).GetPPI()[0]/72.0 # pixels per inch/ppi
1074
+ gc.font_scale = 1.0 / device_scale
1075
+
1076
+ self.view.pdfdoc.RenderPage(gc, pageno, sfac)
1077
+ return True