pdf2json 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (473) hide show
  1. data/README.markdown +9 -0
  2. data/bin/.gitkeep +0 -0
  3. data/ext/extconf.rb +30 -0
  4. data/lib/pdf2json.rb +8 -0
  5. data/pdf2json-0.52-source/AUTHORS +24 -0
  6. data/pdf2json-0.52-source/CHANGES +11 -0
  7. data/pdf2json-0.52-source/Makefile +84 -0
  8. data/pdf2json-0.52-source/Makefile.in +84 -0
  9. data/pdf2json-0.52-source/aclocal.m4 +274 -0
  10. data/pdf2json-0.52-source/aconf-win32.h +86 -0
  11. data/pdf2json-0.52-source/aconf.h +42 -0
  12. data/pdf2json-0.52-source/aconf.h.in +41 -0
  13. data/pdf2json-0.52-source/autom4te.cache/output.0 +6908 -0
  14. data/pdf2json-0.52-source/autom4te.cache/requests +76 -0
  15. data/pdf2json-0.52-source/autom4te.cache/traces.0 +466 -0
  16. data/pdf2json-0.52-source/config.log +1259 -0
  17. data/pdf2json-0.52-source/config.status +1050 -0
  18. data/pdf2json-0.52-source/configure +6908 -0
  19. data/pdf2json-0.52-source/configure.ac +93 -0
  20. data/pdf2json-0.52-source/doc/pdffonts.1 +130 -0
  21. data/pdf2json-0.52-source/doc/pdffonts.cat +107 -0
  22. data/pdf2json-0.52-source/doc/pdffonts.hlp +117 -0
  23. data/pdf2json-0.52-source/doc/pdfimages.1 +102 -0
  24. data/pdf2json-0.52-source/doc/pdfimages.cat +92 -0
  25. data/pdf2json-0.52-source/doc/pdfimages.hlp +101 -0
  26. data/pdf2json-0.52-source/doc/pdfinfo.1 +158 -0
  27. data/pdf2json-0.52-source/doc/pdfinfo.cat +119 -0
  28. data/pdf2json-0.52-source/doc/pdfinfo.hlp +129 -0
  29. data/pdf2json-0.52-source/doc/pdftoppm.1 +115 -0
  30. data/pdf2json-0.52-source/doc/pdftoppm.cat +105 -0
  31. data/pdf2json-0.52-source/doc/pdftoppm.hlp +114 -0
  32. data/pdf2json-0.52-source/doc/pdftops.1 +229 -0
  33. data/pdf2json-0.52-source/doc/pdftops.cat +221 -0
  34. data/pdf2json-0.52-source/doc/pdftops.hlp +231 -0
  35. data/pdf2json-0.52-source/doc/pdftotext.1 +137 -0
  36. data/pdf2json-0.52-source/doc/pdftotext.cat +120 -0
  37. data/pdf2json-0.52-source/doc/pdftotext.hlp +133 -0
  38. data/pdf2json-0.52-source/doc/sample-xpdfrc +91 -0
  39. data/pdf2json-0.52-source/doc/xpdf.1 +513 -0
  40. data/pdf2json-0.52-source/doc/xpdf.cat +476 -0
  41. data/pdf2json-0.52-source/doc/xpdf.hlp +489 -0
  42. data/pdf2json-0.52-source/doc/xpdfrc.5 +480 -0
  43. data/pdf2json-0.52-source/doc/xpdfrc.cat +474 -0
  44. data/pdf2json-0.52-source/doc/xpdfrc.hlp +479 -0
  45. data/pdf2json-0.52-source/fofi/.DS_Store +0 -0
  46. data/pdf2json-0.52-source/fofi/FoFiBase.cc +156 -0
  47. data/pdf2json-0.52-source/fofi/FoFiBase.h +57 -0
  48. data/pdf2json-0.52-source/fofi/FoFiBase.o +0 -0
  49. data/pdf2json-0.52-source/fofi/FoFiEncodings.cc +994 -0
  50. data/pdf2json-0.52-source/fofi/FoFiEncodings.h +36 -0
  51. data/pdf2json-0.52-source/fofi/FoFiEncodings.o +0 -0
  52. data/pdf2json-0.52-source/fofi/FoFiTrueType.cc +2027 -0
  53. data/pdf2json-0.52-source/fofi/FoFiTrueType.h +174 -0
  54. data/pdf2json-0.52-source/fofi/FoFiTrueType.o +0 -0
  55. data/pdf2json-0.52-source/fofi/FoFiType1.cc +252 -0
  56. data/pdf2json-0.52-source/fofi/FoFiType1.h +59 -0
  57. data/pdf2json-0.52-source/fofi/FoFiType1.o +0 -0
  58. data/pdf2json-0.52-source/fofi/FoFiType1C.cc +2603 -0
  59. data/pdf2json-0.52-source/fofi/FoFiType1C.h +233 -0
  60. data/pdf2json-0.52-source/fofi/FoFiType1C.o +0 -0
  61. data/pdf2json-0.52-source/fofi/Makefile +70 -0
  62. data/pdf2json-0.52-source/fofi/Makefile.dep +0 -0
  63. data/pdf2json-0.52-source/fofi/Makefile.in +70 -0
  64. data/pdf2json-0.52-source/fofi/libfofi.a +0 -0
  65. data/pdf2json-0.52-source/fofi/vms_make.com +0 -0
  66. data/pdf2json-0.52-source/freetype.win32/.DS_Store +0 -0
  67. data/pdf2json-0.52-source/freetype.win32/include/.DS_Store +0 -0
  68. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftconfig.h +528 -0
  69. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftheader.h +780 -0
  70. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftmodule.h +32 -0
  71. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftoption.h +733 -0
  72. data/pdf2json-0.52-source/freetype.win32/include/freetype/config/ftstdlib.h +173 -0
  73. data/pdf2json-0.52-source/freetype.win32/include/freetype/freetype.h +3919 -0
  74. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftadvanc.h +179 -0
  75. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbbox.h +94 -0
  76. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbdf.h +209 -0
  77. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftbitmap.h +227 -0
  78. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftcache.h +1128 -0
  79. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftchapters.h +103 -0
  80. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftcid.h +166 -0
  81. data/pdf2json-0.52-source/freetype.win32/include/freetype/fterrdef.h +244 -0
  82. data/pdf2json-0.52-source/freetype.win32/include/freetype/fterrors.h +206 -0
  83. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgasp.h +120 -0
  84. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftglyph.h +613 -0
  85. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgxval.h +358 -0
  86. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftgzip.h +102 -0
  87. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftimage.h +1313 -0
  88. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftincrem.h +353 -0
  89. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlcdfil.h +213 -0
  90. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlist.h +277 -0
  91. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftlzw.h +99 -0
  92. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmac.h +274 -0
  93. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmm.h +378 -0
  94. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmodapi.h +483 -0
  95. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftmoderr.h +155 -0
  96. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftotval.h +203 -0
  97. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftoutln.h +537 -0
  98. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftpfr.h +172 -0
  99. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftrender.h +230 -0
  100. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsizes.h +159 -0
  101. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsnames.h +200 -0
  102. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftstroke.h +716 -0
  103. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsynth.h +80 -0
  104. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftsystem.h +347 -0
  105. data/pdf2json-0.52-source/freetype.win32/include/freetype/fttrigon.h +350 -0
  106. data/pdf2json-0.52-source/freetype.win32/include/freetype/fttypes.h +588 -0
  107. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftwinfnt.h +274 -0
  108. data/pdf2json-0.52-source/freetype.win32/include/freetype/ftxf86.h +83 -0
  109. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/autohint.h +231 -0
  110. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftcalc.h +179 -0
  111. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftdebug.h +250 -0
  112. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftdriver.h +422 -0
  113. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftgloadr.h +168 -0
  114. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftmemory.h +380 -0
  115. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftobjs.h +1428 -0
  116. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftpic.h +67 -0
  117. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftrfork.h +196 -0
  118. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftserv.h +620 -0
  119. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftstream.h +539 -0
  120. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/fttrace.h +139 -0
  121. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/ftvalid.h +150 -0
  122. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/internal.h +51 -0
  123. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/pcftypes.h +56 -0
  124. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/psaux.h +873 -0
  125. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/pshints.h +712 -0
  126. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svbdf.h +77 -0
  127. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svcid.h +83 -0
  128. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svgldict.h +82 -0
  129. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svgxval.h +72 -0
  130. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svkern.h +51 -0
  131. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svmm.h +104 -0
  132. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svotval.h +55 -0
  133. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpfr.h +66 -0
  134. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpostnm.h +79 -0
  135. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpscmap.h +164 -0
  136. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svpsinfo.h +92 -0
  137. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svsfnt.h +102 -0
  138. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svttcmap.h +106 -0
  139. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svtteng.h +53 -0
  140. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svttglyf.h +67 -0
  141. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svwinfnt.h +50 -0
  142. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/services/svxf86nm.h +55 -0
  143. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/sfnt.h +897 -0
  144. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/t1types.h +270 -0
  145. data/pdf2json-0.52-source/freetype.win32/include/freetype/internal/tttypes.h +1543 -0
  146. data/pdf2json-0.52-source/freetype.win32/include/freetype/t1tables.h +504 -0
  147. data/pdf2json-0.52-source/freetype.win32/include/freetype/ttnameid.h +1247 -0
  148. data/pdf2json-0.52-source/freetype.win32/include/freetype/tttables.h +759 -0
  149. data/pdf2json-0.52-source/freetype.win32/include/freetype/tttags.h +107 -0
  150. data/pdf2json-0.52-source/freetype.win32/include/freetype/ttunpat.h +59 -0
  151. data/pdf2json-0.52-source/freetype.win32/include/ft2build.h +39 -0
  152. data/pdf2json-0.52-source/freetype.win32/lib/freetype_a.lib +0 -0
  153. data/pdf2json-0.52-source/goo/.DS_Store +0 -0
  154. data/pdf2json-0.52-source/goo/FixedPoint.cc +118 -0
  155. data/pdf2json-0.52-source/goo/FixedPoint.h +155 -0
  156. data/pdf2json-0.52-source/goo/FixedPoint.o +0 -0
  157. data/pdf2json-0.52-source/goo/GHash.cc +380 -0
  158. data/pdf2json-0.52-source/goo/GHash.h +78 -0
  159. data/pdf2json-0.52-source/goo/GHash.o +0 -0
  160. data/pdf2json-0.52-source/goo/GList.cc +97 -0
  161. data/pdf2json-0.52-source/goo/GList.h +96 -0
  162. data/pdf2json-0.52-source/goo/GList.o +0 -0
  163. data/pdf2json-0.52-source/goo/GMutex.h +49 -0
  164. data/pdf2json-0.52-source/goo/GString.cc +724 -0
  165. data/pdf2json-0.52-source/goo/GString.cc.fixed +718 -0
  166. data/pdf2json-0.52-source/goo/GString.h +136 -0
  167. data/pdf2json-0.52-source/goo/GString.o +0 -0
  168. data/pdf2json-0.52-source/goo/ImgWriter.o +0 -0
  169. data/pdf2json-0.52-source/goo/JpegWriter.o +0 -0
  170. data/pdf2json-0.52-source/goo/Makefile +72 -0
  171. data/pdf2json-0.52-source/goo/Makefile.dep +0 -0
  172. data/pdf2json-0.52-source/goo/Makefile.in +72 -0
  173. data/pdf2json-0.52-source/goo/PNGWriter.o +0 -0
  174. data/pdf2json-0.52-source/goo/gfile.cc +731 -0
  175. data/pdf2json-0.52-source/goo/gfile.h +138 -0
  176. data/pdf2json-0.52-source/goo/gfile.o +0 -0
  177. data/pdf2json-0.52-source/goo/gmem.cc +264 -0
  178. data/pdf2json-0.52-source/goo/gmem.h +79 -0
  179. data/pdf2json-0.52-source/goo/gmem.o +0 -0
  180. data/pdf2json-0.52-source/goo/gmempp.cc +32 -0
  181. data/pdf2json-0.52-source/goo/gmempp.o +0 -0
  182. data/pdf2json-0.52-source/goo/gtypes.h +29 -0
  183. data/pdf2json-0.52-source/goo/libGoo.a +0 -0
  184. data/pdf2json-0.52-source/goo/parseargs.c +190 -0
  185. data/pdf2json-0.52-source/goo/parseargs.h +71 -0
  186. data/pdf2json-0.52-source/goo/parseargs.o +0 -0
  187. data/pdf2json-0.52-source/goo/vms_directory.c +214 -0
  188. data/pdf2json-0.52-source/goo/vms_dirent.h +67 -0
  189. data/pdf2json-0.52-source/goo/vms_make.com +82 -0
  190. data/pdf2json-0.52-source/goo/vms_sys_dirent.h +54 -0
  191. data/pdf2json-0.52-source/goo/vms_unix_time.h +102 -0
  192. data/pdf2json-0.52-source/goo/vms_unix_times.c +42 -0
  193. data/pdf2json-0.52-source/goo/vms_unlink.c +22 -0
  194. data/pdf2json-0.52-source/ms_make.bat +199 -0
  195. data/pdf2json-0.52-source/splash/.DS_Store +0 -0
  196. data/pdf2json-0.52-source/splash/Makefile +103 -0
  197. data/pdf2json-0.52-source/splash/Makefile.dep +0 -0
  198. data/pdf2json-0.52-source/splash/Makefile.in +103 -0
  199. data/pdf2json-0.52-source/splash/Splash.cc +3310 -0
  200. data/pdf2json-0.52-source/splash/Splash.h +293 -0
  201. data/pdf2json-0.52-source/splash/Splash.o +0 -0
  202. data/pdf2json-0.52-source/splash/SplashBitmap.cc +188 -0
  203. data/pdf2json-0.52-source/splash/SplashBitmap.h +64 -0
  204. data/pdf2json-0.52-source/splash/SplashBitmap.o +0 -0
  205. data/pdf2json-0.52-source/splash/SplashClip.cc +382 -0
  206. data/pdf2json-0.52-source/splash/SplashClip.h +107 -0
  207. data/pdf2json-0.52-source/splash/SplashClip.o +0 -0
  208. data/pdf2json-0.52-source/splash/SplashErrorCodes.h +32 -0
  209. data/pdf2json-0.52-source/splash/SplashFTFont.cc +357 -0
  210. data/pdf2json-0.52-source/splash/SplashFTFont.h +58 -0
  211. data/pdf2json-0.52-source/splash/SplashFTFont.o +0 -0
  212. data/pdf2json-0.52-source/splash/SplashFTFontEngine.cc +179 -0
  213. data/pdf2json-0.52-source/splash/SplashFTFontEngine.h +65 -0
  214. data/pdf2json-0.52-source/splash/SplashFTFontEngine.o +0 -0
  215. data/pdf2json-0.52-source/splash/SplashFTFontFile.cc +114 -0
  216. data/pdf2json-0.52-source/splash/SplashFTFontFile.h +73 -0
  217. data/pdf2json-0.52-source/splash/SplashFTFontFile.o +0 -0
  218. data/pdf2json-0.52-source/splash/SplashFont.cc +176 -0
  219. data/pdf2json-0.52-source/splash/SplashFont.h +104 -0
  220. data/pdf2json-0.52-source/splash/SplashFont.o +0 -0
  221. data/pdf2json-0.52-source/splash/SplashFontEngine.cc +317 -0
  222. data/pdf2json-0.52-source/splash/SplashFontEngine.h +91 -0
  223. data/pdf2json-0.52-source/splash/SplashFontEngine.o +0 -0
  224. data/pdf2json-0.52-source/splash/SplashFontFile.cc +55 -0
  225. data/pdf2json-0.52-source/splash/SplashFontFile.h +60 -0
  226. data/pdf2json-0.52-source/splash/SplashFontFile.o +0 -0
  227. data/pdf2json-0.52-source/splash/SplashFontFileID.cc +23 -0
  228. data/pdf2json-0.52-source/splash/SplashFontFileID.h +30 -0
  229. data/pdf2json-0.52-source/splash/SplashFontFileID.o +0 -0
  230. data/pdf2json-0.52-source/splash/SplashGlyphBitmap.h +26 -0
  231. data/pdf2json-0.52-source/splash/SplashMath.h +89 -0
  232. data/pdf2json-0.52-source/splash/SplashPath.cc +184 -0
  233. data/pdf2json-0.52-source/splash/SplashPath.h +121 -0
  234. data/pdf2json-0.52-source/splash/SplashPath.o +0 -0
  235. data/pdf2json-0.52-source/splash/SplashPattern.cc +40 -0
  236. data/pdf2json-0.52-source/splash/SplashPattern.h +65 -0
  237. data/pdf2json-0.52-source/splash/SplashPattern.o +0 -0
  238. data/pdf2json-0.52-source/splash/SplashScreen.cc +383 -0
  239. data/pdf2json-0.52-source/splash/SplashScreen.h +56 -0
  240. data/pdf2json-0.52-source/splash/SplashScreen.o +0 -0
  241. data/pdf2json-0.52-source/splash/SplashState.cc +165 -0
  242. data/pdf2json-0.52-source/splash/SplashState.h +103 -0
  243. data/pdf2json-0.52-source/splash/SplashState.o +0 -0
  244. data/pdf2json-0.52-source/splash/SplashT1Font.cc +287 -0
  245. data/pdf2json-0.52-source/splash/SplashT1Font.h +57 -0
  246. data/pdf2json-0.52-source/splash/SplashT1Font.o +0 -0
  247. data/pdf2json-0.52-source/splash/SplashT1FontEngine.cc +124 -0
  248. data/pdf2json-0.52-source/splash/SplashT1FontEngine.h +53 -0
  249. data/pdf2json-0.52-source/splash/SplashT1FontEngine.o +0 -0
  250. data/pdf2json-0.52-source/splash/SplashT1FontFile.cc +97 -0
  251. data/pdf2json-0.52-source/splash/SplashT1FontFile.h +58 -0
  252. data/pdf2json-0.52-source/splash/SplashT1FontFile.o +0 -0
  253. data/pdf2json-0.52-source/splash/SplashTypes.h +132 -0
  254. data/pdf2json-0.52-source/splash/SplashXPath.cc +438 -0
  255. data/pdf2json-0.52-source/splash/SplashXPath.h +100 -0
  256. data/pdf2json-0.52-source/splash/SplashXPath.o +0 -0
  257. data/pdf2json-0.52-source/splash/SplashXPathScanner.cc +428 -0
  258. data/pdf2json-0.52-source/splash/SplashXPathScanner.h +87 -0
  259. data/pdf2json-0.52-source/splash/SplashXPathScanner.o +0 -0
  260. data/pdf2json-0.52-source/splash/libsplash.a +0 -0
  261. data/pdf2json-0.52-source/splash/vms_make.com +0 -0
  262. data/pdf2json-0.52-source/src/.DS_Store +0 -0
  263. data/pdf2json-0.52-source/src/GVector.h +101 -0
  264. data/pdf2json-0.52-source/src/ImgOutputDev.cc +1243 -0
  265. data/pdf2json-0.52-source/src/ImgOutputDev.h +307 -0
  266. data/pdf2json-0.52-source/src/ImgOutputDev.o +0 -0
  267. data/pdf2json-0.52-source/src/Makefile +68 -0
  268. data/pdf2json-0.52-source/src/Makefile.in +68 -0
  269. data/pdf2json-0.52-source/src/XmlFonts.cc +367 -0
  270. data/pdf2json-0.52-source/src/XmlFonts.h +91 -0
  271. data/pdf2json-0.52-source/src/XmlFonts.o +0 -0
  272. data/pdf2json-0.52-source/src/XmlLinks.cc +101 -0
  273. data/pdf2json-0.52-source/src/XmlLinks.h +54 -0
  274. data/pdf2json-0.52-source/src/XmlLinks.o +0 -0
  275. data/pdf2json-0.52-source/src/pdf2json +0 -0
  276. data/pdf2json-0.52-source/src/pdf2json.cc +343 -0
  277. data/pdf2json-0.52-source/src/pdf2json.o +0 -0
  278. data/pdf2json-0.52-source/src/pdf2xml.dtd +22 -0
  279. data/pdf2json-0.52-source/src/pdf2xmljson.dtd +9 -0
  280. data/pdf2json-0.52-source/xpdf/.DS_Store +0 -0
  281. data/pdf2json-0.52-source/xpdf/Annot.cc +1556 -0
  282. data/pdf2json-0.52-source/xpdf/Annot.h +142 -0
  283. data/pdf2json-0.52-source/xpdf/Annot.o +0 -0
  284. data/pdf2json-0.52-source/xpdf/Array.cc +73 -0
  285. data/pdf2json-0.52-source/xpdf/Array.h +58 -0
  286. data/pdf2json-0.52-source/xpdf/Array.o +0 -0
  287. data/pdf2json-0.52-source/xpdf/BuiltinFont.cc +65 -0
  288. data/pdf2json-0.52-source/xpdf/BuiltinFont.h +57 -0
  289. data/pdf2json-0.52-source/xpdf/BuiltinFont.o +0 -0
  290. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.cc +4284 -0
  291. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.h +23 -0
  292. data/pdf2json-0.52-source/xpdf/BuiltinFontTables.o +0 -0
  293. data/pdf2json-0.52-source/xpdf/CMap.cc +408 -0
  294. data/pdf2json-0.52-source/xpdf/CMap.h +102 -0
  295. data/pdf2json-0.52-source/xpdf/CMap.o +0 -0
  296. data/pdf2json-0.52-source/xpdf/Catalog.cc +374 -0
  297. data/pdf2json-0.52-source/xpdf/Catalog.h +97 -0
  298. data/pdf2json-0.52-source/xpdf/Catalog.o +0 -0
  299. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.cc +540 -0
  300. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.h +117 -0
  301. data/pdf2json-0.52-source/xpdf/CharCodeToUnicode.o +0 -0
  302. data/pdf2json-0.52-source/xpdf/CharTypes.h +24 -0
  303. data/pdf2json-0.52-source/xpdf/CompactFontTables.h +464 -0
  304. data/pdf2json-0.52-source/xpdf/CoreOutputDev.cc +61 -0
  305. data/pdf2json-0.52-source/xpdf/CoreOutputDev.h +61 -0
  306. data/pdf2json-0.52-source/xpdf/Decrypt.cc +776 -0
  307. data/pdf2json-0.52-source/xpdf/Decrypt.h +95 -0
  308. data/pdf2json-0.52-source/xpdf/Decrypt.o +0 -0
  309. data/pdf2json-0.52-source/xpdf/Dict.cc +95 -0
  310. data/pdf2json-0.52-source/xpdf/Dict.h +77 -0
  311. data/pdf2json-0.52-source/xpdf/Dict.o +0 -0
  312. data/pdf2json-0.52-source/xpdf/Error.cc +38 -0
  313. data/pdf2json-0.52-source/xpdf/Error.h +23 -0
  314. data/pdf2json-0.52-source/xpdf/Error.o +0 -0
  315. data/pdf2json-0.52-source/xpdf/ErrorCodes.h +36 -0
  316. data/pdf2json-0.52-source/xpdf/FontEncodingTables.cc +1824 -0
  317. data/pdf2json-0.52-source/xpdf/FontEncodingTables.h +20 -0
  318. data/pdf2json-0.52-source/xpdf/FontEncodingTables.o +0 -0
  319. data/pdf2json-0.52-source/xpdf/Function.cc +1573 -0
  320. data/pdf2json-0.52-source/xpdf/Function.h +229 -0
  321. data/pdf2json-0.52-source/xpdf/Function.o +0 -0
  322. data/pdf2json-0.52-source/xpdf/Gfx.cc +4187 -0
  323. data/pdf2json-0.52-source/xpdf/Gfx.h +312 -0
  324. data/pdf2json-0.52-source/xpdf/Gfx.o +0 -0
  325. data/pdf2json-0.52-source/xpdf/GfxFont.cc +1568 -0
  326. data/pdf2json-0.52-source/xpdf/GfxFont.h +320 -0
  327. data/pdf2json-0.52-source/xpdf/GfxFont.o +0 -0
  328. data/pdf2json-0.52-source/xpdf/GfxState.cc +4137 -0
  329. data/pdf2json-0.52-source/xpdf/GfxState.h +1244 -0
  330. data/pdf2json-0.52-source/xpdf/GfxState.o +0 -0
  331. data/pdf2json-0.52-source/xpdf/GlobalParams.cc +2924 -0
  332. data/pdf2json-0.52-source/xpdf/GlobalParams.cc.old +2908 -0
  333. data/pdf2json-0.52-source/xpdf/GlobalParams.h +466 -0
  334. data/pdf2json-0.52-source/xpdf/GlobalParams.h.old +463 -0
  335. data/pdf2json-0.52-source/xpdf/GlobalParams.o +0 -0
  336. data/pdf2json-0.52-source/xpdf/ImageOutputDev.cc +195 -0
  337. data/pdf2json-0.52-source/xpdf/ImageOutputDev.h +76 -0
  338. data/pdf2json-0.52-source/xpdf/ImageOutputDev.o +0 -0
  339. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.cc +322 -0
  340. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.h +109 -0
  341. data/pdf2json-0.52-source/xpdf/JArithmeticDecoder.o +0 -0
  342. data/pdf2json-0.52-source/xpdf/JBIG2Stream.cc +3413 -0
  343. data/pdf2json-0.52-source/xpdf/JBIG2Stream.h +145 -0
  344. data/pdf2json-0.52-source/xpdf/JBIG2Stream.o +0 -0
  345. data/pdf2json-0.52-source/xpdf/JPXStream.cc +3144 -0
  346. data/pdf2json-0.52-source/xpdf/JPXStream.h +351 -0
  347. data/pdf2json-0.52-source/xpdf/JPXStream.o +0 -0
  348. data/pdf2json-0.52-source/xpdf/Lexer.cc +485 -0
  349. data/pdf2json-0.52-source/xpdf/Lexer.h +80 -0
  350. data/pdf2json-0.52-source/xpdf/Lexer.o +0 -0
  351. data/pdf2json-0.52-source/xpdf/Link.cc +806 -0
  352. data/pdf2json-0.52-source/xpdf/Link.cc.old +784 -0
  353. data/pdf2json-0.52-source/xpdf/Link.h +415 -0
  354. data/pdf2json-0.52-source/xpdf/Link.h.old +369 -0
  355. data/pdf2json-0.52-source/xpdf/Link.o +0 -0
  356. data/pdf2json-0.52-source/xpdf/Makefile +232 -0
  357. data/pdf2json-0.52-source/xpdf/Makefile.dep +0 -0
  358. data/pdf2json-0.52-source/xpdf/Makefile.in +232 -0
  359. data/pdf2json-0.52-source/xpdf/NameToCharCode.cc +116 -0
  360. data/pdf2json-0.52-source/xpdf/NameToCharCode.h +42 -0
  361. data/pdf2json-0.52-source/xpdf/NameToCharCode.o +0 -0
  362. data/pdf2json-0.52-source/xpdf/NameToUnicodeTable.h +1097 -0
  363. data/pdf2json-0.52-source/xpdf/Object.cc +231 -0
  364. data/pdf2json-0.52-source/xpdf/Object.h +303 -0
  365. data/pdf2json-0.52-source/xpdf/Object.o +0 -0
  366. data/pdf2json-0.52-source/xpdf/Outline.cc +151 -0
  367. data/pdf2json-0.52-source/xpdf/Outline.h +76 -0
  368. data/pdf2json-0.52-source/xpdf/Outline.o +0 -0
  369. data/pdf2json-0.52-source/xpdf/OutputDev.cc +131 -0
  370. data/pdf2json-0.52-source/xpdf/OutputDev.h +253 -0
  371. data/pdf2json-0.52-source/xpdf/OutputDev.o +0 -0
  372. data/pdf2json-0.52-source/xpdf/PDFCore.cc +2044 -0
  373. data/pdf2json-0.52-source/xpdf/PDFCore.h +321 -0
  374. data/pdf2json-0.52-source/xpdf/PDFDoc.cc +404 -0
  375. data/pdf2json-0.52-source/xpdf/PDFDoc.h +183 -0
  376. data/pdf2json-0.52-source/xpdf/PDFDoc.o +0 -0
  377. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.cc +44 -0
  378. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.h +16 -0
  379. data/pdf2json-0.52-source/xpdf/PDFDocEncoding.o +0 -0
  380. data/pdf2json-0.52-source/xpdf/PSOutputDev.cc +6224 -0
  381. data/pdf2json-0.52-source/xpdf/PSOutputDev.h +395 -0
  382. data/pdf2json-0.52-source/xpdf/PSOutputDev.o +0 -0
  383. data/pdf2json-0.52-source/xpdf/PSTokenizer.cc +135 -0
  384. data/pdf2json-0.52-source/xpdf/PSTokenizer.h +41 -0
  385. data/pdf2json-0.52-source/xpdf/PSTokenizer.o +0 -0
  386. data/pdf2json-0.52-source/xpdf/Page.cc +454 -0
  387. data/pdf2json-0.52-source/xpdf/Page.h +187 -0
  388. data/pdf2json-0.52-source/xpdf/Page.o +0 -0
  389. data/pdf2json-0.52-source/xpdf/Parser.cc +227 -0
  390. data/pdf2json-0.52-source/xpdf/Parser.h +59 -0
  391. data/pdf2json-0.52-source/xpdf/Parser.o +0 -0
  392. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.cc +257 -0
  393. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.h +130 -0
  394. data/pdf2json-0.52-source/xpdf/PreScanOutputDev.o +0 -0
  395. data/pdf2json-0.52-source/xpdf/SecurityHandler.cc +390 -0
  396. data/pdf2json-0.52-source/xpdf/SecurityHandler.h +160 -0
  397. data/pdf2json-0.52-source/xpdf/SecurityHandler.o +0 -0
  398. data/pdf2json-0.52-source/xpdf/SplashOutputDev.cc +2845 -0
  399. data/pdf2json-0.52-source/xpdf/SplashOutputDev.h +247 -0
  400. data/pdf2json-0.52-source/xpdf/SplashOutputDev.o +0 -0
  401. data/pdf2json-0.52-source/xpdf/Stream-CCITT.h +459 -0
  402. data/pdf2json-0.52-source/xpdf/Stream.cc +4627 -0
  403. data/pdf2json-0.52-source/xpdf/Stream.h +858 -0
  404. data/pdf2json-0.52-source/xpdf/Stream.o +0 -0
  405. data/pdf2json-0.52-source/xpdf/TextOutputDev.cc +4090 -0
  406. data/pdf2json-0.52-source/xpdf/TextOutputDev.h +661 -0
  407. data/pdf2json-0.52-source/xpdf/TextOutputDev.o +0 -0
  408. data/pdf2json-0.52-source/xpdf/UTF8.h +56 -0
  409. data/pdf2json-0.52-source/xpdf/UnicodeMap.cc +302 -0
  410. data/pdf2json-0.52-source/xpdf/UnicodeMap.cc.old +293 -0
  411. data/pdf2json-0.52-source/xpdf/UnicodeMap.h +135 -0
  412. data/pdf2json-0.52-source/xpdf/UnicodeMap.h.old +123 -0
  413. data/pdf2json-0.52-source/xpdf/UnicodeMap.o +0 -0
  414. data/pdf2json-0.52-source/xpdf/UnicodeMapTables.h +361 -0
  415. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.cc +949 -0
  416. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.h +20 -0
  417. data/pdf2json-0.52-source/xpdf/UnicodeTypeTable.o +0 -0
  418. data/pdf2json-0.52-source/xpdf/XPDFApp.cc +447 -0
  419. data/pdf2json-0.52-source/xpdf/XPDFApp.h +114 -0
  420. data/pdf2json-0.52-source/xpdf/XPDFCore.cc +1655 -0
  421. data/pdf2json-0.52-source/xpdf/XPDFCore.h +251 -0
  422. data/pdf2json-0.52-source/xpdf/XPDFTree.cc +931 -0
  423. data/pdf2json-0.52-source/xpdf/XPDFTree.h +45 -0
  424. data/pdf2json-0.52-source/xpdf/XPDFTreeP.h +87 -0
  425. data/pdf2json-0.52-source/xpdf/XPDFViewer.cc +3488 -0
  426. data/pdf2json-0.52-source/xpdf/XPDFViewer.h +352 -0
  427. data/pdf2json-0.52-source/xpdf/XRef.cc +896 -0
  428. data/pdf2json-0.52-source/xpdf/XRef.h +133 -0
  429. data/pdf2json-0.52-source/xpdf/XRef.o +0 -0
  430. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.cc +262 -0
  431. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.h +341 -0
  432. data/pdf2json-0.52-source/xpdf/XpdfPluginAPI.o +0 -0
  433. data/pdf2json-0.52-source/xpdf/about-text.h +48 -0
  434. data/pdf2json-0.52-source/xpdf/about.xbm +6 -0
  435. data/pdf2json-0.52-source/xpdf/backArrow.xbm +6 -0
  436. data/pdf2json-0.52-source/xpdf/backArrowDis.xbm +6 -0
  437. data/pdf2json-0.52-source/xpdf/config.h +112 -0
  438. data/pdf2json-0.52-source/xpdf/dblLeftArrow.xbm +6 -0
  439. data/pdf2json-0.52-source/xpdf/dblLeftArrowDis.xbm +6 -0
  440. data/pdf2json-0.52-source/xpdf/dblRightArrow.xbm +6 -0
  441. data/pdf2json-0.52-source/xpdf/dblRightArrowDis.xbm +6 -0
  442. data/pdf2json-0.52-source/xpdf/find.xbm +6 -0
  443. data/pdf2json-0.52-source/xpdf/findDis.xbm +6 -0
  444. data/pdf2json-0.52-source/xpdf/forwardArrow.xbm +6 -0
  445. data/pdf2json-0.52-source/xpdf/forwardArrowDis.xbm +6 -0
  446. data/pdf2json-0.52-source/xpdf/leftArrow.xbm +5 -0
  447. data/pdf2json-0.52-source/xpdf/leftArrowDis.xbm +5 -0
  448. data/pdf2json-0.52-source/xpdf/libXpdf.a +0 -0
  449. data/pdf2json-0.52-source/xpdf/pdffonts +0 -0
  450. data/pdf2json-0.52-source/xpdf/pdffonts.cc +298 -0
  451. data/pdf2json-0.52-source/xpdf/pdffonts.o +0 -0
  452. data/pdf2json-0.52-source/xpdf/pdfimages +0 -0
  453. data/pdf2json-0.52-source/xpdf/pdfimages.cc +155 -0
  454. data/pdf2json-0.52-source/xpdf/pdfimages.o +0 -0
  455. data/pdf2json-0.52-source/xpdf/pdfinfo +0 -0
  456. data/pdf2json-0.52-source/xpdf/pdfinfo.cc +387 -0
  457. data/pdf2json-0.52-source/xpdf/pdfinfo.o +0 -0
  458. data/pdf2json-0.52-source/xpdf/pdftoppm.cc +203 -0
  459. data/pdf2json-0.52-source/xpdf/pdftops +0 -0
  460. data/pdf2json-0.52-source/xpdf/pdftops.cc +344 -0
  461. data/pdf2json-0.52-source/xpdf/pdftops.o +0 -0
  462. data/pdf2json-0.52-source/xpdf/pdftotext +0 -0
  463. data/pdf2json-0.52-source/xpdf/pdftotext.cc +333 -0
  464. data/pdf2json-0.52-source/xpdf/pdftotext.o +0 -0
  465. data/pdf2json-0.52-source/xpdf/print.xbm +6 -0
  466. data/pdf2json-0.52-source/xpdf/printDis.xbm +6 -0
  467. data/pdf2json-0.52-source/xpdf/rightArrow.xbm +5 -0
  468. data/pdf2json-0.52-source/xpdf/rightArrowDis.xbm +5 -0
  469. data/pdf2json-0.52-source/xpdf/vms_make.com +129 -0
  470. data/pdf2json-0.52-source/xpdf/xpdf.cc +344 -0
  471. data/pdf2json-0.52-source/xpdf/xpdfIcon.xpm +62 -0
  472. data/pdf2json.gemspec +29 -0
  473. metadata +518 -0
