define [ "base" ], (App) -> # App = angular.module 'pdfPage', ['pdfHighlights'] App.directive 'pdfPage', ['$timeout', 'pdfHighlights', 'pdfSpinner', ($timeout, pdfHighlights, pdfSpinner) -> { require: '^pdfViewer', template: ''' <div class="plv-page-view page-view"> <div class="pdf-canvas pdfng-empty"></div> <div class="plv-text-layer text-layer"></div> <div class="plv-annotations-layer annotations-layer"></div> <div class="plv-highlights-layer highlights-layer"></div> </div> ''' link: (scope, element, attrs, ctrl) -> canvasElement = $(element).find('.pdf-canvas') textElement = $(element).find('.text-layer') annotationsElement = $(element).find('.annotations-layer') highlightsElement = $(element).find('.highlights-layer') updatePageSize = (size) -> h = Math.floor(size[0]) w = Math.floor(size[1]) element.height(h) element.width(w) canvasElement.height(h) canvasElement.width(w) scope.page.sized = true # keep track of our page element, so we can access it in the # parent with scope.pages[i].element, and the contained # elements for each part scope.page.element = element scope.page.elementChildren = { canvas: canvasElement, text: textElement annotations: annotationsElement highlights: highlightsElement container: element } if !scope.page.sized if scope.defaultPageSize? updatePageSize scope.defaultPageSize else # shouldn't get here - the default page size should now # always be set before redraw is called handler = scope.$watch 'defaultPageSize', (defaultPageSize) -> return unless defaultPageSize? updatePageSize defaultPageSize handler() if scope.page.current # console.log 'we must scroll to this page', scope.page.pageNum, 'at position', scope.page.position # this is the current page, we want to scroll it into view # and render it immediately scope.document.renderPage scope.page ctrl.setPdfPosition(scope.page, scope.page.position) element.on 'dblclick', (e) -> offset = $(element).find('.pdf-canvas').offset() dx = e.pageX - offset.left dy = e.pageY - offset.top scope.document.getPdfViewport(scope.page.pageNum).then (viewport) -> pdfPoint = viewport.convertToPdfPoint(dx, dy); event = { page: scope.page.pageNum x: pdfPoint[0], y: viewport.viewBox[3] - pdfPoint[1] } scope.$emit 'pdfDoubleClick', event highlightsLayer = new pdfHighlights({ highlights: highlightsElement }) scope.$on 'pdf:highlights', (event, highlights) -> return unless highlights? return unless highlights.length > 0 if scope.timeoutHandler $timeout.cancel(scope.timeoutHandler) highlightsLayer.clearHighlights() scope.timeoutHandler = null # console.log 'got highlight watch in pdfPage', scope.page pageHighlights = (h for h in highlights when h.page == scope.page.pageNum) return unless pageHighlights.length scope.document.getPdfViewport(scope.page.pageNum).then (viewport) -> for hl in pageHighlights # console.log 'adding highlight', h, viewport top = viewport.viewBox[3] - hl.v highlightsLayer.addHighlight viewport, hl.h, top, hl.width, hl.height scope.timeoutHandler = $timeout () -> highlightsLayer.clearHighlights() scope.timeoutHandler = null , 1000 scope.$on "$destroy", () -> if scope.timeoutHandler? $timeout.cancel(scope.timeoutHandler) highlightsLayer.clearHighlights() } ]