PDFjsView.coffee 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. define [
  2. "libs/pdfListView/PdfListView"
  3. "libs/pdfListView/TextLayerBuilder"
  4. "libs/pdfListView/AnnotationsLayerBuilder"
  5. "libs/pdfListView/HighlightsLayerBuilder"
  6. "text!libs/pdfListView/TextLayer.css"
  7. "text!libs/pdfListView/AnnotationsLayer.css"
  8. "text!libs/pdfListView/HighlightsLayer.css"
  9. "libs/backbone"
  10. "libs/jquery.storage"
  11. ], (PDFListView, TextLayerBuilder, AnnotationsLayerBuilder, HighlightsLayerBuilder, textLayerCss, annotationsLayerCss, highlightsLayerCss) ->
  12. if PDFJS?
  13. PDFJS.workerSrc = "#{window.sharelatex.pdfJsWorkerPath}"
  14. style = $("<style/>")
  15. style.text(textLayerCss + "\n" + annotationsLayerCss + "\n" + highlightsLayerCss)
  16. $("body").append(style)
  17. PDFjsView = Backbone.View.extend
  18. template: $("#pdfjsViewerTemplate").html()
  19. events:
  20. "mousemove" : "onMousemove"
  21. "mouseout" : "onMouseout"
  22. "click .js-fit-height" : "fitToHeight"
  23. "click .js-fit-width" : "fitToWidth"
  24. "click .js-zoom-out" : "zoomOut"
  25. "click .js-zoom-in" : "zoomIn"
  26. initialize: () ->
  27. @ide = @options.manager.ide
  28. render: () ->
  29. @setElement $(@template)
  30. @pdfListView = new PDFListView @$(".pdfjs-list-view")[0],
  31. textLayerBuilder: TextLayerBuilder
  32. annotationsLayerBuilder: AnnotationsLayerBuilder
  33. highlightsLayerBuilder: HighlightsLayerBuilder
  34. ondblclick: (e) =>
  35. @trigger "dblclick", e
  36. #logLevel: PDFListView.Logger.DEBUG
  37. @pdfListView.listView.pageWidthOffset = 20
  38. @pdfListView.listView.pageHeightOffset = 20
  39. @toolbar = @$(".btn-group")
  40. @toolbar.hide()
  41. @progress_bar = @$(".progress")
  42. @hideProgressBar()
  43. return @
  44. show: () ->
  45. @$el.show()
  46. @pdfListView.onResize()
  47. hide: () -> @$el.hide()
  48. setPdf: (url) ->
  49. @setProgressBarTo(0)
  50. onProgress = (progress) =>
  51. @setProgressBarTo(progress.loaded/progress.total)
  52. @pdfListView
  53. .loadPdf(url, onProgress)
  54. .then () =>
  55. @hideProgressBar()
  56. if !@setInitialPosition
  57. @_initInitialPosition()
  58. @setInitialPosition = true
  59. @flashToolbar()
  60. unsetPdf: () -> @hide()
  61. _initInitialPosition: () ->
  62. if (scale = $.localStorage("pdf.scale"))?
  63. @pdfListView.setScaleMode(scale.scaleMode, scale.scale)
  64. else
  65. @pdfListView.setToFitWidth()
  66. if (position = $.localStorage("pdf.position.#{@ide.project.get("id")}"))
  67. @pdfListView.setPdfPosition(position)
  68. $(window).unload () =>
  69. $.localStorage "pdf.scale", {
  70. scaleMode: @pdfListView.getScaleMode()
  71. scale: @pdfListView.getScale()
  72. }
  73. $.localStorage "pdf.position.#{@ide.project.get("id")}", @pdfListView.getPdfPosition()
  74. setProgressBarTo: (value) ->
  75. @progress_bar.show()
  76. @progress_bar.find(".bar").css width: "#{value * 100}%"
  77. hideProgressBar: () ->
  78. @progress_bar.hide()
  79. fitToHeight: () ->
  80. @pdfListView.setToFitHeight()
  81. fitToWidth: () ->
  82. @pdfListView.setToFitWidth()
  83. zoomIn: () ->
  84. scale = @pdfListView.getScale()
  85. @pdfListView.setScale(scale * 1.2)
  86. zoomOut: () ->
  87. scale = @pdfListView.getScale()
  88. @pdfListView.setScale(scale / 1.2)
  89. flashToolbar: () ->
  90. @toolbar.show()
  91. setTimeout =>
  92. @toolbar.fadeOut "slow"
  93. , 1000
  94. onMousemove: (e) ->
  95. viewerOffset = @$el.offset()
  96. offsetY = e.pageY - viewerOffset.top
  97. offsetX = e.pageX - viewerOffset.left
  98. if offsetY < 70 and offsetX < 250
  99. @toolbar.show()
  100. else
  101. @toolbar.fadeOut "slow"
  102. onMouseout: (e) ->
  103. @toolbar.hide()
  104. onResize: () ->
  105. @pdfListView.onResize()
  106. highlightInPdf: (areas) ->
  107. highlights = for area in (areas or [])
  108. {
  109. page: area.page - 1
  110. highlight:
  111. left: area.h
  112. top: area.v
  113. height: area.height
  114. width: area.width
  115. }
  116. if highlights.length > 0
  117. first = highlights[0]
  118. @pdfListView.setPdfPosition({
  119. page: first.page
  120. offset:
  121. left: first.highlight.left
  122. top: first.highlight.top - 80
  123. }, true)
  124. @pdfListView.clearHighlights()
  125. @pdfListView.setHighlights(highlights, true)
  126. setTimeout () =>
  127. @$(".pdfjs-list-view .plv-highlights-layer > div").fadeOut "slow", () =>
  128. @pdfListView.clearHighlights()
  129. , 1000
  130. getPdfPosition: () ->
  131. position = @pdfListView.getPdfPosition(true)
  132. return if !position?
  133. return {
  134. page: position.page
  135. x: position.offset.left
  136. y: position.offset.top
  137. }