@@ -0,0 +1,45 @@
1
+ //========================================================================
2
+ //
3
+ // XPDFTree.h
4
+ //
5
+ // Copyright 2002-2003 Glyph & Cog, LLC
6
+ //
7
+ //========================================================================
8
+
9
+ #ifndef XPDFTREE_H
10
+ #define XPDFTREE_H
11
+
12
+ #include <Xm/Xm.h>
13
+
14
+ extern "C" {
15
+
16
+ externalref WidgetClass xpdfTreeWidgetClass;
17
+
18
+ typedef struct _XPDFTreeClassRec *XPDFTreeWidgetClass;
19
+ typedef struct _XPDFTreeRec *XPDFTreeWidget;
20
+
21
+ #ifndef XPDFIsTree
22
+ #define XPDFIsTree(w) XtIsSubclass(w, xpdfTreeWidgetClass)
23
+ #endif
24
+
25
+ #define XPDFNentryParent "entryParent"
26
+ #define XPDFNentryExpanded "entryExpanded"
27
+ #define XPDFNentryPosition "entryPosition"
28
+ #define XPDFNselectionCallback "selectionCallback"
29
+
30
+ #define XPDFCentryParent "EntryParent"
31
+ #define XPDFCentryExpanded "EntryExpanded"
32
+ #define XPDFCentryPosition "EntryPosition"
33
+
34
+ typedef struct {
35
+ int reason;
36
+ XEvent *event;
37
+ Widget selectedItem;
38
+ } XPDFTreeSelectCallbackStruct;
39
+
40
+ extern Widget XPDFCreateTree(Widget parent, char *name,
41
+ ArgList argList, Cardinal argCount);
42
+
43
+ } // extern "C"
44
+
45
+ #endif
@@ -0,0 +1,87 @@
1
+ //========================================================================
2
+ //
3
+ // XPDFTreeP.h
4
+ //
5
+ // Copyright 2002-2003 Glyph & Cog, LLC
6
+ //
7
+ //========================================================================
8
+
9
+ #ifndef XPDFTREEP_H
10
+ #define XPDFTREEP_H
11
+
12
+ #include <Xm/ManagerP.h>
13
+ #include "XPDFTree.h"
14
+
15
+ extern "C" {
16
+
17
+ typedef void (*XPDFLayoutProc)(Widget widget, Widget instigator);
18
+ typedef void (*XPDFCalcSizeProc)(Widget widget, Widget instigator,
19
+ Dimension *totalWidth,
20
+ Dimension *totalHeight);
21
+ typedef Boolean (*XPDFNeedRelayoutProc)(Widget oldWidget, Widget newWidget);
22
+
23
+ #define XPDFInheritCreateGC ((XtWidgetProc)_XtInherit)
24
+ #define XPDFInheritDestroyGC ((XtWidgetProc)_XtInherit)
25
+ #define XPDFInheritLayout ((XPDFLayoutProc)_XtInherit)
26
+ #define XPDFInheritCalcSize ((XPDFCalcSizeProc)_XtInherit)
27
+ #define XPDFInheritNeedRelayout ((XPDFNeedRelayoutProc)_XtInherit)
28
+
29
+ typedef struct {
30
+ XtWidgetProc createGC;
31
+ XtWidgetProc destroyGC;
32
+ XPDFLayoutProc layout;
33
+ XPDFCalcSizeProc calcSize;
34
+ XPDFNeedRelayoutProc needRelayout;
35
+ XtPointer extension;
36
+ } XPDFTreeClassPart;
37
+
38
+ typedef struct _XPDFTreeClassRec {
39
+ CoreClassPart coreClass;
40
+ CompositeClassPart compositeClass;
41
+ ConstraintClassPart constraintClass;
42
+ XmManagerClassPart managerClass;
43
+ XPDFTreeClassPart treeClass;
44
+ } XPDFTreeClassRec;
45
+
46
+ externalref XPDFTreeClassRec xpdfTreeClassRec;
47
+
48
+ typedef struct _XPDFTreeEntry XPDFTreeEntry;
49
+
50
+ typedef struct {
51
+ Dimension marginWidth;
52
+ Dimension marginHeight;
53
+ XtCallbackList selectCallback;
54
+ GC plainGC;
55
+ GC dottedGC;
56
+ XPDFTreeEntry *root;
57
+ int redrawY;
58
+ } XPDFTreePart;
59
+
60
+ typedef struct _XPDFTreeRec {
61
+ CorePart core;
62
+ CompositePart composite;
63
+ ConstraintPart constraint;
64
+ XmManagerPart manager;
65
+ XPDFTreePart tree;
66
+ } XPDFTreeRec;
67
+
68
+ #define XPDFTreeIndex (XmManagerIndex + 1)
69
+
70
+ typedef struct _XPDFTreeConstraintPart {
71
+ Widget entryParent;
72
+ Boolean entryExpanded;
73
+ int entryPosition;
74
+ XPDFTreeEntry *e;
75
+ } XPDFTreeConstraintPart, *XPDFTreeConstraint;
76
+
77
+ typedef struct _XPDFTreeConstraintRec {
78
+ XmManagerConstraintPart manager;
79
+ XPDFTreeConstraintPart tree;
80
+ } XPDFTreeConstraintRec, *XPDFTreeConstraintPtr;
81
+
82
+ #define XPDFTreeCPart(w) \
83
+ (&((XPDFTreeConstraintPtr)(w)->core.constraints)->tree)
84
+
85
+ } // extern "C"
86
+
87
+ #endif
@@ -0,0 +1,3488 @@
1
+ //========================================================================
2
+ //
3
+ // XPDFViewer.cc
4
+ //
5
+ // Copyright 2002-2003 Glyph & Cog, LLC
6
+ //
7
+ //========================================================================
8
+
9
+ #include <aconf.h>
10
+
11
+ #ifdef USE_GCC_PRAGMAS
12
+ #pragma implementation
13
+ #endif
14
+
15
+ #include <stdlib.h>
16
+ #include <string.h>
17
+ #include <ctype.h>
18
+ #include <X11/keysym.h>
19
+ #include <X11/cursorfont.h>
20
+ #ifdef HAVE_X11_XPM_H
21
+ #include <X11/xpm.h>
22
+ #endif
23
+ #if defined(__sgi) && (XmVERSION <= 1)
24
+ #define Object XtObject
25
+ #include <Sgm/HPanedW.h>
26
+ #undef Object
27
+ #endif
28
+ #include "gmem.h"
29
+ #include "gfile.h"
30
+ #include "GString.h"
31
+ #include "GList.h"
32
+ #include "Error.h"
33
+ #include "GlobalParams.h"
34
+ #include "PDFDoc.h"
35
+ #include "Link.h"
36
+ #include "ErrorCodes.h"
37
+ #include "Outline.h"
38
+ #include "UnicodeMap.h"
39
+ #ifndef DISABLE_OUTLINE
40
+ #define Object XtObject
41
+ #include "XPDFTree.h"
42
+ #undef Object
43
+ #endif
44
+ #include "XPDFApp.h"
45
+ #include "XPDFViewer.h"
46
+ #include "PSOutputDev.h"
47
+ #include "config.h"
48
+
49
+ // these macro defns conflict with xpdf's Object class
50
+ #ifdef LESSTIF_VERSION
51
+ #undef XtDisplay
52
+ #undef XtScreen
53
+ #undef XtWindow
54
+ #undef XtParent
55
+ #undef XtIsRealized
56
+ #endif
57
+
58
+ #if XmVERSION <= 1
59
+ #define XmSET True
60
+ #define XmUNSET False
61
+ #endif
62
+
63
+ // hack around old X includes which are missing these symbols
64
+ #ifndef XK_Page_Up
65
+ #define XK_Page_Up 0xFF55
66
+ #endif
67
+ #ifndef XK_Page_Down
68
+ #define XK_Page_Down 0xFF56
69
+ #endif
70
+ #ifndef XK_KP_Home
71
+ #define XK_KP_Home 0xFF95
72
+ #endif
73
+ #ifndef XK_KP_Left
74
+ #define XK_KP_Left 0xFF96
75
+ #endif
76
+ #ifndef XK_KP_Up
77
+ #define XK_KP_Up 0xFF97
78
+ #endif
79
+ #ifndef XK_KP_Right
80
+ #define XK_KP_Right 0xFF98
81
+ #endif
82
+ #ifndef XK_KP_Down
83
+ #define XK_KP_Down 0xFF99
84
+ #endif
85
+ #ifndef XK_KP_Prior
86
+ #define XK_KP_Prior 0xFF9A
87
+ #endif
88
+ #ifndef XK_KP_Page_Up
89
+ #define XK_KP_Page_Up 0xFF9A
90
+ #endif
91
+ #ifndef XK_KP_Next
92
+ #define XK_KP_Next 0xFF9B
93
+ #endif
94
+ #ifndef XK_KP_Page_Down
95
+ #define XK_KP_Page_Down 0xFF9B
96
+ #endif
97
+ #ifndef XK_KP_End
98
+ #define XK_KP_End 0xFF9C
99
+ #endif
100
+ #ifndef XK_KP_Begin
101
+ #define XK_KP_Begin 0xFF9D
102
+ #endif
103
+ #ifndef XK_KP_Insert
104
+ #define XK_KP_Insert 0xFF9E
105
+ #endif
106
+ #ifndef XK_KP_Delete
107
+ #define XK_KP_Delete 0xFF9F
108
+ #endif
109
+
110
+ //------------------------------------------------------------------------
111
+ // GUI includes
112
+ //------------------------------------------------------------------------
113
+
114
+ #include "xpdfIcon.xpm"
115
+ #include "leftArrow.xbm"
116
+ #include "leftArrowDis.xbm"
117
+ #include "dblLeftArrow.xbm"
118
+ #include "dblLeftArrowDis.xbm"
119
+ #include "rightArrow.xbm"
120
+ #include "rightArrowDis.xbm"
121
+ #include "dblRightArrow.xbm"
122
+ #include "dblRightArrowDis.xbm"
123
+ #include "backArrow.xbm"
124
+ #include "backArrowDis.xbm"
125
+ #include "forwardArrow.xbm"
126
+ #include "forwardArrowDis.xbm"
127
+ #include "find.xbm"
128
+ #include "findDis.xbm"
129
+ #include "print.xbm"
130
+ #include "printDis.xbm"
131
+ #include "about.xbm"
132
+ #include "about-text.h"
133
+
134
+ //------------------------------------------------------------------------
135
+
136
+ struct ZoomMenuInfo {
137
+ char *label;
138
+ double zoom;
139
+ };
140
+
141
+ static ZoomMenuInfo zoomMenuInfo[nZoomMenuItems] = {
142
+ { "400%", 400 },
143
+ { "200%", 200 },
144
+ { "150%", 150 },
145
+ { "125%", 125 },
146
+ { "100%", 100 },
147
+ { "50%", 50 },
148
+ { "25%", 25 },
149
+ { "12.5%", 12.5 },
150
+ { "fit page", zoomPage },
151
+ { "fit width", zoomWidth }
152
+ };
153
+
154
+ #define maxZoomIdx 0
155
+ #define defZoomIdx 3
156
+ #define minZoomIdx 7
157
+ #define zoomPageIdx 8
158
+ #define zoomWidthIdx 9
159
+
160
+ //------------------------------------------------------------------------
161
+
162
+ #define cmdMaxArgs 2
163
+
164
+ XPDFViewerCmd XPDFViewer::cmdTab[] = {
165
+ { "about", 0, gFalse, gFalse, &XPDFViewer::cmdAbout },
166
+ { "closeOutline", 0, gFalse, gFalse, &XPDFViewer::cmdCloseOutline },
167
+ { "closeWindow", 0, gFalse, gFalse, &XPDFViewer::cmdCloseWindow },
168
+ { "continuousMode", 0, gFalse, gFalse, &XPDFViewer::cmdContinuousMode },
169
+ { "endPan", 0, gTrue, gTrue, &XPDFViewer::cmdEndPan },
170
+ { "endSelection", 0, gTrue, gTrue, &XPDFViewer::cmdEndSelection },
171
+ { "find", 0, gTrue, gFalse, &XPDFViewer::cmdFind },
172
+ { "findNext", 0, gTrue, gFalse, &XPDFViewer::cmdFindNext },
173
+ { "focusToDocWin", 0, gFalse, gFalse, &XPDFViewer::cmdFocusToDocWin },
174
+ { "focusToPageNum", 0, gFalse, gFalse, &XPDFViewer::cmdFocusToPageNum },
175
+ { "followLink", 0, gTrue, gTrue, &XPDFViewer::cmdFollowLink },
176
+ { "followLinkInNewWin", 0, gTrue, gTrue, &XPDFViewer::cmdFollowLinkInNewWin },
177
+ { "followLinkInNewWinNoSel", 0, gTrue, gTrue, &XPDFViewer::cmdFollowLinkInNewWinNoSel },
178
+ { "followLinkNoSel", 0, gTrue, gTrue, &XPDFViewer::cmdFollowLinkNoSel },
179
+ { "fullScreenMode", 0, gFalse, gFalse, &XPDFViewer::cmdFullScreenMode },
180
+ { "goBackward", 0, gFalse, gFalse, &XPDFViewer::cmdGoBackward },
181
+ { "goForward", 0, gFalse, gFalse, &XPDFViewer::cmdGoForward },
182
+ { "gotoDest", 1, gTrue, gFalse, &XPDFViewer::cmdGotoDest },
183
+ { "gotoLastPage", 0, gTrue, gFalse, &XPDFViewer::cmdGotoLastPage },
184
+ { "gotoLastPageNoScroll", 0, gTrue, gFalse, &XPDFViewer::cmdGotoLastPageNoScroll },
185
+ { "gotoPage", 1, gTrue, gFalse, &XPDFViewer::cmdGotoPage },
186
+ { "gotoPageNoScroll", 1, gTrue, gFalse, &XPDFViewer::cmdGotoPageNoScroll },
187
+ { "nextPage", 0, gTrue, gFalse, &XPDFViewer::cmdNextPage },
188
+ { "nextPageNoScroll", 0, gTrue, gFalse, &XPDFViewer::cmdNextPageNoScroll },
189
+ { "open", 0, gFalse, gFalse, &XPDFViewer::cmdOpen },
190
+ { "openFile", 1, gFalse, gFalse, &XPDFViewer::cmdOpenFile },
191
+ { "openFileAtDest", 2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtDest },
192
+ { "openFileAtDestInNewWin", 2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtDestInNewWin },
193
+ { "openFileAtPage", 2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtPage },
194
+ { "openFileAtPageInNewWin", 2, gFalse, gFalse, &XPDFViewer::cmdOpenFileAtPageInNewWin },
195
+ { "openFileInNewWin", 1, gFalse, gFalse, &XPDFViewer::cmdOpenFileInNewWin },
196
+ { "openInNewWin", 0, gFalse, gFalse, &XPDFViewer::cmdOpenInNewWin },
197
+ { "openOutline", 0, gFalse, gFalse, &XPDFViewer::cmdOpenOutline },
198
+ { "pageDown", 0, gTrue, gFalse, &XPDFViewer::cmdPageDown },
199
+ { "pageUp", 0, gTrue, gFalse, &XPDFViewer::cmdPageUp },
200
+ { "postPopupMenu", 0, gFalse, gTrue, &XPDFViewer::cmdPostPopupMenu },
201
+ { "prevPage", 0, gTrue, gFalse, &XPDFViewer::cmdPrevPage },
202
+ { "prevPageNoScroll", 0, gTrue, gFalse, &XPDFViewer::cmdPrevPageNoScroll },
203
+ { "print", 0, gTrue, gFalse, &XPDFViewer::cmdPrint },
204
+ { "quit", 0, gFalse, gFalse, &XPDFViewer::cmdQuit },
205
+ { "raise", 0, gFalse, gFalse, &XPDFViewer::cmdRaise },
206
+ { "redraw", 0, gTrue, gFalse, &XPDFViewer::cmdRedraw },
207
+ { "reload", 0, gTrue, gFalse, &XPDFViewer::cmdReload },
208
+ { "run", 1, gFalse, gFalse, &XPDFViewer::cmdRun },
209
+ { "scrollDown", 1, gTrue, gFalse, &XPDFViewer::cmdScrollDown },
210
+ { "scrollDownNextPage", 1, gTrue, gFalse, &XPDFViewer::cmdScrollDownNextPage },
211
+ { "scrollLeft", 1, gTrue, gFalse, &XPDFViewer::cmdScrollLeft },
212
+ { "scrollOutlineDown", 1, gTrue, gFalse, &XPDFViewer::cmdScrollOutlineDown },
213
+ { "scrollOutlineUp", 1, gTrue, gFalse, &XPDFViewer::cmdScrollOutlineUp },
214
+ { "scrollRight", 1, gTrue, gFalse, &XPDFViewer::cmdScrollRight },
215
+ { "scrollToBottomEdge", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToBottomEdge },
216
+ { "scrollToBottomRight", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToBottomRight },
217
+ { "scrollToLeftEdge", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToLeftEdge },
218
+ { "scrollToRightEdge", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToRightEdge },
219
+ { "scrollToTopEdge", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToTopEdge },
220
+ { "scrollToTopLeft", 0, gTrue, gFalse, &XPDFViewer::cmdScrollToTopLeft },
221
+ { "scrollUp", 1, gTrue, gFalse, &XPDFViewer::cmdScrollUp },
222
+ { "scrollUpPrevPage", 1, gTrue, gFalse, &XPDFViewer::cmdScrollUpPrevPage },
223
+ { "singlePageMode", 0, gFalse, gFalse, &XPDFViewer::cmdSinglePageMode },
224
+ { "startPan", 0, gTrue, gTrue, &XPDFViewer::cmdStartPan },
225
+ { "startSelection", 0, gTrue, gTrue, &XPDFViewer::cmdStartSelection },
226
+ { "toggleContinuousMode", 0, gFalse, gFalse, &XPDFViewer::cmdToggleContinuousMode },
227
+ { "toggleFullScreenMode", 0, gFalse, gFalse, &XPDFViewer::cmdToggleFullScreenMode },
228
+ { "toggleOutline", 0, gFalse, gFalse, &XPDFViewer::cmdToggleOutline },
229
+ { "windowMode", 0, gFalse, gFalse, &XPDFViewer::cmdWindowMode },
230
+ { "zoomFitPage", 0, gFalse, gFalse, &XPDFViewer::cmdZoomFitPage },
231
+ { "zoomFitWidth", 0, gFalse, gFalse, &XPDFViewer::cmdZoomFitWidth },
232
+ { "zoomIn", 0, gFalse, gFalse, &XPDFViewer::cmdZoomIn },
233
+ { "zoomOut", 0, gFalse, gFalse, &XPDFViewer::cmdZoomOut },
234
+ { "zoomPercent", 1, gFalse, gFalse, &XPDFViewer::cmdZoomPercent },
235
+ { "zoomToSelection", 0, gTrue, gFalse, &XPDFViewer::cmdZoomToSelection }
236
+ };
237
+
238
+ #define nCmds (sizeof(cmdTab) / sizeof(XPDFViewerCmd))
239
+
240
+ //------------------------------------------------------------------------
241
+
242
+ XPDFViewer::XPDFViewer(XPDFApp *appA, GString *fileName,
243
+ int pageA, GString *destName, GBool fullScreen,
244
+ GString *ownerPassword, GString *userPassword) {
245
+ LinkDest *dest;
246
+ int pg;
247
+ double z;
248
+
249
+ app = appA;
250
+ win = NULL;
251
+ core = NULL;
252
+ ok = gFalse;
253
+ #ifndef DISABLE_OUTLINE
254
+ outlineLabels = NULL;
255
+ outlineLabelsLength = outlineLabelsSize = 0;
256
+ outlinePaneWidth = 175;
257
+ #endif
258
+
259
+ // do Motif-specific initialization and create the window;
260
+ // this also creates the core object
261
+ initWindow(fullScreen);
262
+ initAboutDialog();
263
+ initFindDialog();
264
+ initPrintDialog();
265
+ openDialog = NULL;
266
+ saveAsDialog = NULL;
267
+
268
+ dest = NULL; // make gcc happy
269
+ pg = pageA; // make gcc happy
270
+
271
+ if (fileName) {
272
+ if (loadFile(fileName, ownerPassword, userPassword)) {
273
+ getPageAndDest(pageA, destName, &pg, &dest);
274
+ #ifndef DISABLE_OUTLINE
275
+ if (outlineScroll != None &&
276
+ core->getDoc()->getOutline()->getItems() &&
277
+ core->getDoc()->getOutline()->getItems()->getLength() > 0) {
278
+ XtVaSetValues(outlineScroll, XmNwidth, outlinePaneWidth, NULL);
279
+ }
280
+ #endif
281
+ } else {
282
+ return;
283
+ }
284
+ }
285
+ core->resizeToPage(pg);
286
+
287
+ // map the window -- we do this after calling resizeToPage to avoid
288
+ // an annoying on-screen resize
289
+ mapWindow();
290
+
291
+ // display the first page
292
+ z = core->getZoom();
293
+ if (dest) {
294
+ displayDest(dest, z, core->getRotate(), gTrue);
295
+ delete dest;
296
+ } else {
297
+ displayPage(pg, z, core->getRotate(), gTrue, gTrue);
298
+ }
299
+
300
+ ok = gTrue;
301
+ }
302
+
303
+ XPDFViewer::XPDFViewer(XPDFApp *appA, PDFDoc *doc, int pageA,
304
+ GString *destName, GBool fullScreen) {
305
+ LinkDest *dest;
306
+ int pg;
307
+ double z;
308
+
309
+ app = appA;
310
+ win = NULL;
311
+ core = NULL;
312
+ ok = gFalse;
313
+ #ifndef DISABLE_OUTLINE
314
+ outlineLabels = NULL;
315
+ outlineLabelsLength = outlineLabelsSize = 0;
316
+ outlinePaneWidth = 175;
317
+ #endif
318
+
319
+ // do Motif-specific initialization and create the window;
320
+ // this also creates the core object
321
+ initWindow(fullScreen);
322
+ initAboutDialog();
323
+ initFindDialog();
324
+ initPrintDialog();
325
+ openDialog = NULL;
326
+ saveAsDialog = NULL;
327
+
328
+ dest = NULL; // make gcc happy
329
+ pg = pageA; // make gcc happy
330
+
331
+ if (doc) {
332
+ core->loadDoc(doc);
333
+ getPageAndDest(pageA, destName, &pg, &dest);
334
+ #ifndef DISABLE_OUTLINE
335
+ if (outlineScroll != None &&
336
+ core->getDoc()->getOutline()->getItems() &&
337
+ core->getDoc()->getOutline()->getItems()->getLength() > 0) {
338
+ XtVaSetValues(outlineScroll, XmNwidth, outlinePaneWidth, NULL);
339
+ }
340
+ #endif
341
+ }
342
+ core->resizeToPage(pg);
343
+
344
+ // map the window -- we do this after calling resizeToPage to avoid
345
+ // an annoying on-screen resize
346
+ mapWindow();
347
+
348
+ // display the first page
349
+ z = core->getZoom();
350
+ if (dest) {
351
+ displayDest(dest, z, core->getRotate(), gTrue);
352
+ delete dest;
353
+ } else {
354
+ displayPage(pg, z, core->getRotate(), gTrue, gTrue);
355
+ }
356
+
357
+ ok = gTrue;
358
+ }
359
+
360
+ XPDFViewer::~XPDFViewer() {
361
+ delete core;
362
+ XmFontListFree(aboutBigFont);
363
+ XmFontListFree(aboutVersionFont);
364
+ XmFontListFree(aboutFixedFont);
365
+ closeWindow();
366
+ #ifndef DISABLE_OUTLINE
367
+ if (outlineLabels) {
368
+ gfree(outlineLabels);
369
+ }
370
+ #endif
371
+ }
372
+
373
+ void XPDFViewer::open(GString *fileName, int pageA, GString *destName) {
374
+ LinkDest *dest;
375
+ int pg;
376
+ double z;
377
+
378
+ if (!core->getDoc() || fileName->cmp(core->getDoc()->getFileName())) {
379
+ if (!loadFile(fileName, NULL, NULL)) {
380
+ return;
381
+ }
382
+ }
383
+ getPageAndDest(pageA, destName, &pg, &dest);
384
+ z = core->getZoom();
385
+ if (dest) {
386
+ displayDest(dest, z, core->getRotate(), gTrue);
387
+ delete dest;
388
+ } else {
389
+ displayPage(pg, z, core->getRotate(), gTrue, gTrue);
390
+ }
391
+ }
392
+
393
+ void XPDFViewer::clear() {
394
+ char *title;
395
+ XmString s;
396
+
397
+ core->clear();
398
+
399
+ // set up title, number-of-pages display
400
+ title = app->getTitle() ? app->getTitle()->getCString()
401
+ : (char *)xpdfAppName;
402
+ XtVaSetValues(win, XmNtitle, title, XmNiconName, title, NULL);
403
+ s = XmStringCreateLocalized("");
404
+ XtVaSetValues(pageNumText, XmNlabelString, s, NULL);
405
+ XmStringFree(s);
406
+ s = XmStringCreateLocalized(" of 0");
407
+ XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL);
408
+ XmStringFree(s);
409
+
410
+ // disable buttons
411
+ XtVaSetValues(prevTenPageBtn, XmNsensitive, False, NULL);
412
+ XtVaSetValues(prevPageBtn, XmNsensitive, False, NULL);
413
+ XtVaSetValues(nextTenPageBtn, XmNsensitive, False, NULL);
414
+ XtVaSetValues(nextPageBtn, XmNsensitive, False, NULL);
415
+
416
+ // remove the old outline
417
+ #ifndef DISABLE_OUTLINE
418
+ setupOutline();
419
+ #endif
420
+ }
421
+
422
+ //------------------------------------------------------------------------
423
+ // load / display
424
+ //------------------------------------------------------------------------
425
+
426
+ GBool XPDFViewer::loadFile(GString *fileName, GString *ownerPassword,
427
+ GString *userPassword) {
428
+ return core->loadFile(fileName, ownerPassword, userPassword) == errNone;
429
+ }
430
+
431
+ void XPDFViewer::reloadFile() {
432
+ int pg;
433
+
434
+ if (!core->getDoc()) {
435
+ return;
436
+ }
437
+ pg = core->getPageNum();
438
+ loadFile(core->getDoc()->getFileName());
439
+ if (pg > core->getDoc()->getNumPages()) {
440
+ pg = core->getDoc()->getNumPages();
441
+ }
442
+ displayPage(pg, core->getZoom(), core->getRotate(), gFalse, gFalse);
443
+ }
444
+
445
+ void XPDFViewer::displayPage(int pageA, double zoomA, int rotateA,
446
+ GBool scrollToTop, GBool addToHist) {
447
+ core->displayPage(pageA, zoomA, rotateA, scrollToTop, addToHist);
448
+ }
449
+
450
+ void XPDFViewer::displayDest(LinkDest *dest, double zoomA, int rotateA,
451
+ GBool addToHist) {
452
+ core->displayDest(dest, zoomA, rotateA, addToHist);
453
+ }
454
+
455
+ void XPDFViewer::getPageAndDest(int pageA, GString *destName,
456
+ int *pageOut, LinkDest **destOut) {
457
+ Ref pageRef;
458
+
459
+ // find the page number for a named destination
460
+ *pageOut = pageA;
461
+ *destOut = NULL;
462
+ if (destName && (*destOut = core->getDoc()->findDest(destName))) {
463
+ if ((*destOut)->isPageRef()) {
464
+ pageRef = (*destOut)->getPageRef();
465
+ *pageOut = core->getDoc()->findPage(pageRef.num, pageRef.gen);
466
+ } else {
467
+ *pageOut = (*destOut)->getPageNum();
468
+ }
469
+ }
470
+
471
+ if (*pageOut <= 0) {
472
+ *pageOut = 1;
473
+ }
474
+ if (*pageOut > core->getDoc()->getNumPages()) {
475
+ *pageOut = core->getDoc()->getNumPages();
476
+ }
477
+ }
478
+
479
+ //------------------------------------------------------------------------
480
+ // hyperlinks / actions
481
+ //------------------------------------------------------------------------
482
+
483
+ void XPDFViewer::doLink(int wx, int wy, GBool onlyIfNoSelection,
484
+ GBool newWin) {
485
+ XPDFViewer *newViewer;
486
+ LinkAction *action;
487
+ int pg, selPg;
488
+ double xu, yu, selULX, selULY, selLRX, selLRY;
489
+
490
+ if (core->getHyperlinksEnabled() &&
491
+ core->cvtWindowToUser(wx, wy, &pg, &xu, &yu) &&
492
+ !(onlyIfNoSelection &&
493
+ core->getSelection(&selPg, &selULX, &selULY, &selLRX, &selLRY))) {
494
+ if ((action = core->findLink(pg, xu, yu))) {
495
+ if (newWin &&
496
+ core->getDoc()->getFileName() &&
497
+ (action->getKind() == actionGoTo ||
498
+ action->getKind() == actionGoToR ||
499
+ (action->getKind() == actionNamed &&
500
+ ((LinkNamed *)action)->getName()->cmp("Quit")))) {
501
+ newViewer = app->open(core->getDoc()->getFileName());
502
+ newViewer->core->doAction(action);
503
+ } else {
504
+ core->doAction(action);
505
+ }
506
+ }
507
+ }
508
+ }
509
+
510
+ void XPDFViewer::actionCbk(void *data, char *action) {
511
+ XPDFViewer *viewer = (XPDFViewer *)data;
512
+
513
+ if (!strcmp(action, "Quit")) {
514
+ viewer->app->quit();
515
+ }
516
+ }
517
+
518
+ //------------------------------------------------------------------------
519
+ // keyboard/mouse input
520
+ //------------------------------------------------------------------------
521
+
522
+ void XPDFViewer::keyPressCbk(void *data, KeySym key, Guint modifiers,
523
+ XEvent *event) {
524
+ XPDFViewer *viewer = (XPDFViewer *)data;
525
+ int keyCode;
526
+ GList *cmds;
527
+ int i;
528
+
529
+ if (key >= 0x20 && key <= 0xfe) {
530
+ keyCode = (int)key;
531
+ } else if (key == XK_Tab ||
532
+ key == XK_KP_Tab) {
533
+ keyCode = xpdfKeyCodeTab;
534
+ } else if (key == XK_Return) {
535
+ keyCode = xpdfKeyCodeReturn;
536
+ } else if (key == XK_KP_Enter) {
537
+ keyCode = xpdfKeyCodeEnter;
538
+ } else if (key == XK_BackSpace) {
539
+ keyCode = xpdfKeyCodeBackspace;
540
+ } else if (key == XK_Insert ||
541
+ key == XK_KP_Insert) {
542
+ keyCode = xpdfKeyCodeInsert;
543
+ } else if (key == XK_Delete ||
544
+ key == XK_KP_Delete) {
545
+ keyCode = xpdfKeyCodeDelete;
546
+ } else if (key == XK_Home ||
547
+ key == XK_KP_Home) {
548
+ keyCode = xpdfKeyCodeHome;
549
+ } else if (key == XK_End ||
550
+ key == XK_KP_End) {
551
+ keyCode = xpdfKeyCodeEnd;
552
+ } else if (key == XK_Page_Up ||
553
+ key == XK_KP_Page_Up) {
554
+ keyCode = xpdfKeyCodePgUp;
555
+ } else if (key == XK_Page_Down ||
556
+ key == XK_KP_Page_Down) {
557
+ keyCode = xpdfKeyCodePgDn;
558
+ } else if (key == XK_Left ||
559
+ key == XK_KP_Left) {
560
+ keyCode = xpdfKeyCodeLeft;
561
+ } else if (key == XK_Right ||
562
+ key == XK_KP_Right) {
563
+ keyCode = xpdfKeyCodeRight;
564
+ } else if (key == XK_Up ||
565
+ key == XK_KP_Up) {
566
+ keyCode = xpdfKeyCodeUp;
567
+ } else if (key == XK_Down ||
568
+ key == XK_KP_Down) {
569
+ keyCode = xpdfKeyCodeDown;
570
+ } else if (key >= XK_F1 && key <= XK_F35) {
571
+ keyCode = xpdfKeyCodeF1 + (key - XK_F1);
572
+ } else {
573
+ return;
574
+ }
575
+
576
+ if ((cmds = globalParams->getKeyBinding(keyCode,
577
+ viewer->getModifiers(modifiers),
578
+ viewer->getContext(modifiers)))) {
579
+ for (i = 0; i < cmds->getLength(); ++i) {
580
+ viewer->execCmd((GString *)cmds->get(i), event);
581
+ }
582
+ deleteGList(cmds, GString);
583
+ }
584
+ }
585
+
586
+ void XPDFViewer::mouseCbk(void *data, XEvent *event) {
587
+ XPDFViewer *viewer = (XPDFViewer *)data;
588
+ int keyCode;
589
+ GList *cmds;
590
+ int i;
591
+
592
+ if (event->type == ButtonPress) {
593
+ if (event->xbutton.button >= 1 && event->xbutton.button <= 7) {
594
+ keyCode = xpdfKeyCodeMousePress1 + event->xbutton.button - 1;
595
+ } else {
596
+ return;
597
+ }
598
+ } else if (event->type == ButtonRelease) {
599
+ if (event->xbutton.button >= 1 && event->xbutton.button <= 7) {
600
+ keyCode = xpdfKeyCodeMouseRelease1 + event->xbutton.button - 1;
601
+ } else {
602
+ return;
603
+ }
604
+ } else {
605
+ return;
606
+ }
607
+
608
+ if ((cmds = globalParams->getKeyBinding(keyCode,
609
+ viewer->getModifiers(
610
+ event->xkey.state),
611
+ viewer->getContext(
612
+ event->xkey.state)))) {
613
+ for (i = 0; i < cmds->getLength(); ++i) {
614
+ viewer->execCmd((GString *)cmds->get(i), event);
615
+ }
616
+ deleteGList(cmds, GString);
617
+ }
618
+ }
619
+
620
+ int XPDFViewer::getModifiers(Guint modifiers) {
621
+ int mods;
622
+
623
+ mods = 0;
624
+ if (modifiers & ShiftMask) {
625
+ mods |= xpdfKeyModShift;
626
+ }
627
+ if (modifiers & ControlMask) {
628
+ mods |= xpdfKeyModCtrl;
629
+ }
630
+ if (modifiers & Mod1Mask) {
631
+ mods |= xpdfKeyModAlt;
632
+ }
633
+ return mods;
634
+ }
635
+
636
+ int XPDFViewer::getContext(Guint modifiers) {
637
+ int context;
638
+
639
+ context = (core->getFullScreen() ? xpdfKeyContextFullScreen
640
+ : xpdfKeyContextWindow) |
641
+ (core->getContinuousMode() ? xpdfKeyContextContinuous
642
+ : xpdfKeyContextSinglePage) |
643
+ (core->getLinkAction() ? xpdfKeyContextOverLink
644
+ : xpdfKeyContextOffLink) |
645
+ ((modifiers & Mod5Mask) ? xpdfKeyContextScrLockOn
646
+ : xpdfKeyContextScrLockOff);
647
+ return context;
648
+ }
649
+
650
+ void XPDFViewer::execCmd(GString *cmd, XEvent *event) {
651
+ GString *name;
652
+ GString *args[cmdMaxArgs];
653
+ char *p0, *p1;
654
+ int nArgs, i;
655
+ int a, b, m, cmp;
656
+
657
+ //----- parse the command
658
+ name = NULL;
659
+ nArgs = 0;
660
+ for (i = 0; i < cmdMaxArgs; ++i) {
661
+ args[i] = NULL;
662
+ }
663
+ p0 = cmd->getCString();
664
+ for (p1 = p0; *p1 && isalnum(*p1); ++p1) ;
665
+ if (p1 == p0) {
666
+ goto err1;
667
+ }
668
+ name = new GString(p0, p1 - p0);
669
+ if (*p1 == '(') {
670
+ while (nArgs < cmdMaxArgs) {
671
+ p0 = p1 + 1;
672
+ for (p1 = p0; *p1 && *p1 != ',' && *p1 != ')'; ++p1) ;
673
+ args[nArgs++] = new GString(p0, p1 - p0);
674
+ if (*p1 != ',') {
675
+ break;
676
+ }
677
+ }
678
+ if (*p1 != ')') {
679
+ goto err1;
680
+ }
681
+ ++p1;
682
+ }
683
+ if (*p1) {
684
+ goto err1;
685
+ }
686
+
687
+ //----- find the command
688
+ a = -1;
689
+ b = nCmds;
690
+ // invariant: cmdTab[a].name < name < cmdTab[b].name
691
+ while (b - a > 1) {
692
+ m = (a + b) / 2;
693
+ cmp = strcmp(cmdTab[m].name, name->getCString());
694
+ if (cmp < 0) {
695
+ a = m;
696
+ } else if (cmp > 0) {
697
+ b = m;
698
+ } else {
699
+ a = b = m;
700
+ }
701
+ }
702
+ if (cmp != 0) {
703
+ goto err1;
704
+ }
705
+
706
+ //----- execute the command
707
+ if (nArgs != cmdTab[a].nArgs ||
708
+ (cmdTab[a].requiresEvent && !event)) {
709
+ goto err1;
710
+ }
711
+ if (cmdTab[a].requiresDoc && !core->getDoc()) {
712
+ // don't issue an error message for this -- it happens, e.g., when
713
+ // clicking in a window with no open PDF file
714
+ goto err2;
715
+ }
716
+ (this->*cmdTab[a].func)(args, nArgs, event);
717
+
718
+ //----- clean up
719
+ delete name;
720
+ for (i = 0; i < nArgs; ++i) {
721
+ if (args[i]) {
722
+ delete args[i];
723
+ }
724
+ }
725
+ return;
726
+
727
+ err1:
728
+ error(-1, "Invalid command syntax: '%s'", cmd->getCString());
729
+ err2:
730
+ if (name) {
731
+ delete name;
732
+ }
733
+ for (i = 0; i < nArgs; ++i) {
734
+ if (args[i]) {
735
+ delete args[i];
736
+ }
737
+ }
738
+ }
739
+
740
+ //------------------------------------------------------------------------
741
+ // command functions
742
+ //------------------------------------------------------------------------
743
+
744
+ static int mouseX(XEvent *event) {
745
+ switch (event->type) {
746
+ case ButtonPress:
747
+ case ButtonRelease:
748
+ return event->xbutton.x;
749
+ case KeyPress:
750
+ return event->xkey.x;
751
+ }
752
+ return 0;
753
+ }
754
+
755
+ static int mouseY(XEvent *event) {
756
+ switch (event->type) {
757
+ case ButtonPress:
758
+ case ButtonRelease:
759
+ return event->xbutton.y;
760
+ case KeyPress:
761
+ return event->xkey.y;
762
+ }
763
+ return 0;
764
+ }
765
+
766
+ void XPDFViewer::cmdAbout(GString *args[], int nArgs,
767
+ XEvent *event) {
768
+ XtManageChild(aboutDialog);
769
+ }
770
+
771
+ void XPDFViewer::cmdCloseOutline(GString *args[], int nArgs,
772
+ XEvent *event) {
773
+ #ifndef DISABLE_OUTLINE
774
+ Dimension w;
775
+
776
+ if (outlineScroll == None) {
777
+ return;
778
+ }
779
+ XtVaGetValues(outlineScroll, XmNwidth, &w, NULL);
780
+ if (w > 1) {
781
+ outlinePaneWidth = w;
782
+ // this ugly kludge is apparently the only way to resize the panes
783
+ // within an XmPanedWindow
784
+ XtVaSetValues(outlineScroll, XmNpaneMinimum, 1,
785
+ XmNpaneMaximum, 1, NULL);
786
+ XtVaSetValues(outlineScroll, XmNpaneMinimum, 1,
787
+ XmNpaneMaximum, 10000, NULL);
788
+ }
789
+ #endif
790
+ }
791
+
792
+ void XPDFViewer::cmdCloseWindow(GString *args[], int nArgs,
793
+ XEvent *event) {
794
+ app->close(this, gFalse);
795
+ }
796
+
797
+ void XPDFViewer::cmdContinuousMode(GString *args[], int nArgs,
798
+ XEvent *event) {
799
+ Widget btn;
800
+
801
+ if (core->getContinuousMode()) {
802
+ return;
803
+ }
804
+ core->setContinuousMode(gTrue);
805
+
806
+ btn = XtNameToWidget(popupMenu, "continuousMode");
807
+ XtVaSetValues(btn, XmNset, XmSET, NULL);
808
+ }
809
+
810
+ void XPDFViewer::cmdEndPan(GString *args[], int nArgs,
811
+ XEvent *event) {
812
+ core->endPan(mouseX(event), mouseY(event));
813
+ }
814
+
815
+ void XPDFViewer::cmdEndSelection(GString *args[], int nArgs,
816
+ XEvent *event) {
817
+ core->endSelection(mouseX(event), mouseY(event));
818
+ }
819
+
820
+ void XPDFViewer::cmdFind(GString *args[], int nArgs,
821
+ XEvent *event) {
822
+ mapFindDialog();
823
+ }
824
+
825
+ void XPDFViewer::cmdFindNext(GString *args[], int nArgs,
826
+ XEvent *event) {
827
+ doFind(gTrue);
828
+ }
829
+
830
+ void XPDFViewer::cmdFocusToDocWin(GString *args[], int nArgs,
831
+ XEvent *event) {
832
+ core->takeFocus();
833
+ }
834
+
835
+ void XPDFViewer::cmdFocusToPageNum(GString *args[], int nArgs,
836
+ XEvent *event) {
837
+ XmTextFieldSetSelection(pageNumText, 0,
838
+ strlen(XmTextFieldGetString(pageNumText)),
839
+ XtLastTimestampProcessed(display));
840
+ XmProcessTraversal(pageNumText, XmTRAVERSE_CURRENT);
841
+ }
842
+
843
+ void XPDFViewer::cmdFollowLink(GString *args[], int nArgs,
844
+ XEvent *event) {
845
+ doLink(mouseX(event), mouseY(event), gFalse, gFalse);
846
+ }
847
+
848
+ void XPDFViewer::cmdFollowLinkInNewWin(GString *args[], int nArgs,
849
+ XEvent *event) {
850
+ doLink(mouseX(event), mouseY(event), gFalse, gTrue);
851
+ }
852
+
853
+ void XPDFViewer::cmdFollowLinkInNewWinNoSel(GString *args[], int nArgs,
854
+ XEvent *event) {
855
+ doLink(mouseX(event), mouseY(event), gTrue, gTrue);
856
+ }
857
+
858
+ void XPDFViewer::cmdFollowLinkNoSel(GString *args[], int nArgs,
859
+ XEvent *event) {
860
+ doLink(mouseX(event), mouseY(event), gTrue, gFalse);
861
+ }
862
+
863
+ void XPDFViewer::cmdFullScreenMode(GString *args[], int nArgs,
864
+ XEvent *event) {
865
+ PDFDoc *doc;
866
+ XPDFViewer *viewer;
867
+ int pg;
868
+ Widget btn;
869
+
870
+ if (core->getFullScreen()) {
871
+ return;
872
+ }
873
+ pg = core->getPageNum();
874
+ XtPopdown(win);
875
+ doc = core->takeDoc(gFalse);
876
+ viewer = app->reopen(this, doc, pg, gTrue);
877
+
878
+ btn = XtNameToWidget(viewer->popupMenu, "fullScreen");
879
+ XtVaSetValues(btn, XmNset, XmSET, NULL);
880
+ }
881
+
882
+ void XPDFViewer::cmdGoBackward(GString *args[], int nArgs,
883
+ XEvent *event) {
884
+ core->goBackward();
885
+ }
886
+
887
+ void XPDFViewer::cmdGoForward(GString *args[], int nArgs,
888
+ XEvent *event) {
889
+ core->goForward();
890
+ }
891
+
892
+ void XPDFViewer::cmdGotoDest(GString *args[], int nArgs,
893
+ XEvent *event) {
894
+ int pg;
895
+ LinkDest *dest;
896
+
897
+ getPageAndDest(1, args[0], &pg, &dest);
898
+ if (dest) {
899
+ displayDest(dest, core->getZoom(), core->getRotate(), gTrue);
900
+ delete dest;
901
+ }
902
+ }
903
+
904
+ void XPDFViewer::cmdGotoLastPage(GString *args[], int nArgs,
905
+ XEvent *event) {
906
+ displayPage(core->getDoc()->getNumPages(),
907
+ core->getZoom(), core->getRotate(),
908
+ gTrue, gTrue);
909
+ }
910
+
911
+ void XPDFViewer::cmdGotoLastPageNoScroll(GString *args[], int nArgs,
912
+ XEvent *event) {
913
+ displayPage(core->getDoc()->getNumPages(),
914
+ core->getZoom(), core->getRotate(),
915
+ gFalse, gTrue);
916
+ }
917
+
918
+ void XPDFViewer::cmdGotoPage(GString *args[], int nArgs,
919
+ XEvent *event) {
920
+ int pg;
921
+
922
+ pg = atoi(args[0]->getCString());
923
+ if (pg < 1 || pg > core->getDoc()->getNumPages()) {
924
+ return;
925
+ }
926
+ displayPage(pg, core->getZoom(), core->getRotate(), gTrue, gTrue);
927
+ }
928
+
929
+ void XPDFViewer::cmdGotoPageNoScroll(GString *args[], int nArgs,
930
+ XEvent *event) {
931
+ int pg;
932
+
933
+ pg = atoi(args[0]->getCString());
934
+ if (pg < 1 || pg > core->getDoc()->getNumPages()) {
935
+ return;
936
+ }
937
+ displayPage(pg, core->getZoom(), core->getRotate(), gFalse, gTrue);
938
+ }
939
+
940
+ void XPDFViewer::cmdNextPage(GString *args[], int nArgs,
941
+ XEvent *event) {
942
+ core->gotoNextPage(1, gTrue);
943
+ }
944
+
945
+ void XPDFViewer::cmdNextPageNoScroll(GString *args[], int nArgs,
946
+ XEvent *event) {
947
+ core->gotoNextPage(1, gFalse);
948
+ }
949
+
950
+ void XPDFViewer::cmdOpen(GString *args[], int nArgs,
951
+ XEvent *event) {
952
+ mapOpenDialog(gFalse);
953
+ }
954
+
955
+ void XPDFViewer::cmdOpenFile(GString *args[], int nArgs,
956
+ XEvent *event) {
957
+ open(args[0], 1, NULL);
958
+ }
959
+
960
+ void XPDFViewer::cmdOpenFileAtDest(GString *args[], int nArgs,
961
+ XEvent *event) {
962
+ open(args[0], 1, args[1]);
963
+ }
964
+
965
+ void XPDFViewer::cmdOpenFileAtDestInNewWin(GString *args[], int nArgs,
966
+ XEvent *event) {
967
+ app->openAtDest(args[0], args[1]);
968
+ }
969
+
970
+ void XPDFViewer::cmdOpenFileAtPage(GString *args[], int nArgs,
971
+ XEvent *event) {
972
+ open(args[0], atoi(args[1]->getCString()), NULL);
973
+ }
974
+
975
+ void XPDFViewer::cmdOpenFileAtPageInNewWin(GString *args[], int nArgs,
976
+ XEvent *event) {
977
+ app->open(args[0], atoi(args[1]->getCString()));
978
+ }
979
+
980
+ void XPDFViewer::cmdOpenFileInNewWin(GString *args[], int nArgs,
981
+ XEvent *event) {
982
+ app->open(args[0]);
983
+ }
984
+
985
+ void XPDFViewer::cmdOpenInNewWin(GString *args[], int nArgs,
986
+ XEvent *event) {
987
+ mapOpenDialog(gTrue);
988
+ }
989
+
990
+ void XPDFViewer::cmdOpenOutline(GString *args[], int nArgs,
991
+ XEvent *event) {
992
+ #ifndef DISABLE_OUTLINE
993
+ Dimension w;
994
+
995
+ if (outlineScroll == None) {
996
+ return;
997
+ }
998
+ XtVaGetValues(outlineScroll, XmNwidth, &w, NULL);
999
+ if (w == 1) {
1000
+ // this ugly kludge is apparently the only way to resize the panes
1001
+ // within an XmPanedWindow
1002
+ XtVaSetValues(outlineScroll, XmNpaneMinimum, outlinePaneWidth,
1003
+ XmNpaneMaximum, outlinePaneWidth, NULL);
1004
+ XtVaSetValues(outlineScroll, XmNpaneMinimum, 1,
1005
+ XmNpaneMaximum, 10000, NULL);
1006
+ }
1007
+ #endif
1008
+ }
1009
+
1010
+ void XPDFViewer::cmdPageDown(GString *args[], int nArgs,
1011
+ XEvent *event) {
1012
+ core->scrollPageDown();
1013
+ }
1014
+
1015
+ void XPDFViewer::cmdPageUp(GString *args[], int nArgs,
1016
+ XEvent *event) {
1017
+ core->scrollPageUp();
1018
+ }
1019
+
1020
+ void XPDFViewer::cmdPostPopupMenu(GString *args[], int nArgs,
1021
+ XEvent *event) {
1022
+ XmMenuPosition(popupMenu, event->type == ButtonPress ? &event->xbutton
1023
+ : (XButtonEvent *)NULL);
1024
+ XtManageChild(popupMenu);
1025
+
1026
+ // this is magic (taken from DDD) - weird things happen if this
1027
+ // call isn't made (this is done in two different places, in hopes
1028
+ // of squashing this stupid bug)
1029
+ XtUngrabButton(core->getDrawAreaWidget(), AnyButton, AnyModifier);
1030
+ }
1031
+
1032
+ void XPDFViewer::cmdPrevPage(GString *args[], int nArgs,
1033
+ XEvent *event) {
1034
+ core->gotoPrevPage(1, gTrue, gFalse);
1035
+ }
1036
+
1037
+ void XPDFViewer::cmdPrevPageNoScroll(GString *args[], int nArgs,
1038
+ XEvent *event) {
1039
+ core->gotoPrevPage(1, gFalse, gFalse);
1040
+ }
1041
+
1042
+ void XPDFViewer::cmdPrint(GString *args[], int nArgs,
1043
+ XEvent *event) {
1044
+ XtManageChild(printDialog);
1045
+ }
1046
+
1047
+ void XPDFViewer::cmdQuit(GString *args[], int nArgs,
1048
+ XEvent *event) {
1049
+ app->quit();
1050
+ }
1051
+
1052
+ void XPDFViewer::cmdRaise(GString *args[], int nArgs,
1053
+ XEvent *event) {
1054
+ XMapRaised(display, XtWindow(win));
1055
+ XFlush(display);
1056
+ }
1057
+
1058
+ void XPDFViewer::cmdRedraw(GString *args[], int nArgs,
1059
+ XEvent *event) {
1060
+ displayPage(core->getPageNum(), core->getZoom(), core->getRotate(),
1061
+ gFalse, gFalse);
1062
+ }
1063
+
1064
+ void XPDFViewer::cmdReload(GString *args[], int nArgs,
1065
+ XEvent *event) {
1066
+ reloadFile();
1067
+ }
1068
+
1069
+ void XPDFViewer::cmdRun(GString *args[], int nArgs,
1070
+ XEvent *event) {
1071
+ GString *fmt, *cmd, *s;
1072
+ LinkAction *action;
1073
+ double selLRX, selLRY, selURX, selURY;
1074
+ int selPage;
1075
+ GBool gotSel;
1076
+ char buf[64];
1077
+ char *p;
1078
+ char c0, c1;
1079
+ int i;
1080
+
1081
+ cmd = new GString();
1082
+ fmt = args[0];
1083
+ i = 0;
1084
+ gotSel = gFalse;
1085
+ while (i < fmt->getLength()) {
1086
+ c0 = fmt->getChar(i);
1087
+ if (c0 == '%' && i+1 < fmt->getLength()) {
1088
+ c1 = fmt->getChar(i+1);
1089
+ switch (c1) {
1090
+ case 'f':
1091
+ if (core->getDoc() && (s = core->getDoc()->getFileName())) {
1092
+ cmd->append(s);
1093
+ }
1094
+ break;
1095
+ case 'b':
1096
+ if (core->getDoc() && (s = core->getDoc()->getFileName())) {
1097
+ if ((p = strrchr(s->getCString(), '.'))) {
1098
+ cmd->append(s->getCString(), p - s->getCString());
1099
+ } else {
1100
+ cmd->append(s);
1101
+ }
1102
+ }
1103
+ break;
1104
+ case 'u':
1105
+ if ((action = core->getLinkAction()) &&
1106
+ action->getKind() == actionURI) {
1107
+ s = core->mungeURL(((LinkURI *)action)->getURI());
1108
+ cmd->append(s);
1109
+ delete s;
1110
+ }
1111
+ break;
1112
+ case 'x':
1113
+ case 'y':
1114
+ case 'X':
1115
+ case 'Y':
1116
+ if (!gotSel) {
1117
+ if (!core->getSelection(&selPage, &selURX, &selURY,
1118
+ &selLRX, &selLRY)) {
1119
+ selPage = 0;
1120
+ selURX = selURY = selLRX = selLRY = 0;
1121
+ }
1122
+ gotSel = gTrue;
1123
+ }
1124
+ sprintf(buf, "%g",
1125
+ (c1 == 'x') ? selURX :
1126
+ (c1 == 'y') ? selURY :
1127
+ (c1 == 'X') ? selLRX : selLRY);
1128
+ cmd->append(buf);
1129
+ break;
1130
+ default:
1131
+ cmd->append(c1);
1132
+ break;
1133
+ }
1134
+ i += 2;
1135
+ } else {
1136
+ cmd->append(c0);
1137
+ ++i;
1138
+ }
1139
+ }
1140
+ #ifdef VMS
1141
+ cmd->insert(0, "spawn/nowait ");
1142
+ #elif defined(__EMX__)
1143
+ cmd->insert(0, "start /min /n ");
1144
+ #else
1145
+ cmd->append(" &");
1146
+ #endif
1147
+ system(cmd->getCString());
1148
+ delete cmd;
1149
+ }
1150
+
1151
+ void XPDFViewer::cmdScrollDown(GString *args[], int nArgs,
1152
+ XEvent *event) {
1153
+ core->scrollDown(atoi(args[0]->getCString()));
1154
+ }
1155
+
1156
+ void XPDFViewer::cmdScrollDownNextPage(GString *args[], int nArgs,
1157
+ XEvent *event) {
1158
+ core->scrollDownNextPage(atoi(args[0]->getCString()));
1159
+ }
1160
+
1161
+ void XPDFViewer::cmdScrollLeft(GString *args[], int nArgs,
1162
+ XEvent *event) {
1163
+ core->scrollLeft(atoi(args[0]->getCString()));
1164
+ }
1165
+
1166
+ void XPDFViewer::cmdScrollOutlineDown(GString *args[], int nArgs,
1167
+ XEvent *event) {
1168
+ #ifndef DISABLE_OUTLINE
1169
+ Widget sb;
1170
+ int val, inc, pageInc, m, slider;
1171
+
1172
+ if (outlineScroll == None) {
1173
+ return;
1174
+ }
1175
+ if ((sb = XtNameToWidget(outlineScroll, "VertScrollBar"))) {
1176
+ XtVaGetValues(sb, XmNvalue, &val, XmNincrement, &inc,
1177
+ XmNpageIncrement, &pageInc, XmNmaximum, &m,
1178
+ XmNsliderSize, &slider, NULL);
1179
+ if ((val += inc * atoi(args[0]->getCString())) > m - slider) {
1180
+ val = m - slider;
1181
+ }
1182
+ XmScrollBarSetValues(sb, val, slider, inc, pageInc, True);
1183
+ }
1184
+ #endif
1185
+ }
1186
+
1187
+ void XPDFViewer::cmdScrollOutlineUp(GString *args[], int nArgs,
1188
+ XEvent *event) {
1189
+ #ifndef DISABLE_OUTLINE
1190
+ Widget sb;
1191
+ int val, inc, pageInc, m, slider;
1192
+
1193
+ if (outlineScroll == None) {
1194
+ return;
1195
+ }
1196
+ if ((sb = XtNameToWidget(outlineScroll, "VertScrollBar"))) {
1197
+ XtVaGetValues(sb, XmNvalue, &val, XmNincrement, &inc,
1198
+ XmNpageIncrement, &pageInc, XmNminimum, &m,
1199
+ XmNsliderSize, &slider, NULL);
1200
+ if ((val -= inc * atoi(args[0]->getCString())) < m) {
1201
+ val = m;
1202
+ }
1203
+ XmScrollBarSetValues(sb, val, slider, inc, pageInc, True);
1204
+ }
1205
+ #endif
1206
+ }
1207
+
1208
+ void XPDFViewer::cmdScrollRight(GString *args[], int nArgs,
1209
+ XEvent *event) {
1210
+ core->scrollRight(atoi(args[0]->getCString()));
1211
+ }
1212
+
1213
+ void XPDFViewer::cmdScrollToBottomEdge(GString *args[], int nArgs,
1214
+ XEvent *event) {
1215
+ core->scrollToBottomEdge();
1216
+ }
1217
+
1218
+ void XPDFViewer::cmdScrollToBottomRight(GString *args[], int nArgs,
1219
+ XEvent *event) {
1220
+ core->scrollToBottomRight();
1221
+ }
1222
+
1223
+ void XPDFViewer::cmdScrollToLeftEdge(GString *args[], int nArgs,
1224
+ XEvent *event) {
1225
+ core->scrollToLeftEdge();
1226
+ }
1227
+
1228
+ void XPDFViewer::cmdScrollToRightEdge(GString *args[], int nArgs,
1229
+ XEvent *event) {
1230
+ core->scrollToRightEdge();
1231
+ }
1232
+
1233
+ void XPDFViewer::cmdScrollToTopEdge(GString *args[], int nArgs,
1234
+ XEvent *event) {
1235
+ core->scrollToTopEdge();
1236
+ }
1237
+
1238
+ void XPDFViewer::cmdScrollToTopLeft(GString *args[], int nArgs,
1239
+ XEvent *event) {
1240
+ core->scrollToTopLeft();
1241
+ }
1242
+
1243
+ void XPDFViewer::cmdScrollUp(GString *args[], int nArgs,
1244
+ XEvent *event) {
1245
+ core->scrollUp(atoi(args[0]->getCString()));
1246
+ }
1247
+
1248
+ void XPDFViewer::cmdScrollUpPrevPage(GString *args[], int nArgs,
1249
+ XEvent *event) {
1250
+ core->scrollUpPrevPage(atoi(args[0]->getCString()));
1251
+ }
1252
+
1253
+ void XPDFViewer::cmdSinglePageMode(GString *args[], int nArgs,
1254
+ XEvent *event) {
1255
+ Widget btn;
1256
+
1257
+ if (!core->getContinuousMode()) {
1258
+ return;
1259
+ }
1260
+ core->setContinuousMode(gFalse);
1261
+
1262
+ btn = XtNameToWidget(popupMenu, "continuousMode");
1263
+ XtVaSetValues(btn, XmNset, XmUNSET, NULL);
1264
+ }
1265
+
1266
+ void XPDFViewer::cmdStartPan(GString *args[], int nArgs,
1267
+ XEvent *event) {
1268
+ core->startPan(mouseX(event), mouseY(event));
1269
+ }
1270
+
1271
+ void XPDFViewer::cmdStartSelection(GString *args[], int nArgs,
1272
+ XEvent *event) {
1273
+ core->startSelection(mouseX(event), mouseY(event));
1274
+ }
1275
+
1276
+ void XPDFViewer::cmdToggleContinuousMode(GString *args[], int nArgs,
1277
+ XEvent *event) {
1278
+ if (core->getContinuousMode()) {
1279
+ cmdSinglePageMode(NULL, 0, event);
1280
+ } else {
1281
+ cmdContinuousMode(NULL, 0, event);
1282
+ }
1283
+ }
1284
+
1285
+ void XPDFViewer::cmdToggleFullScreenMode(GString *args[], int nArgs,
1286
+ XEvent *event) {
1287
+ if (core->getFullScreen()) {
1288
+ cmdWindowMode(NULL, 0, event);
1289
+ } else {
1290
+ cmdFullScreenMode(NULL, 0, event);
1291
+ }
1292
+ }
1293
+
1294
+ void XPDFViewer::cmdToggleOutline(GString *args[], int nArgs,
1295
+ XEvent *event) {
1296
+ #ifndef DISABLE_OUTLINE
1297
+ Dimension w;
1298
+
1299
+ if (outlineScroll == None) {
1300
+ return;
1301
+ }
1302
+ XtVaGetValues(outlineScroll, XmNwidth, &w, NULL);
1303
+ if (w > 1) {
1304
+ cmdCloseOutline(NULL, 0, event);
1305
+ } else {
1306
+ cmdOpenOutline(NULL, 0, event);
1307
+ }
1308
+ #endif
1309
+ }
1310
+
1311
+ void XPDFViewer::cmdWindowMode(GString *args[], int nArgs,
1312
+ XEvent *event) {
1313
+ PDFDoc *doc;
1314
+ XPDFViewer *viewer;
1315
+ int pg;
1316
+ Widget btn;
1317
+
1318
+ if (!core->getFullScreen()) {
1319
+ return;
1320
+ }
1321
+ pg = core->getPageNum();
1322
+ XtPopdown(win);
1323
+ doc = core->takeDoc(gFalse);
1324
+ viewer = app->reopen(this, doc, pg, gFalse);
1325
+
1326
+ btn = XtNameToWidget(viewer->popupMenu, "fullScreen");
1327
+ XtVaSetValues(btn, XmNset, XmUNSET, NULL);
1328
+ }
1329
+
1330
+ void XPDFViewer::cmdZoomFitPage(GString *args[], int nArgs,
1331
+ XEvent *event) {
1332
+ if (core->getZoom() != zoomPage) {
1333
+ setZoomIdx(zoomPageIdx);
1334
+ displayPage(core->getPageNum(), zoomPage,
1335
+ core->getRotate(), gTrue, gFalse);
1336
+ }
1337
+ }
1338
+
1339
+ void XPDFViewer::cmdZoomFitWidth(GString *args[], int nArgs,
1340
+ XEvent *event) {
1341
+ if (core->getZoom() != zoomWidth) {
1342
+ setZoomIdx(zoomWidthIdx);
1343
+ displayPage(core->getPageNum(), zoomWidth,
1344
+ core->getRotate(), gTrue, gFalse);
1345
+ }
1346
+ }
1347
+
1348
+ void XPDFViewer::cmdZoomIn(GString *args[], int nArgs,
1349
+ XEvent *event) {
1350
+ int z;
1351
+
1352
+ z = getZoomIdx();
1353
+ if (z <= minZoomIdx && z > maxZoomIdx) {
1354
+ --z;
1355
+ setZoomIdx(z);
1356
+ displayPage(core->getPageNum(), zoomMenuInfo[z].zoom,
1357
+ core->getRotate(), gTrue, gFalse);
1358
+ }
1359
+ }
1360
+
1361
+ void XPDFViewer::cmdZoomOut(GString *args[], int nArgs,
1362
+ XEvent *event) {
1363
+ int z;
1364
+
1365
+ z = getZoomIdx();
1366
+ if (z < minZoomIdx && z >= maxZoomIdx) {
1367
+ ++z;
1368
+ setZoomIdx(z);
1369
+ displayPage(core->getPageNum(), zoomMenuInfo[z].zoom,
1370
+ core->getRotate(), gTrue, gFalse);
1371
+ }
1372
+ }
1373
+
1374
+ void XPDFViewer::cmdZoomPercent(GString *args[], int nArgs,
1375
+ XEvent *event) {
1376
+ double z;
1377
+
1378
+ z = atof(args[0]->getCString());
1379
+ setZoomVal(z);
1380
+ displayPage(core->getPageNum(), z, core->getRotate(), gTrue, gFalse);
1381
+ }
1382
+
1383
+ void XPDFViewer::cmdZoomToSelection(GString *args[], int nArgs,
1384
+ XEvent *event) {
1385
+ int pg;
1386
+ double ulx, uly, lrx, lry;
1387
+
1388
+ if (core->getSelection(&pg, &ulx, &uly, &lrx, &lry)) {
1389
+ core->zoomToRect(pg, ulx, uly, lrx, lry);
1390
+ }
1391
+ }
1392
+
1393
+ //------------------------------------------------------------------------
1394
+ // GUI code: main window
1395
+ //------------------------------------------------------------------------
1396
+
1397
+ void XPDFViewer::initWindow(GBool fullScreen) {
1398
+ Colormap colormap;
1399
+ XColor xcol;
1400
+ Atom state, val;
1401
+ Arg args[20];
1402
+ int n;
1403
+ char *title;
1404
+
1405
+ display = XtDisplay(app->getAppShell());
1406
+ screenNum = XScreenNumberOfScreen(XtScreen(app->getAppShell()));
1407
+
1408
+ toolBar = None;
1409
+ #ifndef DISABLE_OUTLINE
1410
+ outlineScroll = None;
1411
+ #endif
1412
+
1413
+ // private colormap
1414
+ if (app->getInstallCmap()) {
1415
+ XtVaGetValues(app->getAppShell(), XmNcolormap, &colormap, NULL);
1416
+ // ensure that BlackPixel and WhitePixel are reserved in the
1417
+ // new colormap
1418
+ xcol.red = xcol.green = xcol.blue = 0;
1419
+ XAllocColor(display, colormap, &xcol);
1420
+ xcol.red = xcol.green = xcol.blue = 65535;
1421
+ XAllocColor(display, colormap, &xcol);
1422
+ colormap = XCopyColormapAndFree(display, colormap);
1423
+ }
1424
+
1425
+ // top-level window
1426
+ n = 0;
1427
+ title = app->getTitle() ? app->getTitle()->getCString()
1428
+ : (char *)xpdfAppName;
1429
+ XtSetArg(args[n], XmNtitle, title); ++n;
1430
+ XtSetArg(args[n], XmNiconName, title); ++n;
1431
+ XtSetArg(args[n], XmNminWidth, 100); ++n;
1432
+ XtSetArg(args[n], XmNminHeight, 100); ++n;
1433
+ XtSetArg(args[n], XmNbaseWidth, 0); ++n;
1434
+ XtSetArg(args[n], XmNbaseHeight, 0); ++n;
1435
+ XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING); ++n;
1436
+ win = XtCreatePopupShell("win", topLevelShellWidgetClass,
1437
+ app->getAppShell(), args, n);
1438
+ if (app->getInstallCmap()) {
1439
+ XtVaSetValues(win, XmNcolormap, colormap, NULL);
1440
+ }
1441
+ XmAddWMProtocolCallback(win, XInternAtom(display, "WM_DELETE_WINDOW", False),
1442
+ &closeMsgCbk, this);
1443
+
1444
+ // create the full-screen window
1445
+ if (fullScreen) {
1446
+ initCore(win, gTrue);
1447
+
1448
+ // create the normal (non-full-screen) window
1449
+ } else {
1450
+ if (app->getGeometry()) {
1451
+ n = 0;
1452
+ XtSetArg(args[n], XmNgeometry, app->getGeometry()->getCString()); ++n;
1453
+ XtSetValues(win, args, n);
1454
+ }
1455
+
1456
+ n = 0;
1457
+ form = XmCreateForm(win, "form", args, n);
1458
+ XtManageChild(form);
1459
+
1460
+ #ifdef DISABLE_OUTLINE
1461
+ initToolbar(form);
1462
+ n = 0;
1463
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
1464
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
1465
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1466
+ XtSetValues(toolBar, args, n);
1467
+
1468
+ initCore(form, gFalse);
1469
+ n = 0;
1470
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1471
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
1472
+ XtSetArg(args[n], XmNbottomWidget, toolBar); ++n;
1473
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
1474
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
1475
+ XtSetValues(core->getWidget(), args, n);
1476
+ #else
1477
+ initToolbar(form);
1478
+ n = 0;
1479
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
1480
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
1481
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1482
+ XtSetValues(toolBar, args, n);
1483
+
1484
+ initPanedWin(form);
1485
+ n = 0;
1486
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1487
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
1488
+ XtSetArg(args[n], XmNbottomWidget, toolBar); ++n;
1489
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
1490
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
1491
+ XtSetValues(panedWin, args, n);
1492
+
1493
+ initCore(panedWin, fullScreen);
1494
+ n = 0;
1495
+ XtSetArg(args[n], XmNpositionIndex, 1); ++n;
1496
+ XtSetArg(args[n], XmNallowResize, True); ++n;
1497
+ XtSetArg(args[n], XmNpaneMinimum, 1); ++n;
1498
+ XtSetArg(args[n], XmNpaneMaximum, 10000); ++n;
1499
+ XtSetValues(core->getWidget(), args, n);
1500
+ #endif
1501
+ }
1502
+
1503
+ // set the zoom menu to match the initial zoom setting
1504
+ setZoomVal(core->getZoom());
1505
+
1506
+ // set traversal order
1507
+ XtVaSetValues(core->getDrawAreaWidget(),
1508
+ XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, NULL);
1509
+ if (toolBar != None) {
1510
+ XtVaSetValues(backBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1511
+ NULL);
1512
+ XtVaSetValues(prevTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1513
+ NULL);
1514
+ XtVaSetValues(prevPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1515
+ NULL);
1516
+ XtVaSetValues(nextPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1517
+ NULL);
1518
+ XtVaSetValues(nextTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1519
+ NULL);
1520
+ XtVaSetValues(forwardBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1521
+ NULL);
1522
+ XtVaSetValues(pageNumText, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1523
+ NULL);
1524
+ XtVaSetValues(zoomWidget, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1525
+ NULL);
1526
+ XtVaSetValues(findBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1527
+ NULL);
1528
+ XtVaSetValues(printBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1529
+ NULL);
1530
+ XtVaSetValues(aboutBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1531
+ NULL);
1532
+ XtVaSetValues(quitBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
1533
+ NULL);
1534
+ }
1535
+
1536
+ initPopupMenu();
1537
+
1538
+ if (fullScreen) {
1539
+ // Set both the old-style Motif decorations hint and the new-style
1540
+ // _NET_WM_STATE property. This is redundant, but might be useful
1541
+ // for older window managers. We also set the geometry to +0+0 to
1542
+ // avoid interactive placement. (Note: we need to realize the
1543
+ // shell, so it has a Window on which to set the _NET_WM_STATE
1544
+ // property, but we don't want to map it until later, so we set
1545
+ // mappedWhenManaged to false.)
1546
+ n = 0;
1547
+ XtSetArg(args[n], XmNmappedWhenManaged, False); ++n;
1548
+ XtSetArg(args[n], XmNmwmDecorations, 0); ++n;
1549
+ XtSetArg(args[n], XmNgeometry, "+0+0"); ++n;
1550
+ XtSetValues(win, args, n);
1551
+ XtRealizeWidget(win);
1552
+ state = XInternAtom(display, "_NET_WM_STATE", False);
1553
+ val = XInternAtom(display, "_NET_WM_STATE_FULLSCREEN", False);
1554
+ XChangeProperty(display, XtWindow(win), state, XA_ATOM, 32,
1555
+ PropModeReplace, (Guchar *)&val, 1);
1556
+ }
1557
+ }
1558
+
1559
+ void XPDFViewer::initToolbar(Widget parent) {
1560
+ Widget label, lastBtn;
1561
+ #ifndef USE_COMBO_BOX
1562
+ Widget btn;
1563
+ #endif
1564
+ Arg args[20];
1565
+ int n;
1566
+ XmString s, emptyString;
1567
+ int i;
1568
+
1569
+ // toolbar
1570
+ n = 0;
1571
+ toolBar = XmCreateForm(parent, "toolBar", args, n);
1572
+ XtManageChild(toolBar);
1573
+
1574
+ // create an empty string -- this is used for buttons that will get
1575
+ // pixmaps later
1576
+ emptyString = XmStringCreateLocalized("");
1577
+
1578
+ // page movement buttons
1579
+ n = 0;
1580
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
1581
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1582
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1583
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1584
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1585
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1586
+ backBtn = XmCreatePushButton(toolBar, "back", args, n);
1587
+ addToolTip(backBtn, "Back");
1588
+ XtManageChild(backBtn);
1589
+ XtAddCallback(backBtn, XmNactivateCallback,
1590
+ &backCbk, (XtPointer)this);
1591
+ n = 0;
1592
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1593
+ XtSetArg(args[n], XmNleftWidget, backBtn); ++n;
1594
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1595
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1596
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1597
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1598
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1599
+ prevTenPageBtn = XmCreatePushButton(toolBar, "prevTenPage", args, n);
1600
+ addToolTip(prevTenPageBtn, "-10 pages");
1601
+ XtManageChild(prevTenPageBtn);
1602
+ XtAddCallback(prevTenPageBtn, XmNactivateCallback,
1603
+ &prevTenPageCbk, (XtPointer)this);
1604
+ n = 0;
1605
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1606
+ XtSetArg(args[n], XmNleftWidget, prevTenPageBtn); ++n;
1607
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1608
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1609
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1610
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1611
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1612
+ prevPageBtn = XmCreatePushButton(toolBar, "prevPage", args, n);
1613
+ addToolTip(prevPageBtn, "Previous page");
1614
+ XtManageChild(prevPageBtn);
1615
+ XtAddCallback(prevPageBtn, XmNactivateCallback,
1616
+ &prevPageCbk, (XtPointer)this);
1617
+ n = 0;
1618
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1619
+ XtSetArg(args[n], XmNleftWidget, prevPageBtn); ++n;
1620
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1621
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1622
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1623
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1624
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1625
+ nextPageBtn = XmCreatePushButton(toolBar, "nextPage", args, n);
1626
+ addToolTip(nextPageBtn, "Next page");
1627
+ XtManageChild(nextPageBtn);
1628
+ XtAddCallback(nextPageBtn, XmNactivateCallback,
1629
+ &nextPageCbk, (XtPointer)this);
1630
+ n = 0;
1631
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1632
+ XtSetArg(args[n], XmNleftWidget, nextPageBtn); ++n;
1633
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1634
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1635
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1636
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1637
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1638
+ nextTenPageBtn = XmCreatePushButton(toolBar, "nextTenPage", args, n);
1639
+ addToolTip(nextTenPageBtn, "+10 pages");
1640
+ XtManageChild(nextTenPageBtn);
1641
+ XtAddCallback(nextTenPageBtn, XmNactivateCallback,
1642
+ &nextTenPageCbk, (XtPointer)this);
1643
+ n = 0;
1644
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1645
+ XtSetArg(args[n], XmNleftWidget, nextTenPageBtn); ++n;
1646
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1647
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1648
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1649
+ XtSetArg(args[n], XmNsensitive, False); ++n;
1650
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1651
+ forwardBtn = XmCreatePushButton(toolBar, "forward", args, n);
1652
+ addToolTip(forwardBtn, "Forward");
1653
+ XtManageChild(forwardBtn);
1654
+ XtAddCallback(forwardBtn, XmNactivateCallback,
1655
+ &forwardCbk, (XtPointer)this);
1656
+
1657
+ // page number display
1658
+ n = 0;
1659
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1660
+ XtSetArg(args[n], XmNleftWidget, forwardBtn); ++n;
1661
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1662
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1663
+ s = XmStringCreateLocalized("Page ");
1664
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1665
+ label = XmCreateLabel(toolBar, "pageLabel", args, n);
1666
+ XmStringFree(s);
1667
+ XtManageChild(label);
1668
+ n = 0;
1669
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1670
+ XtSetArg(args[n], XmNleftWidget, label); ++n;
1671
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1672
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1673
+ XtSetArg(args[n], XmNmarginWidth, 3); ++n;
1674
+ XtSetArg(args[n], XmNmarginHeight, 3); ++n;
1675
+ XtSetArg(args[n], XmNcolumns, 5); ++n;
1676
+ pageNumText = XmCreateTextField(toolBar, "pageNum", args, n);
1677
+ XtManageChild(pageNumText);
1678
+ XtAddCallback(pageNumText, XmNactivateCallback,
1679
+ &pageNumCbk, (XtPointer)this);
1680
+ n = 0;
1681
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1682
+ XtSetArg(args[n], XmNleftWidget, pageNumText); ++n;
1683
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1684
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1685
+ s = XmStringCreateLocalized(" of 00000");
1686
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1687
+ XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
1688
+ XtSetArg(args[n], XmNrecomputeSize, False); ++n;
1689
+ pageCountLabel = XmCreateLabel(toolBar, "pageCountLabel", args, n);
1690
+ XmStringFree(s);
1691
+ XtManageChild(pageCountLabel);
1692
+ s = XmStringCreateLocalized(" of 0");
1693
+ XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL);
1694
+ XmStringFree(s);
1695
+
1696
+ // zoom menu
1697
+ #if USE_COMBO_BOX
1698
+ XmString st[nZoomMenuItems];
1699
+ n = 0;
1700
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1701
+ XtSetArg(args[n], XmNleftWidget, pageCountLabel); ++n;
1702
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1703
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1704
+ XtSetArg(args[n], XmNmarginWidth, 0); ++n;
1705
+ XtSetArg(args[n], XmNmarginHeight, 0); ++n;
1706
+ XtSetArg(args[n], XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX); ++n;
1707
+ XtSetArg(args[n], XmNpositionMode, XmONE_BASED); ++n;
1708
+ XtSetArg(args[n], XmNcolumns, 7); ++n;
1709
+ for (i = 0; i < nZoomMenuItems; ++i) {
1710
+ st[i] = XmStringCreateLocalized(zoomMenuInfo[i].label);
1711
+ }
1712
+ XtSetArg(args[n], XmNitems, st); ++n;
1713
+ XtSetArg(args[n], XmNitemCount, nZoomMenuItems); ++n;
1714
+ zoomComboBox = XmCreateComboBox(toolBar, "zoomComboBox", args, n);
1715
+ for (i = 0; i < nZoomMenuItems; ++i) {
1716
+ XmStringFree(st[i]);
1717
+ }
1718
+ addToolTip(zoomComboBox, "Zoom");
1719
+ XtAddCallback(zoomComboBox, XmNselectionCallback,
1720
+ &zoomComboBoxCbk, (XtPointer)this);
1721
+ XtManageChild(zoomComboBox);
1722
+ zoomWidget = zoomComboBox;
1723
+ #else
1724
+ Widget menuPane;
1725
+ char buf[16];
1726
+ n = 0;
1727
+ menuPane = XmCreatePulldownMenu(toolBar, "zoomMenuPane", args, n);
1728
+ for (i = 0; i < nZoomMenuItems; ++i) {
1729
+ n = 0;
1730
+ s = XmStringCreateLocalized(zoomMenuInfo[i].label);
1731
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1732
+ XtSetArg(args[n], XmNuserData, (XtPointer)i); ++n;
1733
+ sprintf(buf, "zoom%d", i);
1734
+ btn = XmCreatePushButton(menuPane, buf, args, n);
1735
+ XmStringFree(s);
1736
+ XtManageChild(btn);
1737
+ XtAddCallback(btn, XmNactivateCallback,
1738
+ &zoomMenuCbk, (XtPointer)this);
1739
+ zoomMenuBtns[i] = btn;
1740
+ }
1741
+ n = 0;
1742
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1743
+ XtSetArg(args[n], XmNleftWidget, pageCountLabel); ++n;
1744
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1745
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1746
+ XtSetArg(args[n], XmNmarginWidth, 0); ++n;
1747
+ XtSetArg(args[n], XmNmarginHeight, 0); ++n;
1748
+ XtSetArg(args[n], XmNsubMenuId, menuPane); ++n;
1749
+ zoomMenu = XmCreateOptionMenu(toolBar, "zoomMenu", args, n);
1750
+ addToolTip(zoomMenu, "Zoom");
1751
+ XtManageChild(zoomMenu);
1752
+ zoomWidget = zoomMenu;
1753
+ #endif
1754
+
1755
+ // find/print/about buttons
1756
+ n = 0;
1757
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1758
+ XtSetArg(args[n], XmNleftWidget, zoomWidget); ++n;
1759
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1760
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1761
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1762
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1763
+ findBtn = XmCreatePushButton(toolBar, "find", args, n);
1764
+ addToolTip(findBtn, "Find");
1765
+ XtManageChild(findBtn);
1766
+ XtAddCallback(findBtn, XmNactivateCallback,
1767
+ &findCbk, (XtPointer)this);
1768
+ n = 0;
1769
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1770
+ XtSetArg(args[n], XmNleftWidget, findBtn); ++n;
1771
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1772
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1773
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1774
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1775
+ printBtn = XmCreatePushButton(toolBar, "print", args, n);
1776
+ addToolTip(printBtn, "Print");
1777
+ XtManageChild(printBtn);
1778
+ XtAddCallback(printBtn, XmNactivateCallback,
1779
+ &printCbk, (XtPointer)this);
1780
+ n = 0;
1781
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1782
+ XtSetArg(args[n], XmNleftWidget, printBtn); ++n;
1783
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1784
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1785
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1786
+ XtSetArg(args[n], XmNlabelString, emptyString); ++n;
1787
+ aboutBtn = XmCreatePushButton(toolBar, "about", args, n);
1788
+ addToolTip(aboutBtn, "About / help");
1789
+ XtManageChild(aboutBtn);
1790
+ XtAddCallback(aboutBtn, XmNactivateCallback,
1791
+ &aboutCbk, (XtPointer)this);
1792
+ lastBtn = aboutBtn;
1793
+
1794
+ // quit button
1795
+ n = 0;
1796
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
1797
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1798
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1799
+ XtSetArg(args[n], XmNmarginWidth, 6); ++n;
1800
+ s = XmStringCreateLocalized("Quit");
1801
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1802
+ quitBtn = XmCreatePushButton(toolBar, "quit", args, n);
1803
+ XmStringFree(s);
1804
+ XtManageChild(quitBtn);
1805
+ XtAddCallback(quitBtn, XmNactivateCallback,
1806
+ &quitCbk, (XtPointer)this);
1807
+
1808
+ // link label
1809
+ n = 0;
1810
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
1811
+ XtSetArg(args[n], XmNleftWidget, lastBtn); ++n;
1812
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); ++n;
1813
+ XtSetArg(args[n], XmNrightWidget, quitBtn); ++n;
1814
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
1815
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
1816
+ s = XmStringCreateLocalized("");
1817
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1818
+ XtSetArg(args[n], XmNrecomputeSize, True); ++n;
1819
+ XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
1820
+ linkLabel = XmCreateLabel(toolBar, "linkLabel", args, n);
1821
+ XmStringFree(s);
1822
+ XtManageChild(linkLabel);
1823
+
1824
+ XmStringFree(emptyString);
1825
+ }
1826
+
1827
+ #ifndef DISABLE_OUTLINE
1828
+ void XPDFViewer::initPanedWin(Widget parent) {
1829
+ Widget clipWin;
1830
+ Arg args[20];
1831
+ int n;
1832
+
1833
+ // paned window
1834
+ n = 0;
1835
+ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
1836
+ #if defined(__sgi) && (XmVERSION <= 1)
1837
+ panedWin = SgCreateHorzPanedWindow(parent, "panedWin", args, n);
1838
+ #else
1839
+ panedWin = XmCreatePanedWindow(parent, "panedWin", args, n);
1840
+ #endif
1841
+ XtManageChild(panedWin);
1842
+
1843
+ // scrolled window for outline container
1844
+ n = 0;
1845
+ XtSetArg(args[n], XmNpositionIndex, 0); ++n;
1846
+ XtSetArg(args[n], XmNallowResize, True); ++n;
1847
+ XtSetArg(args[n], XmNpaneMinimum, 1); ++n;
1848
+ XtSetArg(args[n], XmNpaneMaximum, 10000); ++n;
1849
+ #if !(defined(__sgi) && (XmVERSION <= 1))
1850
+ XtSetArg(args[n], XmNwidth, 1); ++n;
1851
+ #endif
1852
+ XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n;
1853
+ outlineScroll = XmCreateScrolledWindow(panedWin, "outlineScroll", args, n);
1854
+ XtManageChild(outlineScroll);
1855
+ XtVaGetValues(outlineScroll, XmNclipWindow, &clipWin, NULL);
1856
+ XtVaSetValues(clipWin, XmNbackground, app->getPaperPixel(), NULL);
1857
+
1858
+ // outline tree
1859
+ n = 0;
1860
+ XtSetArg(args[n], XmNbackground, app->getPaperPixel()); ++n;
1861
+ outlineTree = XPDFCreateTree(outlineScroll, "outlineTree", args, n);
1862
+ XtManageChild(outlineTree);
1863
+ XtAddCallback(outlineTree, XPDFNselectionCallback, &outlineSelectCbk,
1864
+ (XtPointer)this);
1865
+ }
1866
+ #endif
1867
+
1868
+ void XPDFViewer::initCore(Widget parent, GBool fullScreen) {
1869
+ core = new XPDFCore(win, parent,
1870
+ app->getPaperRGB(), app->getPaperPixel(),
1871
+ app->getMattePixel(fullScreen),
1872
+ fullScreen, app->getReverseVideo(),
1873
+ app->getInstallCmap(), app->getRGBCubeSize());
1874
+ core->setUpdateCbk(&updateCbk, this);
1875
+ core->setActionCbk(&actionCbk, this);
1876
+ core->setKeyPressCbk(&keyPressCbk, this);
1877
+ core->setMouseCbk(&mouseCbk, this);
1878
+ }
1879
+
1880
+ void XPDFViewer::initPopupMenu() {
1881
+ Widget btn;
1882
+ Arg args[20];
1883
+ int n;
1884
+ XmString s, s2;
1885
+
1886
+ n = 0;
1887
+ #if XmVersion < 1002
1888
+ // older versions of Motif need this, newer ones choke on it,
1889
+ // sometimes not displaying the menu at all, maybe depending on the
1890
+ // state of the NumLock key (taken from DDD)
1891
+ XtSetArg(args[n], XmNmenuPost, "<Btn3Down>"); ++n;
1892
+ #endif
1893
+ popupMenu = XmCreatePopupMenu(core->getDrawAreaWidget(), "popupMenu",
1894
+ args, n);
1895
+ n = 0;
1896
+ s = XmStringCreateLocalized("Open...");
1897
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1898
+ s2 = XmStringCreateLocalized("O");
1899
+ XtSetArg(args[n], XmNacceleratorText, s2); ++n;
1900
+ btn = XmCreatePushButton(popupMenu, "open", args, n);
1901
+ XmStringFree(s);
1902
+ XmStringFree(s2);
1903
+ XtManageChild(btn);
1904
+ XtAddCallback(btn, XmNactivateCallback,
1905
+ &openCbk, (XtPointer)this);
1906
+ n = 0;
1907
+ s = XmStringCreateLocalized("Open in new window...");
1908
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1909
+ btn = XmCreatePushButton(popupMenu, "openInNewWindow", args, n);
1910
+ XmStringFree(s);
1911
+ XtManageChild(btn);
1912
+ XtAddCallback(btn, XmNactivateCallback,
1913
+ &openInNewWindowCbk, (XtPointer)this);
1914
+ n = 0;
1915
+ s = XmStringCreateLocalized("Reload");
1916
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1917
+ s2 = XmStringCreateLocalized("R");
1918
+ XtSetArg(args[n], XmNacceleratorText, s2); ++n;
1919
+ btn = XmCreatePushButton(popupMenu, "reload", args, n);
1920
+ XmStringFree(s);
1921
+ XmStringFree(s2);
1922
+ XtManageChild(btn);
1923
+ XtAddCallback(btn, XmNactivateCallback,
1924
+ &reloadCbk, (XtPointer)this);
1925
+ n = 0;
1926
+ s = XmStringCreateLocalized("Save as...");
1927
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1928
+ btn = XmCreatePushButton(popupMenu, "saveAs", args, n);
1929
+ XmStringFree(s);
1930
+ XtManageChild(btn);
1931
+ XtAddCallback(btn, XmNactivateCallback,
1932
+ &saveAsCbk, (XtPointer)this);
1933
+ n = 0;
1934
+ btn = XmCreateSeparator(popupMenu, "sep1", args, n);
1935
+ XtManageChild(btn);
1936
+ n = 0;
1937
+ s = XmStringCreateLocalized("Continuous view");
1938
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1939
+ XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); ++n;
1940
+ XtSetArg(args[n], XmNvisibleWhenOff, True); ++n;
1941
+ XtSetArg(args[n], XmNset, core->getContinuousMode() ? XmSET : XmUNSET); ++n;
1942
+ btn = XmCreateToggleButton(popupMenu, "continuousMode", args, n);
1943
+ XmStringFree(s);
1944
+ XtManageChild(btn);
1945
+ XtAddCallback(btn, XmNvalueChangedCallback,
1946
+ &continuousModeToggleCbk, (XtPointer)this);
1947
+ n = 0;
1948
+ s = XmStringCreateLocalized("Full screen");
1949
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1950
+ XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); ++n;
1951
+ XtSetArg(args[n], XmNvisibleWhenOff, True); ++n;
1952
+ XtSetArg(args[n], XmNset, core->getFullScreen() ? XmSET : XmUNSET); ++n;
1953
+ btn = XmCreateToggleButton(popupMenu, "fullScreen", args, n);
1954
+ XmStringFree(s);
1955
+ XtManageChild(btn);
1956
+ XtAddCallback(btn, XmNvalueChangedCallback,
1957
+ &fullScreenToggleCbk, (XtPointer)this);
1958
+ n = 0;
1959
+ s = XmStringCreateLocalized("Rotate counterclockwise");
1960
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1961
+ btn = XmCreatePushButton(popupMenu, "rotateCCW", args, n);
1962
+ XmStringFree(s);
1963
+ XtManageChild(btn);
1964
+ XtAddCallback(btn, XmNactivateCallback,
1965
+ &rotateCCWCbk, (XtPointer)this);
1966
+ n = 0;
1967
+ s = XmStringCreateLocalized("Rotate clockwise");
1968
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1969
+ btn = XmCreatePushButton(popupMenu, "rotateCW", args, n);
1970
+ XmStringFree(s);
1971
+ XtManageChild(btn);
1972
+ XtAddCallback(btn, XmNactivateCallback,
1973
+ &rotateCWCbk, (XtPointer)this);
1974
+ n = 0;
1975
+ s = XmStringCreateLocalized("Zoom to selection");
1976
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1977
+ btn = XmCreatePushButton(popupMenu, "zoomToSelection", args, n);
1978
+ XmStringFree(s);
1979
+ XtManageChild(btn);
1980
+ XtAddCallback(btn, XmNactivateCallback,
1981
+ &zoomToSelectionCbk, (XtPointer)this);
1982
+ n = 0;
1983
+ btn = XmCreateSeparator(popupMenu, "sep2", args, n);
1984
+ XtManageChild(btn);
1985
+ n = 0;
1986
+ s = XmStringCreateLocalized("Close");
1987
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1988
+ s2 = XmStringCreateLocalized("Ctrl+W");
1989
+ XtSetArg(args[n], XmNacceleratorText, s2); ++n;
1990
+ btn = XmCreatePushButton(popupMenu, "close", args, n);
1991
+ XmStringFree(s);
1992
+ XmStringFree(s2);
1993
+ XtManageChild(btn);
1994
+ XtAddCallback(btn, XmNactivateCallback,
1995
+ &closeCbk, (XtPointer)this);
1996
+ n = 0;
1997
+ s = XmStringCreateLocalized("Quit");
1998
+ XtSetArg(args[n], XmNlabelString, s); ++n;
1999
+ s2 = XmStringCreateLocalized("Q");
2000
+ XtSetArg(args[n], XmNacceleratorText, s2); ++n;
2001
+ btn = XmCreatePushButton(popupMenu, "quit", args, n);
2002
+ XmStringFree(s);
2003
+ XmStringFree(s2);
2004
+ XtManageChild(btn);
2005
+ XtAddCallback(btn, XmNactivateCallback,
2006
+ &quitCbk, (XtPointer)this);
2007
+
2008
+ // this is magic (taken from DDD) - weird things happen if this
2009
+ // call isn't made
2010
+ XtUngrabButton(core->getDrawAreaWidget(), AnyButton, AnyModifier);
2011
+ }
2012
+
2013
+ void XPDFViewer::addToolTip(Widget widget, char *text) {
2014
+ #ifdef XmNtoolTipString
2015
+ XmString s;
2016
+ Cardinal n, i;
2017
+ WidgetList children;
2018
+
2019
+ if (XtIsComposite(widget)) {
2020
+ XtVaGetValues(widget, XmNnumChildren, &n, XmNchildren, &children, NULL);
2021
+ for (i = 0; i < n; ++i) {
2022
+ addToolTip(children[i], text);
2023
+ }
2024
+ } else {
2025
+ s = XmStringCreateLocalized(text);
2026
+ XtVaSetValues(widget, XmNtoolTipString, s, NULL);
2027
+ XmStringFree(s);
2028
+ }
2029
+ #endif
2030
+ }
2031
+
2032
+ void XPDFViewer::mapWindow() {
2033
+ #ifdef HAVE_X11_XPM_H
2034
+ Pixmap iconPixmap;
2035
+ #endif
2036
+ int depth;
2037
+ Pixel fg, bg, arm;
2038
+
2039
+ // show the window
2040
+ XtPopup(win, XtGrabNone);
2041
+ core->takeFocus();
2042
+
2043
+ // create the icon
2044
+ #ifdef HAVE_X11_XPM_H
2045
+ if (XpmCreatePixmapFromData(display, XtWindow(win), xpdfIcon,
2046
+ &iconPixmap, NULL, NULL) == XpmSuccess) {
2047
+ XtVaSetValues(win, XmNiconPixmap, iconPixmap, NULL);
2048
+ }
2049
+ #endif
2050
+
2051
+ // set button bitmaps (must be done after the window is mapped)
2052
+ if (toolBar != None) {
2053
+ XtVaGetValues(backBtn, XmNdepth, &depth,
2054
+ XmNforeground, &fg, XmNbackground, &bg,
2055
+ XmNarmColor, &arm, NULL);
2056
+ XtVaSetValues(backBtn, XmNlabelType, XmPIXMAP,
2057
+ XmNlabelPixmap,
2058
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2059
+ (char *)backArrow_bits,
2060
+ backArrow_width,
2061
+ backArrow_height,
2062
+ fg, bg, depth),
2063
+ XmNarmPixmap,
2064
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2065
+ (char *)backArrow_bits,
2066
+ backArrow_width,
2067
+ backArrow_height,
2068
+ fg, arm, depth),
2069
+ XmNlabelInsensitivePixmap,
2070
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2071
+ (char *)backArrowDis_bits,
2072
+ backArrowDis_width,
2073
+ backArrowDis_height,
2074
+ fg, bg, depth),
2075
+ NULL);
2076
+ XtVaSetValues(prevTenPageBtn, XmNlabelType, XmPIXMAP,
2077
+ XmNlabelPixmap,
2078
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2079
+ (char *)dblLeftArrow_bits,
2080
+ dblLeftArrow_width,
2081
+ dblLeftArrow_height,
2082
+ fg, bg, depth),
2083
+ XmNarmPixmap,
2084
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2085
+ (char *)dblLeftArrow_bits,
2086
+ dblLeftArrow_width,
2087
+ dblLeftArrow_height,
2088
+ fg, arm, depth),
2089
+ XmNlabelInsensitivePixmap,
2090
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2091
+ (char *)dblLeftArrowDis_bits,
2092
+ dblLeftArrowDis_width,
2093
+ dblLeftArrowDis_height,
2094
+ fg, bg, depth),
2095
+ NULL);
2096
+ XtVaSetValues(prevPageBtn, XmNlabelType, XmPIXMAP,
2097
+ XmNlabelPixmap,
2098
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2099
+ (char *)leftArrow_bits,
2100
+ leftArrow_width,
2101
+ leftArrow_height,
2102
+ fg, bg, depth),
2103
+ XmNarmPixmap,
2104
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2105
+ (char *)leftArrow_bits,
2106
+ leftArrow_width,
2107
+ leftArrow_height,
2108
+ fg, arm, depth),
2109
+ XmNlabelInsensitivePixmap,
2110
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2111
+ (char *)leftArrowDis_bits,
2112
+ leftArrowDis_width,
2113
+ leftArrowDis_height,
2114
+ fg, bg, depth),
2115
+ NULL);
2116
+ XtVaSetValues(nextPageBtn, XmNlabelType, XmPIXMAP,
2117
+ XmNlabelPixmap,
2118
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2119
+ (char *)rightArrow_bits,
2120
+ rightArrow_width,
2121
+ rightArrow_height,
2122
+ fg, bg, depth),
2123
+ XmNarmPixmap,
2124
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2125
+ (char *)rightArrow_bits,
2126
+ rightArrow_width,
2127
+ rightArrow_height,
2128
+ fg, arm, depth),
2129
+ XmNlabelInsensitivePixmap,
2130
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2131
+ (char *)rightArrowDis_bits,
2132
+ rightArrowDis_width,
2133
+ rightArrowDis_height,
2134
+ fg, bg, depth),
2135
+ NULL);
2136
+ XtVaSetValues(nextTenPageBtn, XmNlabelType, XmPIXMAP,
2137
+ XmNlabelPixmap,
2138
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2139
+ (char *)dblRightArrow_bits,
2140
+ dblRightArrow_width,
2141
+ dblRightArrow_height,
2142
+ fg, bg, depth),
2143
+ XmNarmPixmap,
2144
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2145
+ (char *)dblRightArrow_bits,
2146
+ dblRightArrow_width,
2147
+ dblRightArrow_height,
2148
+ fg, arm, depth),
2149
+ XmNlabelInsensitivePixmap,
2150
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2151
+ (char *)dblRightArrowDis_bits,
2152
+ dblRightArrowDis_width,
2153
+ dblRightArrowDis_height,
2154
+ fg, bg, depth),
2155
+ NULL);
2156
+ XtVaSetValues(forwardBtn, XmNlabelType, XmPIXMAP,
2157
+ XmNlabelPixmap,
2158
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2159
+ (char *)forwardArrow_bits,
2160
+ forwardArrow_width,
2161
+ forwardArrow_height,
2162
+ fg, bg, depth),
2163
+ XmNarmPixmap,
2164
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2165
+ (char *)forwardArrow_bits,
2166
+ forwardArrow_width,
2167
+ forwardArrow_height,
2168
+ fg, arm, depth),
2169
+ XmNlabelInsensitivePixmap,
2170
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2171
+ (char *)forwardArrowDis_bits,
2172
+ forwardArrowDis_width,
2173
+ forwardArrowDis_height,
2174
+ fg, bg, depth),
2175
+ NULL);
2176
+ XtVaSetValues(findBtn, XmNlabelType, XmPIXMAP,
2177
+ XmNlabelPixmap,
2178
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2179
+ (char *)find_bits,
2180
+ find_width,
2181
+ find_height,
2182
+ fg, bg, depth),
2183
+ XmNarmPixmap,
2184
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2185
+ (char *)find_bits,
2186
+ find_width,
2187
+ find_height,
2188
+ fg, arm, depth),
2189
+ XmNlabelInsensitivePixmap,
2190
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2191
+ (char *)findDis_bits,
2192
+ findDis_width,
2193
+ findDis_height,
2194
+ fg, bg, depth),
2195
+ NULL);
2196
+ XtVaSetValues(printBtn, XmNlabelType, XmPIXMAP,
2197
+ XmNlabelPixmap,
2198
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2199
+ (char *)print_bits,
2200
+ print_width,
2201
+ print_height,
2202
+ fg, bg, depth),
2203
+ XmNarmPixmap,
2204
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2205
+ (char *)print_bits,
2206
+ print_width,
2207
+ print_height,
2208
+ fg, arm, depth),
2209
+ XmNlabelInsensitivePixmap,
2210
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2211
+ (char *)printDis_bits,
2212
+ printDis_width,
2213
+ printDis_height,
2214
+ fg, bg, depth),
2215
+ NULL);
2216
+ XtVaSetValues(aboutBtn, XmNlabelType, XmPIXMAP,
2217
+ XmNlabelPixmap,
2218
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2219
+ (char *)about_bits,
2220
+ about_width,
2221
+ about_height,
2222
+ fg, bg, depth),
2223
+ XmNarmPixmap,
2224
+ XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
2225
+ (char *)about_bits,
2226
+ about_width,
2227
+ about_height,
2228
+ fg, arm, depth),
2229
+ NULL);
2230
+ }
2231
+ }
2232
+
2233
+ void XPDFViewer::closeWindow() {
2234
+ XtPopdown(win);
2235
+ XtDestroyWidget(win);
2236
+ }
2237
+
2238
+ int XPDFViewer::getZoomIdx() {
2239
+ int i;
2240
+
2241
+ for (i = 0; i < nZoomMenuItems; ++i) {
2242
+ if (core->getZoom() == zoomMenuInfo[i].zoom) {
2243
+ return i;
2244
+ }
2245
+ }
2246
+ return -1;
2247
+ }
2248
+
2249
+ void XPDFViewer::setZoomIdx(int idx) {
2250
+ if (toolBar == None) {
2251
+ return;
2252
+ }
2253
+ #if USE_COMBO_BOX
2254
+ XtVaSetValues(zoomComboBox, XmNselectedPosition, idx + 1, NULL);
2255
+ #else
2256
+ XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[idx], NULL);
2257
+ #endif
2258
+ }
2259
+
2260
+ void XPDFViewer::setZoomVal(double z) {
2261
+ if (toolBar == None) {
2262
+ return;
2263
+ }
2264
+
2265
+ #if USE_COMBO_BOX
2266
+ char buf[32];
2267
+ XmString s;
2268
+ int i;
2269
+
2270
+ for (i = 0; i < nZoomMenuItems; ++i) {
2271
+ if (z == zoomMenuInfo[i].zoom) {
2272
+ XtVaSetValues(zoomComboBox, XmNselectedPosition, i + 1, NULL);
2273
+ return;
2274
+ }
2275
+ }
2276
+ sprintf(buf, "%d%%", (int)z);
2277
+ s = XmStringCreateLocalized(buf);
2278
+ XtVaSetValues(zoomComboBox, XmNselectedItem, s, NULL);
2279
+ XmStringFree(s);
2280
+ #else
2281
+ int i;
2282
+
2283
+ for (i = 0; i < nZoomMenuItems; ++i) {
2284
+ if (z == zoomMenuInfo[i].zoom) {
2285
+ XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[i], NULL);
2286
+ return;
2287
+ }
2288
+ }
2289
+ for (i = maxZoomIdx; i < minZoomIdx; ++i) {
2290
+ if (z > zoomMenuInfo[i].zoom) {
2291
+ break;
2292
+ }
2293
+ }
2294
+ XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[i], NULL);
2295
+ #endif
2296
+ }
2297
+
2298
+ void XPDFViewer::prevPageCbk(Widget widget, XtPointer ptr,
2299
+ XtPointer callData) {
2300
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2301
+
2302
+ viewer->core->gotoPrevPage(1, gTrue, gFalse);
2303
+ viewer->core->takeFocus();
2304
+ }
2305
+
2306
+ void XPDFViewer::prevTenPageCbk(Widget widget, XtPointer ptr,
2307
+ XtPointer callData) {
2308
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2309
+
2310
+ viewer->core->gotoPrevPage(10, gTrue, gFalse);
2311
+ viewer->core->takeFocus();
2312
+ }
2313
+
2314
+ void XPDFViewer::nextPageCbk(Widget widget, XtPointer ptr,
2315
+ XtPointer callData) {
2316
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2317
+
2318
+ viewer->core->gotoNextPage(1, gTrue);
2319
+ viewer->core->takeFocus();
2320
+ }
2321
+
2322
+ void XPDFViewer::nextTenPageCbk(Widget widget, XtPointer ptr,
2323
+ XtPointer callData) {
2324
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2325
+
2326
+ viewer->core->gotoNextPage(10, gTrue);
2327
+ viewer->core->takeFocus();
2328
+ }
2329
+
2330
+ void XPDFViewer::backCbk(Widget widget, XtPointer ptr,
2331
+ XtPointer callData) {
2332
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2333
+
2334
+ viewer->core->goBackward();
2335
+ viewer->core->takeFocus();
2336
+ }
2337
+
2338
+ void XPDFViewer::forwardCbk(Widget widget, XtPointer ptr,
2339
+ XtPointer callData) {
2340
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2341
+
2342
+ viewer->core->goForward();
2343
+ viewer->core->takeFocus();
2344
+ }
2345
+
2346
+ #if USE_COMBO_BOX
2347
+
2348
+ void XPDFViewer::zoomComboBoxCbk(Widget widget, XtPointer ptr,
2349
+ XtPointer callData) {
2350
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2351
+ XmComboBoxCallbackStruct *data = (XmComboBoxCallbackStruct *)callData;
2352
+ double z;
2353
+ char *s;
2354
+ XmStringContext context;
2355
+ XmStringCharSet charSet;
2356
+ XmStringDirection dir;
2357
+ Boolean sep;
2358
+
2359
+ z = viewer->core->getZoom();
2360
+ if (data->item_position == 0) {
2361
+ XmStringInitContext(&context, data->item_or_text);
2362
+ if (XmStringGetNextSegment(context, &s, &charSet, &dir, &sep)) {
2363
+ z = atof(s);
2364
+ if (z <= 1) {
2365
+ z = defZoom;
2366
+ }
2367
+ XtFree(charSet);
2368
+ XtFree(s);
2369
+ }
2370
+ XmStringFreeContext(context);
2371
+ } else {
2372
+ z = zoomMenuInfo[data->item_position - 1].zoom;
2373
+ }
2374
+ // only redraw if this was triggered by an event; otherwise
2375
+ // the caller is responsible for doing the redraw
2376
+ if (z != viewer->core->getZoom() && data->event) {
2377
+ viewer->displayPage(viewer->core->getPageNum(), z,
2378
+ viewer->core->getRotate(), gTrue, gFalse);
2379
+ }
2380
+ viewer->core->takeFocus();
2381
+ }
2382
+
2383
+ #else // USE_COMBO_BOX
2384
+
2385
+ void XPDFViewer::zoomMenuCbk(Widget widget, XtPointer ptr,
2386
+ XtPointer callData) {
2387
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2388
+ XmPushButtonCallbackStruct *data = (XmPushButtonCallbackStruct *)callData;
2389
+ XtPointer userData;
2390
+ double z;
2391
+
2392
+ XtVaGetValues(widget, XmNuserData, &userData, NULL);
2393
+ z = zoomMenuInfo[(long)userData].zoom;
2394
+ // only redraw if this was triggered by an event; otherwise
2395
+ // the caller is responsible for doing the redraw
2396
+ if (z != viewer->core->getZoom() && data->event) {
2397
+ viewer->displayPage(viewer->core->getPageNum(), z,
2398
+ viewer->core->getRotate(), gTrue, gFalse);
2399
+ }
2400
+ viewer->core->takeFocus();
2401
+ }
2402
+
2403
+ #endif // USE_COMBO_BOX
2404
+
2405
+ void XPDFViewer::findCbk(Widget widget, XtPointer ptr,
2406
+ XtPointer callData) {
2407
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2408
+
2409
+ if (!viewer->core->getDoc()) {
2410
+ return;
2411
+ }
2412
+ viewer->mapFindDialog();
2413
+ }
2414
+
2415
+ void XPDFViewer::printCbk(Widget widget, XtPointer ptr,
2416
+ XtPointer callData) {
2417
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2418
+
2419
+ if (!viewer->core->getDoc()) {
2420
+ return;
2421
+ }
2422
+ XtManageChild(viewer->printDialog);
2423
+ }
2424
+
2425
+ void XPDFViewer::aboutCbk(Widget widget, XtPointer ptr,
2426
+ XtPointer callData) {
2427
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2428
+
2429
+ XtManageChild(viewer->aboutDialog);
2430
+ }
2431
+
2432
+ void XPDFViewer::quitCbk(Widget widget, XtPointer ptr,
2433
+ XtPointer callData) {
2434
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2435
+
2436
+ viewer->app->quit();
2437
+ }
2438
+
2439
+ void XPDFViewer::openCbk(Widget widget, XtPointer ptr,
2440
+ XtPointer callData) {
2441
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2442
+
2443
+ viewer->mapOpenDialog(gFalse);
2444
+ }
2445
+
2446
+ void XPDFViewer::openInNewWindowCbk(Widget widget, XtPointer ptr,
2447
+ XtPointer callData) {
2448
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2449
+
2450
+ viewer->mapOpenDialog(gTrue);
2451
+ }
2452
+
2453
+ void XPDFViewer::reloadCbk(Widget widget, XtPointer ptr,
2454
+ XtPointer callData) {
2455
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2456
+
2457
+ viewer->reloadFile();
2458
+ }
2459
+
2460
+ void XPDFViewer::saveAsCbk(Widget widget, XtPointer ptr,
2461
+ XtPointer callData) {
2462
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2463
+
2464
+ if (!viewer->core->getDoc()) {
2465
+ return;
2466
+ }
2467
+ viewer->mapSaveAsDialog();
2468
+ }
2469
+
2470
+ void XPDFViewer::continuousModeToggleCbk(Widget widget, XtPointer ptr,
2471
+ XtPointer callData) {
2472
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2473
+ XmToggleButtonCallbackStruct *data =
2474
+ (XmToggleButtonCallbackStruct *)callData;
2475
+
2476
+ viewer->core->setContinuousMode(data->set == XmSET);
2477
+ }
2478
+
2479
+ void XPDFViewer::fullScreenToggleCbk(Widget widget, XtPointer ptr,
2480
+ XtPointer callData) {
2481
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2482
+ XmToggleButtonCallbackStruct *data =
2483
+ (XmToggleButtonCallbackStruct *)callData;
2484
+
2485
+ if (data->set == XmSET) {
2486
+ viewer->cmdFullScreenMode(NULL, 0, NULL);
2487
+ } else {
2488
+ viewer->cmdWindowMode(NULL, 0, NULL);
2489
+ }
2490
+ }
2491
+
2492
+ void XPDFViewer::rotateCCWCbk(Widget widget, XtPointer ptr,
2493
+ XtPointer callData) {
2494
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2495
+ int r;
2496
+
2497
+ r = viewer->core->getRotate();
2498
+ r = (r == 0) ? 270 : r - 90;
2499
+ viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(),
2500
+ r, gTrue, gFalse);
2501
+ }
2502
+
2503
+ void XPDFViewer::rotateCWCbk(Widget widget, XtPointer ptr,
2504
+ XtPointer callData) {
2505
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2506
+ int r;
2507
+
2508
+ r = viewer->core->getRotate();
2509
+ r = (r == 270) ? 0 : r + 90;
2510
+ viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(),
2511
+ r, gTrue, gFalse);
2512
+ }
2513
+
2514
+ void XPDFViewer::zoomToSelectionCbk(Widget widget, XtPointer ptr,
2515
+ XtPointer callData) {
2516
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2517
+ int pg;
2518
+ double ulx, uly, lrx, lry;
2519
+
2520
+ if (viewer->core->getSelection(&pg, &ulx, &uly, &lrx, &lry)) {
2521
+ viewer->core->zoomToRect(pg, ulx, uly, lrx, lry);
2522
+ }
2523
+ }
2524
+
2525
+ void XPDFViewer::closeCbk(Widget widget, XtPointer ptr,
2526
+ XtPointer callData) {
2527
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2528
+
2529
+ viewer->app->close(viewer, gFalse);
2530
+ }
2531
+
2532
+ void XPDFViewer::closeMsgCbk(Widget widget, XtPointer ptr,
2533
+ XtPointer callData) {
2534
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2535
+
2536
+ viewer->app->close(viewer, gTrue);
2537
+ }
2538
+
2539
+ void XPDFViewer::pageNumCbk(Widget widget, XtPointer ptr,
2540
+ XtPointer callData) {
2541
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2542
+ char *s, *p;
2543
+ int pg;
2544
+ char buf[20];
2545
+
2546
+ if (!viewer->core->getDoc()) {
2547
+ goto err;
2548
+ }
2549
+ s = XmTextFieldGetString(viewer->pageNumText);
2550
+ for (p = s; *p; ++p) {
2551
+ if (!isdigit(*p)) {
2552
+ goto err;
2553
+ }
2554
+ }
2555
+ pg = atoi(s);
2556
+ if (pg < 1 || pg > viewer->core->getDoc()->getNumPages()) {
2557
+ goto err;
2558
+ }
2559
+ viewer->displayPage(pg, viewer->core->getZoom(),
2560
+ viewer->core->getRotate(), gFalse, gTrue);
2561
+ viewer->core->takeFocus();
2562
+ return;
2563
+
2564
+ err:
2565
+ XBell(viewer->display, 0);
2566
+ sprintf(buf, "%d", viewer->core->getPageNum());
2567
+ XmTextFieldSetString(viewer->pageNumText, buf);
2568
+ }
2569
+
2570
+ void XPDFViewer::updateCbk(void *data, GString *fileName,
2571
+ int pageNum, int numPages, char *linkString) {
2572
+ XPDFViewer *viewer = (XPDFViewer *)data;
2573
+ GString *title;
2574
+ char buf[20];
2575
+ XmString s;
2576
+
2577
+ if (fileName) {
2578
+ if (!(title = viewer->app->getTitle())) {
2579
+ title = (new GString(xpdfAppName))->append(": ")->append(fileName);
2580
+ }
2581
+ XtVaSetValues(viewer->win, XmNtitle, title->getCString(),
2582
+ XmNiconName, title->getCString(), NULL);
2583
+ if (!viewer->app->getTitle()) {
2584
+ delete title;
2585
+ }
2586
+ #ifndef DISABLE_OUTLINE
2587
+ viewer->setupOutline();
2588
+ #endif
2589
+ viewer->setupPrintDialog();
2590
+ }
2591
+
2592
+ if (viewer->toolBar != None) {
2593
+ if (pageNum >= 0) {
2594
+ s = XmStringCreateLocalized("");
2595
+ XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL);
2596
+ XmStringFree(s);
2597
+ sprintf(buf, "%d", pageNum);
2598
+ XmTextFieldSetString(viewer->pageNumText, buf);
2599
+ XtVaSetValues(viewer->prevTenPageBtn, XmNsensitive,
2600
+ pageNum > 1, NULL);
2601
+ XtVaSetValues(viewer->prevPageBtn, XmNsensitive,
2602
+ pageNum > 1, NULL);
2603
+ XtVaSetValues(viewer->nextTenPageBtn, XmNsensitive,
2604
+ pageNum < viewer->core->getDoc()->getNumPages(), NULL);
2605
+ XtVaSetValues(viewer->nextPageBtn, XmNsensitive,
2606
+ pageNum < viewer->core->getDoc()->getNumPages(), NULL);
2607
+ XtVaSetValues(viewer->backBtn, XmNsensitive,
2608
+ viewer->core->canGoBack(), NULL);
2609
+ XtVaSetValues(viewer->forwardBtn, XmNsensitive,
2610
+ viewer->core->canGoForward(), NULL);
2611
+ }
2612
+
2613
+ if (numPages >= 0) {
2614
+ sprintf(buf, " of %d", numPages);
2615
+ s = XmStringCreateLocalized(buf);
2616
+ XtVaSetValues(viewer->pageCountLabel, XmNlabelString, s, NULL);
2617
+ XmStringFree(s);
2618
+ }
2619
+
2620
+ if (linkString) {
2621
+ s = XmStringCreateLocalized(linkString);
2622
+ XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL);
2623
+ XmStringFree(s);
2624
+ }
2625
+ }
2626
+ }
2627
+
2628
+
2629
+ //------------------------------------------------------------------------
2630
+ // GUI code: outline
2631
+ //------------------------------------------------------------------------
2632
+
2633
+ #ifndef DISABLE_OUTLINE
2634
+
2635
+ void XPDFViewer::setupOutline() {
2636
+ GList *items;
2637
+ UnicodeMap *uMap;
2638
+ GString *enc;
2639
+ int i;
2640
+
2641
+ if (outlineScroll == None) {
2642
+ return;
2643
+ }
2644
+
2645
+ // unmanage and destroy the old labels
2646
+ if (outlineLabels) {
2647
+ XtUnmanageChildren(outlineLabels, outlineLabelsLength);
2648
+ for (i = 0; i < outlineLabelsLength; ++i) {
2649
+ XtDestroyWidget(outlineLabels[i]);
2650
+ }
2651
+ gfree(outlineLabels);
2652
+ outlineLabels = NULL;
2653
+ outlineLabelsLength = outlineLabelsSize = 0;
2654
+ }
2655
+
2656
+ if (core->getDoc()) {
2657
+
2658
+ // create the new labels
2659
+ items = core->getDoc()->getOutline()->getItems();
2660
+ if (items && items->getLength() > 0) {
2661
+ enc = new GString("Latin1");
2662
+ uMap = globalParams->getUnicodeMap(enc);
2663
+ delete enc;
2664
+ setupOutlineItems(items, NULL, uMap);
2665
+ uMap->decRefCnt();
2666
+ }
2667
+
2668
+ // manage the new labels
2669
+ XtManageChildren(outlineLabels, outlineLabelsLength);
2670
+ }
2671
+ }
2672
+
2673
+ void XPDFViewer::setupOutlineItems(GList *items, Widget parent,
2674
+ UnicodeMap *uMap) {
2675
+ OutlineItem *item;
2676
+ GList *kids;
2677
+ Widget label;
2678
+ Arg args[20];
2679
+ GString *title;
2680
+ char buf[8];
2681
+ XmString s;
2682
+ int i, j, n;
2683
+
2684
+ for (i = 0; i < items->getLength(); ++i) {
2685
+ item = (OutlineItem *)items->get(i);
2686
+ title = new GString();
2687
+ for (j = 0; j < item->getTitleLength(); ++j) {
2688
+ n = uMap->mapUnicode(item->getTitle()[j], buf, sizeof(buf));
2689
+ title->append(buf, n);
2690
+ }
2691
+ n = 0;
2692
+ XtSetArg(args[n], XPDFNentryPosition, i); ++n;
2693
+ if (parent) {
2694
+ XtSetArg(args[n], XPDFNentryParent, parent); ++n;
2695
+ }
2696
+ XtSetArg(args[n], XPDFNentryExpanded, item->isOpen()); ++n;
2697
+ s = XmStringCreateLocalized(title->getCString());
2698
+ delete title;
2699
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2700
+ XtSetArg(args[n], XmNuserData, item); ++n;
2701
+ XtSetArg(args[n], XmNmarginWidth, 0); ++n;
2702
+ XtSetArg(args[n], XmNmarginHeight, 2); ++n;
2703
+ XtSetArg(args[n], XmNshadowThickness, 0); ++n;
2704
+ XtSetArg(args[n], XmNforeground,
2705
+ app->getReverseVideo() ? WhitePixel(display, screenNum)
2706
+ : BlackPixel(display, screenNum)); ++n;
2707
+ XtSetArg(args[n], XmNbackground, app->getPaperPixel()); ++n;
2708
+ label = XmCreateLabelGadget(outlineTree, "label", args, n);
2709
+ XmStringFree(s);
2710
+ if (outlineLabelsLength == outlineLabelsSize) {
2711
+ outlineLabelsSize += 64;
2712
+ outlineLabels = (Widget *)greallocn(outlineLabels,
2713
+ outlineLabelsSize, sizeof(Widget *));
2714
+ }
2715
+ outlineLabels[outlineLabelsLength++] = label;
2716
+ item->open();
2717
+ if ((kids = item->getKids())) {
2718
+ setupOutlineItems(kids, label, uMap);
2719
+ }
2720
+ }
2721
+ }
2722
+
2723
+ void XPDFViewer::outlineSelectCbk(Widget widget, XtPointer ptr,
2724
+ XtPointer callData) {
2725
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2726
+ XPDFTreeSelectCallbackStruct *data =
2727
+ (XPDFTreeSelectCallbackStruct *)callData;
2728
+ OutlineItem *item;
2729
+
2730
+ XtVaGetValues(data->selectedItem, XmNuserData, &item, NULL);
2731
+ if (item) {
2732
+ if (item->getAction()) {
2733
+ viewer->core->doAction(item->getAction());
2734
+ }
2735
+ }
2736
+ viewer->core->takeFocus();
2737
+ }
2738
+
2739
+ #endif // !DISABLE_OUTLINE
2740
+
2741
+ //------------------------------------------------------------------------
2742
+ // GUI code: "about" dialog
2743
+ //------------------------------------------------------------------------
2744
+
2745
+ void XPDFViewer::initAboutDialog() {
2746
+ Widget scrolledWin, col, label, sep, closeBtn;
2747
+ Arg args[20];
2748
+ int n, i;
2749
+ XmString s;
2750
+ char buf[20];
2751
+
2752
+ //----- dialog
2753
+ n = 0;
2754
+ s = XmStringCreateLocalized(xpdfAppName ": About");
2755
+ XtSetArg(args[n], XmNdialogTitle, s); ++n;
2756
+ XtSetArg(args[n], XmNwidth, 450); ++n;
2757
+ XtSetArg(args[n], XmNheight, 300); ++n;
2758
+ aboutDialog = XmCreateFormDialog(win, "aboutDialog", args, n);
2759
+ XmStringFree(s);
2760
+
2761
+ //----- "close" button
2762
+ n = 0;
2763
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
2764
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
2765
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
2766
+ XtSetArg(args[n], XmNbottomOffset, 4); ++n;
2767
+ closeBtn = XmCreatePushButton(aboutDialog, "Close", args, n);
2768
+ XtManageChild(closeBtn);
2769
+ n = 0;
2770
+ XtSetArg(args[n], XmNdefaultButton, closeBtn); ++n;
2771
+ XtSetArg(args[n], XmNcancelButton, closeBtn); ++n;
2772
+ XtSetValues(aboutDialog, args, n);
2773
+
2774
+ //----- scrolled window and RowColumn
2775
+ n = 0;
2776
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
2777
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
2778
+ XtSetArg(args[n], XmNbottomWidget, closeBtn); ++n;
2779
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
2780
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
2781
+ XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n;
2782
+ scrolledWin = XmCreateScrolledWindow(aboutDialog, "scrolledWin", args, n);
2783
+ XtManageChild(scrolledWin);
2784
+ n = 0;
2785
+ XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n;
2786
+ XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n;
2787
+ col = XmCreateRowColumn(scrolledWin, "col", args, n);
2788
+ XtManageChild(col);
2789
+
2790
+ //----- fonts
2791
+ aboutBigFont =
2792
+ createFontList("-*-times-bold-i-normal--20-*-*-*-*-*-iso8859-1");
2793
+ aboutVersionFont =
2794
+ createFontList("-*-times-medium-r-normal--16-*-*-*-*-*-iso8859-1");
2795
+ aboutFixedFont =
2796
+ createFontList("-*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1");
2797
+
2798
+ //----- heading
2799
+ n = 0;
2800
+ s = XmStringCreateLocalized("Xpdf");
2801
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2802
+ XtSetArg(args[n], XmNfontList, aboutBigFont); ++n;
2803
+ label = XmCreateLabel(col, "h0", args, n);
2804
+ XmStringFree(s);
2805
+ XtManageChild(label);
2806
+ n = 0;
2807
+ s = XmStringCreateLocalized("Version " xpdfVersion);
2808
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2809
+ XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
2810
+ label = XmCreateLabel(col, "h1", args, n);
2811
+ XmStringFree(s);
2812
+ XtManageChild(label);
2813
+ n = 0;
2814
+ s = XmStringCreateLocalized(xpdfCopyright);
2815
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2816
+ XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
2817
+ label = XmCreateLabel(col, "h2", args, n);
2818
+ XmStringFree(s);
2819
+ XtManageChild(label);
2820
+ n = 0;
2821
+ s = XmStringCreateLocalized(" ");
2822
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2823
+ XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
2824
+ label = XmCreateLabel(col, "h3", args, n);
2825
+ XmStringFree(s);
2826
+ XtManageChild(label);
2827
+ n = 0;
2828
+ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
2829
+ sep = XmCreateSeparator(col, "sep", args, n);
2830
+ XtManageChild(sep);
2831
+ n = 0;
2832
+ s = XmStringCreateLocalized(" ");
2833
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2834
+ XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
2835
+ label = XmCreateLabel(col, "h4", args, n);
2836
+ XmStringFree(s);
2837
+ XtManageChild(label);
2838
+ n = 0;
2839
+
2840
+ //----- text
2841
+ for (i = 0; aboutWinText[i]; ++i) {
2842
+ n = 0;
2843
+ s = XmStringCreateLocalized(aboutWinText[i]);
2844
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2845
+ XtSetArg(args[n], XmNfontList, aboutFixedFont); ++n;
2846
+ sprintf(buf, "t%d", i);
2847
+ label = XmCreateLabel(col, buf, args, n);
2848
+ XtManageChild(label);
2849
+ XmStringFree(s);
2850
+ }
2851
+ }
2852
+
2853
+ //------------------------------------------------------------------------
2854
+ // GUI code: "open" dialog
2855
+ //------------------------------------------------------------------------
2856
+
2857
+ void XPDFViewer::initOpenDialog() {
2858
+ Arg args[20];
2859
+ int n;
2860
+ XmString s1, s2, s3;
2861
+ GString *dir;
2862
+
2863
+ n = 0;
2864
+ s1 = XmStringCreateLocalized("Open");
2865
+ XtSetArg(args[n], XmNokLabelString, s1); ++n;
2866
+ s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]");
2867
+ XtSetArg(args[n], XmNpattern, s2); ++n;
2868
+ s3 = XmStringCreateLocalized(xpdfAppName ": Open");
2869
+ XtSetArg(args[n], XmNdialogTitle, s3); ++n;
2870
+ XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
2871
+ XtSetArg(args[n], XmNautoUnmanage, True); ++n;
2872
+ openDialog = XmCreateFileSelectionDialog(win, "openDialog", args, n);
2873
+ XmStringFree(s1);
2874
+ XmStringFree(s2);
2875
+ XmStringFree(s3);
2876
+ XtUnmanageChild(XmFileSelectionBoxGetChild(openDialog,
2877
+ XmDIALOG_HELP_BUTTON));
2878
+ XtAddCallback(openDialog, XmNokCallback,
2879
+ &openOkCbk, (XtPointer)this);
2880
+
2881
+ if (core->getDoc() && core->getDoc()->getFileName()) {
2882
+ dir = makePathAbsolute(grabPath(
2883
+ core->getDoc()->getFileName()->getCString()));
2884
+ s1 = XmStringCreateLocalized(dir->getCString());
2885
+ XtVaSetValues(openDialog, XmNdirectory, s1, NULL);
2886
+ XmStringFree(s1);
2887
+ delete dir;
2888
+ }
2889
+ }
2890
+
2891
+ void XPDFViewer::mapOpenDialog(GBool openInNewWindowA) {
2892
+ if (!openDialog) {
2893
+ initOpenDialog();
2894
+ }
2895
+ openInNewWindow = openInNewWindowA;
2896
+ XmFileSelectionDoSearch(openDialog, NULL);
2897
+ XtManageChild(openDialog);
2898
+ }
2899
+
2900
+ void XPDFViewer::openOkCbk(Widget widget, XtPointer ptr,
2901
+ XtPointer callData) {
2902
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
2903
+ XmFileSelectionBoxCallbackStruct *data =
2904
+ (XmFileSelectionBoxCallbackStruct *)callData;
2905
+ char *fileName;
2906
+ XmStringContext context;
2907
+ XmStringCharSet charSet;
2908
+ XmStringDirection dir;
2909
+ Boolean sep;
2910
+ GString *fileNameStr;
2911
+
2912
+ XmStringInitContext(&context, data->value);
2913
+ if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) {
2914
+ fileNameStr = new GString(fileName);
2915
+ if (viewer->openInNewWindow) {
2916
+ viewer->app->open(fileNameStr);
2917
+ } else {
2918
+ if (viewer->loadFile(fileNameStr)) {
2919
+ viewer->displayPage(1, viewer->core->getZoom(),
2920
+ viewer->core->getRotate(), gTrue, gTrue);
2921
+ }
2922
+ }
2923
+ delete fileNameStr;
2924
+ XtFree(charSet);
2925
+ XtFree(fileName);
2926
+ }
2927
+ XmStringFreeContext(context);
2928
+ }
2929
+
2930
+ //------------------------------------------------------------------------
2931
+ // GUI code: "find" dialog
2932
+ //------------------------------------------------------------------------
2933
+
2934
+ void XPDFViewer::initFindDialog() {
2935
+ Widget form1, label, okBtn, closeBtn;
2936
+ Arg args[20];
2937
+ int n;
2938
+ XmString s;
2939
+
2940
+ //----- dialog
2941
+ n = 0;
2942
+ s = XmStringCreateLocalized(xpdfAppName ": Find");
2943
+ XtSetArg(args[n], XmNdialogTitle, s); ++n;
2944
+ XtSetArg(args[n], XmNnavigationType, XmNONE); ++n;
2945
+ XtSetArg(args[n], XmNautoUnmanage, False); ++n;
2946
+ findDialog = XmCreateFormDialog(win, "findDialog", args, n);
2947
+ XmStringFree(s);
2948
+
2949
+ //----- "find" and "close" buttons
2950
+ n = 0;
2951
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
2952
+ XtSetArg(args[n], XmNleftOffset, 4); ++n;
2953
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
2954
+ XtSetArg(args[n], XmNbottomOffset, 4); ++n;
2955
+ XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
2956
+ okBtn = XmCreatePushButton(findDialog, "Find", args, n);
2957
+ XtManageChild(okBtn);
2958
+ XtAddCallback(okBtn, XmNactivateCallback,
2959
+ &findFindCbk, (XtPointer)this);
2960
+ n = 0;
2961
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
2962
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
2963
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
2964
+ XtSetArg(args[n], XmNbottomOffset, 4); ++n;
2965
+ XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
2966
+ closeBtn = XmCreatePushButton(findDialog, "Close", args, n);
2967
+ XtManageChild(closeBtn);
2968
+ XtAddCallback(closeBtn, XmNactivateCallback,
2969
+ &findCloseCbk, (XtPointer)this);
2970
+
2971
+ //----- checkboxes
2972
+ n = 0;
2973
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
2974
+ XtSetArg(args[n], XmNleftOffset, 4); ++n;
2975
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
2976
+ XtSetArg(args[n], XmNbottomWidget, okBtn); ++n;
2977
+ XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); ++n;
2978
+ #if XmVERSION <= 1
2979
+ XtSetArg(args[n], XmNindicatorOn, True); ++n;
2980
+ #else
2981
+ XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_FILL); ++n;
2982
+ #endif
2983
+ XtSetArg(args[n], XmNset, XmUNSET); ++n;
2984
+ s = XmStringCreateLocalized("Search backward");
2985
+ XtSetArg(args[n], XmNlabelString, s); ++n;
2986
+ findBackwardToggle = XmCreateToggleButton(findDialog, "backward", args, n);
2987
+ XmStringFree(s);
2988
+ XtManageChild(findBackwardToggle);
2989
+ n = 0;
2990
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
2991
+ XtSetArg(args[n], XmNleftWidget, findBackwardToggle); ++n;
2992
+ XtSetArg(args[n], XmNleftOffset, 16); ++n;
2993
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
2994
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
2995
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
2996
+ XtSetArg(args[n], XmNbottomWidget, okBtn); ++n;
2997
+ XtSetArg(args[n], XmNindicatorType, XmN_OF_MANY); ++n;
2998
+ #if XmVERSION <= 1
2999
+ XtSetArg(args[n], XmNindicatorOn, True); ++n;
3000
+ #else
3001
+ XtSetArg(args[n], XmNindicatorOn, XmINDICATOR_FILL); ++n;
3002
+ #endif
3003
+ XtSetArg(args[n], XmNset, XmUNSET); ++n;
3004
+ s = XmStringCreateLocalized("Match case");
3005
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3006
+ findCaseSensitiveToggle =
3007
+ XmCreateToggleButton(findDialog, "matchCase", args, n);
3008
+ XmStringFree(s);
3009
+ XtManageChild(findCaseSensitiveToggle);
3010
+
3011
+ //----- search string entry
3012
+ n = 0;
3013
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
3014
+ XtSetArg(args[n], XmNtopOffset, 4); ++n;
3015
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
3016
+ XtSetArg(args[n], XmNbottomWidget, findBackwardToggle); ++n;
3017
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3018
+ XtSetArg(args[n], XmNleftOffset, 2); ++n;
3019
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3020
+ XtSetArg(args[n], XmNrightOffset, 2); ++n;
3021
+ form1 = XmCreateForm(findDialog, "form", args, n);
3022
+ XtManageChild(form1);
3023
+ n = 0;
3024
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
3025
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
3026
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3027
+ s = XmStringCreateLocalized("Find text: ");
3028
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3029
+ label = XmCreateLabel(form1, "label", args, n);
3030
+ XmStringFree(s);
3031
+ XtManageChild(label);
3032
+ n = 0;
3033
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
3034
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
3035
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
3036
+ XtSetArg(args[n], XmNleftWidget, label); ++n;
3037
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3038
+ findText = XmCreateTextField(form1, "text", args, n);
3039
+ XtManageChild(findText);
3040
+ #ifdef LESSTIF_VERSION
3041
+ XtAddCallback(findText, XmNactivateCallback,
3042
+ &findFindCbk, (XtPointer)this);
3043
+ #endif
3044
+
3045
+ //----- dialog parameters
3046
+ n = 0;
3047
+ XtSetArg(args[n], XmNdefaultButton, okBtn); ++n;
3048
+ XtSetArg(args[n], XmNcancelButton, closeBtn); ++n;
3049
+ #if XmVersion > 1001
3050
+ XtSetArg(args[n], XmNinitialFocus, findText); ++n;
3051
+ #endif
3052
+ XtSetValues(findDialog, args, n);
3053
+ }
3054
+
3055
+ void XPDFViewer::findFindCbk(Widget widget, XtPointer ptr,
3056
+ XtPointer callData) {
3057
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3058
+
3059
+ viewer->doFind(gFalse);
3060
+ }
3061
+
3062
+ void XPDFViewer::mapFindDialog() {
3063
+ XmTextFieldSetSelection(findText, 0, XmTextFieldGetLastPosition(findText),
3064
+ XtLastTimestampProcessed(display));
3065
+ XmTextFieldSetInsertionPosition(findText, 0);
3066
+ XtManageChild(findDialog);
3067
+ }
3068
+
3069
+ void XPDFViewer::doFind(GBool next) {
3070
+ if (XtWindow(findDialog)) {
3071
+ XDefineCursor(display, XtWindow(findDialog), core->getBusyCursor());
3072
+ }
3073
+ core->find(XmTextFieldGetString(findText),
3074
+ XmToggleButtonGetState(findCaseSensitiveToggle),
3075
+ next,
3076
+ XmToggleButtonGetState(findBackwardToggle),
3077
+ gFalse);
3078
+ if (XtWindow(findDialog)) {
3079
+ XUndefineCursor(display, XtWindow(findDialog));
3080
+ }
3081
+ }
3082
+
3083
+ void XPDFViewer::findCloseCbk(Widget widget, XtPointer ptr,
3084
+ XtPointer callData) {
3085
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3086
+
3087
+ XtUnmanageChild(viewer->findDialog);
3088
+ }
3089
+
3090
+ //------------------------------------------------------------------------
3091
+ // GUI code: "save as" dialog
3092
+ //------------------------------------------------------------------------
3093
+
3094
+ void XPDFViewer::initSaveAsDialog() {
3095
+ Arg args[20];
3096
+ int n;
3097
+ XmString s1, s2, s3;
3098
+ GString *dir;
3099
+
3100
+ n = 0;
3101
+ s1 = XmStringCreateLocalized("Save");
3102
+ XtSetArg(args[n], XmNokLabelString, s1); ++n;
3103
+ s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]");
3104
+ XtSetArg(args[n], XmNpattern, s2); ++n;
3105
+ s3 = XmStringCreateLocalized(xpdfAppName ": Save as");
3106
+ XtSetArg(args[n], XmNdialogTitle, s3); ++n;
3107
+ XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
3108
+ XtSetArg(args[n], XmNautoUnmanage, True); ++n;
3109
+ saveAsDialog = XmCreateFileSelectionDialog(win, "saveAsDialog", args, n);
3110
+ XmStringFree(s1);
3111
+ XmStringFree(s2);
3112
+ XmStringFree(s3);
3113
+ XtUnmanageChild(XmFileSelectionBoxGetChild(saveAsDialog,
3114
+ XmDIALOG_HELP_BUTTON));
3115
+ XtAddCallback(saveAsDialog, XmNokCallback,
3116
+ &saveAsOkCbk, (XtPointer)this);
3117
+
3118
+ if (core->getDoc() && core->getDoc()->getFileName()) {
3119
+ dir = makePathAbsolute(grabPath(
3120
+ core->getDoc()->getFileName()->getCString()));
3121
+ s1 = XmStringCreateLocalized(dir->getCString());
3122
+ XtVaSetValues(saveAsDialog, XmNdirectory, s1, NULL);
3123
+ XmStringFree(s1);
3124
+ delete dir;
3125
+ }
3126
+ }
3127
+
3128
+ void XPDFViewer::mapSaveAsDialog() {
3129
+ if (!saveAsDialog) {
3130
+ initSaveAsDialog();
3131
+ }
3132
+ XmFileSelectionDoSearch(saveAsDialog, NULL);
3133
+ XtManageChild(saveAsDialog);
3134
+ }
3135
+
3136
+ void XPDFViewer::saveAsOkCbk(Widget widget, XtPointer ptr,
3137
+ XtPointer callData) {
3138
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3139
+ XmFileSelectionBoxCallbackStruct *data =
3140
+ (XmFileSelectionBoxCallbackStruct *)callData;
3141
+ char *fileName;
3142
+ GString *fileNameStr;
3143
+ XmStringContext context;
3144
+ XmStringCharSet charSet;
3145
+ XmStringDirection dir;
3146
+ Boolean sep;
3147
+
3148
+ XmStringInitContext(&context, data->value);
3149
+ if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) {
3150
+ fileNameStr = new GString(fileName);
3151
+ viewer->core->getDoc()->saveAs(fileNameStr);
3152
+ delete fileNameStr;
3153
+ XtFree(charSet);
3154
+ XtFree(fileName);
3155
+ }
3156
+ XmStringFreeContext(context);
3157
+ }
3158
+
3159
+ //------------------------------------------------------------------------
3160
+ // GUI code: "print" dialog
3161
+ //------------------------------------------------------------------------
3162
+
3163
+ void XPDFViewer::initPrintDialog() {
3164
+ Widget sep1, sep2, row, label1, label2, okBtn, cancelBtn;
3165
+ Arg args[20];
3166
+ int n;
3167
+ XmString s;
3168
+ GString *psFileName;
3169
+
3170
+ //----- dialog
3171
+ n = 0;
3172
+ s = XmStringCreateLocalized(xpdfAppName ": Print");
3173
+ XtSetArg(args[n], XmNdialogTitle, s); ++n;
3174
+ XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
3175
+ printDialog = XmCreateFormDialog(win, "printDialog", args, n);
3176
+ XmStringFree(s);
3177
+
3178
+ //----- "print with command"
3179
+ n = 0;
3180
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
3181
+ XtSetArg(args[n], XmNtopOffset, 4); ++n;
3182
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3183
+ XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
3184
+ XtSetArg(args[n], XmNset, XmSET); ++n;
3185
+ s = XmStringCreateLocalized("Print with command:");
3186
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3187
+ printWithCmdBtn = XmCreateToggleButton(printDialog, "printWithCmd", args, n);
3188
+ XmStringFree(s);
3189
+ XtManageChild(printWithCmdBtn);
3190
+ XtAddCallback(printWithCmdBtn, XmNvalueChangedCallback,
3191
+ &printWithCmdBtnCbk, (XtPointer)this);
3192
+ n = 0;
3193
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3194
+ XtSetArg(args[n], XmNtopWidget, printWithCmdBtn); ++n;
3195
+ XtSetArg(args[n], XmNtopOffset, 2); ++n;
3196
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3197
+ XtSetArg(args[n], XmNleftOffset, 16); ++n;
3198
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3199
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
3200
+ XtSetArg(args[n], XmNcolumns, 40); ++n;
3201
+ printCmdText = XmCreateTextField(printDialog, "printCmd", args, n);
3202
+ XtManageChild(printCmdText);
3203
+
3204
+ //----- "print to file"
3205
+ n = 0;
3206
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3207
+ XtSetArg(args[n], XmNtopWidget, printCmdText); ++n;
3208
+ XtSetArg(args[n], XmNtopOffset, 4); ++n;
3209
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3210
+ XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
3211
+ XtSetArg(args[n], XmNset, XmUNSET); ++n;
3212
+ s = XmStringCreateLocalized("Print to file:");
3213
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3214
+ printToFileBtn = XmCreateToggleButton(printDialog, "printToFile", args, n);
3215
+ XmStringFree(s);
3216
+ XtManageChild(printToFileBtn);
3217
+ XtAddCallback(printToFileBtn, XmNvalueChangedCallback,
3218
+ &printToFileBtnCbk, (XtPointer)this);
3219
+ n = 0;
3220
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3221
+ XtSetArg(args[n], XmNtopWidget, printToFileBtn); ++n;
3222
+ XtSetArg(args[n], XmNtopOffset, 2); ++n;
3223
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3224
+ XtSetArg(args[n], XmNleftOffset, 16); ++n;
3225
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3226
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
3227
+ XtSetArg(args[n], XmNcolumns, 40); ++n;
3228
+ XtSetArg(args[n], XmNsensitive, False); ++n;
3229
+ printFileText = XmCreateTextField(printDialog, "printFile", args, n);
3230
+ XtManageChild(printFileText);
3231
+
3232
+ //----- separator
3233
+ n = 0;
3234
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3235
+ XtSetArg(args[n], XmNtopWidget, printFileText); ++n;
3236
+ XtSetArg(args[n], XmNtopOffset, 8); ++n;
3237
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3238
+ XtSetArg(args[n], XmNleftOffset, 8); ++n;
3239
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3240
+ XtSetArg(args[n], XmNrightOffset, 8); ++n;
3241
+ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
3242
+ sep1 = XmCreateSeparator(printDialog, "sep1", args, n);
3243
+ XtManageChild(sep1);
3244
+
3245
+ //----- page range
3246
+ n = 0;
3247
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3248
+ XtSetArg(args[n], XmNtopWidget, sep1); ++n;
3249
+ XtSetArg(args[n], XmNtopOffset, 8); ++n;
3250
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3251
+ XtSetArg(args[n], XmNleftOffset, 4); ++n;
3252
+ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
3253
+ XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n;
3254
+ row = XmCreateRowColumn(printDialog, "row", args, n);
3255
+ XtManageChild(row);
3256
+ n = 0;
3257
+ s = XmStringCreateLocalized("Pages:");
3258
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3259
+ label1 = XmCreateLabel(row, "label1", args, n);
3260
+ XmStringFree(s);
3261
+ XtManageChild(label1);
3262
+ n = 0;
3263
+ XtSetArg(args[n], XmNcolumns, 5); ++n;
3264
+ printFirstPage = XmCreateTextField(row, "printFirstPage", args, n);
3265
+ XtManageChild(printFirstPage);
3266
+ n = 0;
3267
+ s = XmStringCreateLocalized("to");
3268
+ XtSetArg(args[n], XmNlabelString, s); ++n;
3269
+ label2 = XmCreateLabel(row, "label2", args, n);
3270
+ XmStringFree(s);
3271
+ XtManageChild(label2);
3272
+ n = 0;
3273
+ XtSetArg(args[n], XmNcolumns, 5); ++n;
3274
+ printLastPage = XmCreateTextField(row, "printLastPage", args, n);
3275
+ XtManageChild(printLastPage);
3276
+
3277
+ //----- separator
3278
+ n = 0;
3279
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3280
+ XtSetArg(args[n], XmNtopWidget, row); ++n;
3281
+ XtSetArg(args[n], XmNtopOffset, 8); ++n;
3282
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3283
+ XtSetArg(args[n], XmNleftOffset, 8); ++n;
3284
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3285
+ XtSetArg(args[n], XmNrightOffset, 8); ++n;
3286
+ XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
3287
+ sep2 = XmCreateSeparator(printDialog, "sep2", args, n);
3288
+ XtManageChild(sep2);
3289
+
3290
+ //----- "print" and "cancel" buttons
3291
+ n = 0;
3292
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3293
+ XtSetArg(args[n], XmNtopWidget, sep2); ++n;
3294
+ XtSetArg(args[n], XmNtopOffset, 8); ++n;
3295
+ XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
3296
+ XtSetArg(args[n], XmNleftOffset, 4); ++n;
3297
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
3298
+ XtSetArg(args[n], XmNbottomOffset, 4); ++n;
3299
+ okBtn = XmCreatePushButton(printDialog, "Print", args, n);
3300
+ XtManageChild(okBtn);
3301
+ XtAddCallback(okBtn, XmNactivateCallback,
3302
+ &printPrintCbk, (XtPointer)this);
3303
+ n = 0;
3304
+ XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
3305
+ XtSetArg(args[n], XmNtopWidget, sep2); ++n;
3306
+ XtSetArg(args[n], XmNtopOffset, 8); ++n;
3307
+ XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
3308
+ XtSetArg(args[n], XmNrightOffset, 4); ++n;
3309
+ XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
3310
+ XtSetArg(args[n], XmNbottomOffset, 4); ++n;
3311
+ cancelBtn = XmCreatePushButton(printDialog, "Cancel", args, n);
3312
+ XtManageChild(cancelBtn);
3313
+ n = 0;
3314
+ XtSetArg(args[n], XmNdefaultButton, okBtn); ++n;
3315
+ XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n;
3316
+ XtSetValues(printDialog, args, n);
3317
+
3318
+ //----- initial values
3319
+ if ((psFileName = globalParams->getPSFile())) {
3320
+ if (psFileName->getChar(0) == '|') {
3321
+ XmTextFieldSetString(printCmdText,
3322
+ psFileName->getCString() + 1);
3323
+ } else {
3324
+ XmTextFieldSetString(printFileText, psFileName->getCString());
3325
+ }
3326
+ delete psFileName;
3327
+ }
3328
+ }
3329
+
3330
+ void XPDFViewer::setupPrintDialog() {
3331
+ PDFDoc *doc;
3332
+ char buf[20];
3333
+ GString *pdfFileName, *psFileName, *psFileName2;
3334
+ char *p;
3335
+
3336
+ doc = core->getDoc();
3337
+ psFileName = globalParams->getPSFile();
3338
+ if (!psFileName || psFileName->getChar(0) == '|') {
3339
+ pdfFileName = doc->getFileName();
3340
+ p = pdfFileName->getCString() + pdfFileName->getLength() - 4;
3341
+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
3342
+ psFileName2 = new GString(pdfFileName->getCString(),
3343
+ pdfFileName->getLength() - 4);
3344
+ } else {
3345
+ psFileName2 = pdfFileName->copy();
3346
+ }
3347
+ psFileName2->append(".ps");
3348
+ XmTextFieldSetString(printFileText, psFileName2->getCString());
3349
+ delete psFileName2;
3350
+ }
3351
+ if (psFileName && psFileName->getChar(0) == '|') {
3352
+ XmToggleButtonSetState(printWithCmdBtn, True, False);
3353
+ XmToggleButtonSetState(printToFileBtn, False, False);
3354
+ XtVaSetValues(printCmdText, XmNsensitive, True, NULL);
3355
+ XtVaSetValues(printFileText, XmNsensitive, False, NULL);
3356
+ } else {
3357
+ XmToggleButtonSetState(printWithCmdBtn, False, False);
3358
+ XmToggleButtonSetState(printToFileBtn, True, False);
3359
+ XtVaSetValues(printCmdText, XmNsensitive, False, NULL);
3360
+ XtVaSetValues(printFileText, XmNsensitive, True, NULL);
3361
+ }
3362
+ if (psFileName) {
3363
+ delete psFileName;
3364
+ }
3365
+
3366
+ sprintf(buf, "%d", doc->getNumPages());
3367
+ XmTextFieldSetString(printFirstPage, "1");
3368
+ XmTextFieldSetString(printLastPage, buf);
3369
+ }
3370
+
3371
+ void XPDFViewer::printWithCmdBtnCbk(Widget widget, XtPointer ptr,
3372
+ XtPointer callData) {
3373
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3374
+ XmToggleButtonCallbackStruct *data =
3375
+ (XmToggleButtonCallbackStruct *)callData;
3376
+
3377
+ if (data->set != XmSET) {
3378
+ XmToggleButtonSetState(viewer->printWithCmdBtn, True, False);
3379
+ }
3380
+ XmToggleButtonSetState(viewer->printToFileBtn, False, False);
3381
+ XtVaSetValues(viewer->printCmdText, XmNsensitive, True, NULL);
3382
+ XtVaSetValues(viewer->printFileText, XmNsensitive, False, NULL);
3383
+ }
3384
+
3385
+ void XPDFViewer::printToFileBtnCbk(Widget widget, XtPointer ptr,
3386
+ XtPointer callData) {
3387
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3388
+ XmToggleButtonCallbackStruct *data =
3389
+ (XmToggleButtonCallbackStruct *)callData;
3390
+
3391
+ if (data->set != XmSET) {
3392
+ XmToggleButtonSetState(viewer->printToFileBtn, True, False);
3393
+ }
3394
+ XmToggleButtonSetState(viewer->printWithCmdBtn, False, False);
3395
+ XtVaSetValues(viewer->printFileText, XmNsensitive, True, NULL);
3396
+ XtVaSetValues(viewer->printCmdText, XmNsensitive, False, NULL);
3397
+ }
3398
+
3399
+ void XPDFViewer::printPrintCbk(Widget widget, XtPointer ptr,
3400
+ XtPointer callData) {
3401
+ XPDFViewer *viewer = (XPDFViewer *)ptr;
3402
+ unsigned char withCmd;
3403
+ GString *psFileName;
3404
+ int firstPage, lastPage;
3405
+ PDFDoc *doc;
3406
+ PSOutputDev *psOut;
3407
+
3408
+ doc = viewer->core->getDoc();
3409
+ if (!doc->okToPrint()) {
3410
+ error(-1, "Printing this document is not allowed.");
3411
+ return;
3412
+ }
3413
+
3414
+ viewer->core->setBusyCursor(gTrue);
3415
+
3416
+ XtVaGetValues(viewer->printWithCmdBtn, XmNset, &withCmd, NULL);
3417
+ if (withCmd) {
3418
+ psFileName = new GString(XmTextFieldGetString(viewer->printCmdText));
3419
+ psFileName->insert(0, '|');
3420
+ } else {
3421
+ psFileName = new GString(XmTextFieldGetString(viewer->printFileText));
3422
+ }
3423
+
3424
+ firstPage = atoi(XmTextFieldGetString(viewer->printFirstPage));
3425
+ lastPage = atoi(XmTextFieldGetString(viewer->printLastPage));
3426
+ if (firstPage < 1) {
3427
+ firstPage = 1;
3428
+ } else if (firstPage > doc->getNumPages()) {
3429
+ firstPage = doc->getNumPages();
3430
+ }
3431
+ if (lastPage < firstPage) {
3432
+ lastPage = firstPage;
3433
+ } else if (lastPage > doc->getNumPages()) {
3434
+ lastPage = doc->getNumPages();
3435
+ }
3436
+
3437
+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
3438
+ doc->getCatalog(), firstPage, lastPage,
3439
+ psModePS);
3440
+ if (psOut->isOk()) {
3441
+ doc->displayPages(psOut, firstPage, lastPage, 72, 72,
3442
+ 0, gTrue, globalParams->getPSCrop(), gTrue);
3443
+ }
3444
+ delete psOut;
3445
+ delete psFileName;
3446
+
3447
+ viewer->core->setBusyCursor(gFalse);
3448
+ }
3449
+
3450
+ //------------------------------------------------------------------------
3451
+ // Motif support
3452
+ //------------------------------------------------------------------------
3453
+
3454
+ XmFontList XPDFViewer::createFontList(char *xlfd) {
3455
+ XmFontList fontList;
3456
+
3457
+ #if XmVersion <= 1001
3458
+
3459
+ XFontStruct *font;
3460
+ String params;
3461
+ Cardinal nParams;
3462
+
3463
+ font = XLoadQueryFont(display, xlfd);
3464
+ if (font) {
3465
+ fontList = XmFontListCreate(font, XmSTRING_DEFAULT_CHARSET);
3466
+ } else {
3467
+ params = (String)xlfd;
3468
+ nParams = 1;
3469
+ XtAppWarningMsg(app->getAppContext(),
3470
+ "noSuchFont", "CvtStringToXmFontList",
3471
+ "XtToolkitError", "No such font: %s",
3472
+ &params, &nParams);
3473
+ fontList = NULL;
3474
+ }
3475
+
3476
+ #else
3477
+
3478
+ XmFontListEntry entry;
3479
+
3480
+ entry = XmFontListEntryLoad(display, xlfd,
3481
+ XmFONT_IS_FONT, XmFONTLIST_DEFAULT_TAG);
3482
+ fontList = XmFontListAppendEntry(NULL, entry);
3483
+ XmFontListEntryFree(&entry);
3484
+
3485
+ #endif
3486
+
3487
+ return fontList;
3488
+ }