2014-11-25 11:00:21 -05:00
|
|
|
define [
|
|
|
|
"base"
|
|
|
|
"ide/pdfng/directives/pdfTextLayer"
|
|
|
|
"ide/pdfng/directives/pdfAnnotations"
|
|
|
|
"ide/pdfng/directives/pdfHighlights"
|
2014-11-26 11:18:39 -05:00
|
|
|
"ide/pdfng/directives/pdfRenderer"
|
|
|
|
"ide/pdfng/directives/pdfPage"
|
|
|
|
"ide/pdfng/directives/pdfViewer"
|
2014-11-25 11:00:21 -05:00
|
|
|
"libs/pdf"
|
|
|
|
"text!libs/pdfListView/TextLayer.css"
|
|
|
|
"text!libs/pdfListView/AnnotationsLayer.css"
|
|
|
|
"text!libs/pdfListView/HighlightsLayer.css"
|
|
|
|
], (
|
|
|
|
App
|
2014-11-26 11:18:39 -05:00
|
|
|
pdfViewer
|
2014-11-25 11:00:21 -05:00
|
|
|
pdfPage
|
|
|
|
pdfRenderer
|
|
|
|
pdfTextLayer
|
|
|
|
pdfAnnotations
|
|
|
|
pdfHighlights
|
|
|
|
pdf
|
|
|
|
textLayerCss
|
|
|
|
annotationsLayerCss
|
|
|
|
highlightsLayerCss
|
|
|
|
) ->
|
|
|
|
if PDFJS?
|
|
|
|
PDFJS.workerSrc = window.pdfJsWorkerPath
|
|
|
|
PDFJS.disableAutoFetch = true
|
|
|
|
|
|
|
|
style = $("<style/>")
|
|
|
|
style.text(textLayerCss + "\n" + annotationsLayerCss + "\n" + highlightsLayerCss)
|
|
|
|
$("body").append(style)
|
|
|
|
|
|
|
|
App.directive "pdfjs", ["$timeout", ($timeout) ->
|
|
|
|
return {
|
|
|
|
scope: {
|
|
|
|
"pdfSrc": "="
|
|
|
|
"highlights": "="
|
|
|
|
"position": "="
|
|
|
|
"dblClickCallback": "="
|
|
|
|
}
|
|
|
|
link: (scope, element, attrs) ->
|
|
|
|
# pdfListView = new PDFListView element.find(".pdfjs-viewer")[0],
|
|
|
|
# textLayerBuilder: TextLayerBuilder
|
|
|
|
# annotationsLayerBuilder: AnnotationsLayerBuilder
|
|
|
|
# highlightsLayerBuilder: HighlightsLayerBuilder
|
|
|
|
# ondblclick: (e) -> onDoubleClick(e)
|
|
|
|
# # logLevel: PDFListView.Logger.DEBUG
|
|
|
|
# pdfListView.listView.pageWidthOffset = 20
|
|
|
|
# pdfListView.listView.pageHeightOffset = 20
|
|
|
|
|
|
|
|
scope.loading = false
|
|
|
|
scope.scale = {}
|
|
|
|
initializedPosition = false
|
|
|
|
initializePosition = () ->
|
|
|
|
return if initializedPosition
|
|
|
|
initializedPosition = true
|
|
|
|
|
|
|
|
if (scale = $.localStorage("pdf.scale"))?
|
2014-11-26 11:18:59 -05:00
|
|
|
scope.scale = { scaleMode: scale.scaleMode, scale: +scale.scale}
|
2014-11-25 11:00:21 -05:00
|
|
|
else
|
|
|
|
scope.scale = { scaleMode: 'scale_mode_fit_width' }
|
|
|
|
|
|
|
|
if (position = $.localStorage("pdf.position.#{attrs.key}"))
|
2014-11-26 11:18:59 -05:00
|
|
|
scope.position = { page: +position.page, offset: { "top": +position.offset.top, "left": +position.offset.left } }
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
#scope.position = pdfListView.getPdfPosition(true)
|
|
|
|
|
|
|
|
$(window).unload () =>
|
2014-11-26 11:18:59 -05:00
|
|
|
$.localStorage "pdf.scale", scope.scale
|
|
|
|
$.localStorage "pdf.position.#{attrs.key}", scope.position
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
flashControls = () ->
|
|
|
|
scope.flashControls = true
|
|
|
|
$timeout () ->
|
|
|
|
scope.flashControls = false
|
|
|
|
, 1000
|
|
|
|
|
2014-11-26 11:18:59 -05:00
|
|
|
# element.find(".pdfjs-viewer").scroll () ->
|
2014-11-25 11:00:21 -05:00
|
|
|
# scope.position = pdfListView.getPdfPosition(true)
|
|
|
|
|
|
|
|
onDoubleClick = (e) ->
|
|
|
|
scope.dblClickCallback?(page: e.page, offset: { top: e.y, left: e.x })
|
|
|
|
|
|
|
|
scope.$watch "pdfSrc", (url) ->
|
|
|
|
if url
|
|
|
|
scope.loading = true
|
|
|
|
scope.progress = 0
|
|
|
|
console.log 'pdfSrc =', url
|
|
|
|
initializePosition()
|
|
|
|
flashControls()
|
|
|
|
scope.$broadcast 'layout-ready'
|
|
|
|
# pdfListView
|
|
|
|
# .loadPdf(url, onProgress)
|
|
|
|
# .then () ->
|
|
|
|
# scope.$apply () ->
|
|
|
|
# scope.loading = false
|
|
|
|
# delete scope.progress
|
|
|
|
# initializePosition()
|
|
|
|
# flashControls()
|
|
|
|
|
|
|
|
scope.$watch "highlights", (areas) ->
|
|
|
|
return if !areas?
|
|
|
|
highlights = for area in areas or []
|
|
|
|
{
|
|
|
|
page: area.page - 1
|
|
|
|
highlight:
|
|
|
|
left: area.h
|
|
|
|
top: area.v
|
|
|
|
height: area.height
|
|
|
|
width: area.width
|
|
|
|
}
|
|
|
|
|
|
|
|
if highlights.length > 0
|
|
|
|
first = highlights[0]
|
|
|
|
# pdfListView.setPdfPosition({
|
|
|
|
# page: first.page
|
|
|
|
# offset:
|
|
|
|
# left: first.highlight.left
|
|
|
|
# top: first.highlight.top - 80
|
|
|
|
# }, true)
|
|
|
|
|
|
|
|
# pdfListView.clearHighlights()
|
|
|
|
# pdfListView.setHighlights(highlights, true)
|
|
|
|
|
|
|
|
# setTimeout () =>
|
|
|
|
# pdfListView.clearHighlights()
|
|
|
|
# , 1000
|
|
|
|
|
|
|
|
scope.fitToHeight = () ->
|
2014-11-26 11:52:54 -05:00
|
|
|
scale = angular.copy (scope.scale)
|
|
|
|
scale.scaleMode = 'scale_mode_fit_height'
|
|
|
|
scope.scale = scale
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
scope.fitToWidth = () ->
|
2014-11-26 11:52:54 -05:00
|
|
|
scale = angular.copy (scope.scale)
|
|
|
|
scale.scaleMode = 'scale_mode_fit_width'
|
|
|
|
scope.scale = scale
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
scope.zoomIn = () ->
|
2014-11-26 11:52:54 -05:00
|
|
|
scale = angular.copy (scope.scale)
|
|
|
|
scale.scaleMode = 'scale_mode_value'
|
|
|
|
scale.scale = scale.scale * 1.2
|
|
|
|
scope.scale = scale
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
scope.zoomOut = () ->
|
2014-11-26 11:52:54 -05:00
|
|
|
scale = angular.copy (scope.scale)
|
|
|
|
scale.scaleMode = 'scale_mode_value'
|
|
|
|
scale.scale = scale.scale / 1.2
|
|
|
|
scope.scale = scale
|
2014-11-25 11:00:21 -05:00
|
|
|
|
|
|
|
if attrs.resizeOn?
|
|
|
|
for event in attrs.resizeOn.split(",")
|
|
|
|
scope.$on event, (e) ->
|
|
|
|
console.log 'got a resize event', event, e
|
|
|
|
|
|
|
|
template: """
|
|
|
|
<div data-pdf-viewer class="pdfjs-viewer" pdf-src='pdfSrc' position='position' scale='scale'></div>
|
|
|
|
<div class="pdfjs-controls" ng-class="{'flash': flashControls }">
|
|
|
|
<div class="btn-group">
|
|
|
|
<a href
|
|
|
|
class="btn btn-info btn-lg"
|
|
|
|
ng-click="fitToWidth()"
|
|
|
|
tooltip="Fit to Width"
|
|
|
|
tooltip-append-to-body="true"
|
|
|
|
tooltip-placement="bottom"
|
|
|
|
>
|
|
|
|
<i class="fa fa-fw fa-arrows-h"></i>
|
|
|
|
</a>
|
|
|
|
<a href
|
|
|
|
class="btn btn-info btn-lg"
|
|
|
|
ng-click="fitToHeight()"
|
|
|
|
tooltip="Fit to Height"
|
|
|
|
tooltip-append-to-body="true"
|
|
|
|
tooltip-placement="bottom"
|
|
|
|
>
|
|
|
|
<i class="fa fa-fw fa-arrows-v"></i>
|
|
|
|
</a>
|
|
|
|
<a href
|
|
|
|
class="btn btn-info btn-lg"
|
|
|
|
ng-click="zoomIn()"
|
|
|
|
tooltip="Zoom In"
|
|
|
|
tooltip-append-to-body="true"
|
|
|
|
tooltip-placement="bottom"
|
|
|
|
>
|
|
|
|
<i class="fa fa-fw fa-search-plus"></i>
|
|
|
|
</a>
|
|
|
|
<a href
|
|
|
|
class="btn btn-info btn-lg"
|
|
|
|
ng-click="zoomOut()"
|
|
|
|
tooltip="Zoom Out"
|
|
|
|
tooltip-append-to-body="true"
|
|
|
|
tooltip-placement="bottom"
|
|
|
|
>
|
|
|
|
<i class="fa fa-fw fa-search-minus"></i>
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
"""
|
|
|
|
}
|
|
|
|
]
|