CompiledView.coffee 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. define [
  2. "pdf/PDFjsView"
  3. "pdf/NativePdfView"
  4. "libs/backbone"
  5. "libs/mustache"
  6. "libs/bootstrap"
  7. "libs/jquery.storage"
  8. ], (PdfjsView, NativePdfView) ->
  9. LatexErrorView = Backbone.View.extend
  10. constructor: (@ide, @error) ->
  11. template: $('#compileLogEntryTemplate').html()
  12. events:
  13. "click": "onClick"
  14. render: () ->
  15. if @error.level == "error"
  16. @error.type = "error"
  17. @error.title = "Error in #{@error.file}"
  18. else if @error.level == "warning"
  19. @error.type = "warning"
  20. @error.title = "Warning in #{@error.file}"
  21. else
  22. @error.type = "info"
  23. @error.title = "Typesetting problem in #{@error.file}"
  24. if @error.line?
  25. @error.title += " (line #{@error.line})"
  26. @setElement($(Mustache.to_html(@template, @error)))
  27. onClick: (event) ->
  28. @ide.fileTreeManager.openDocByPath(@error.file, @error.line)
  29. PdfView = Backbone.View.extend
  30. templates:
  31. pdfPanel: $("#pdfPanelTemplate").html()
  32. compileSuccess: $('#compileSuccessTemplate').html()
  33. compileFailed: $('#compileFailedTemplate').html()
  34. compileError: $('#compileErrorTemplate').html()
  35. outputFileLink: $('#outputFileLinkTemplate').html()
  36. events:
  37. "click #recompilePdf": -> @recompilePdf()
  38. "click #showLog": -> @showLog()
  39. "click #showRawLog": -> @showRawLog()
  40. "click #showPdf": -> @showPdf()
  41. "click #downloadPdf": -> @options.manager.downloadPdf()
  42. "click #flatViewButton": () ->
  43. $.localStorage("layout.pdf", "flat")
  44. @options.manager.switchToFlatView(showPdf: true)
  45. "click #splitViewButton": ->
  46. $.localStorage("layout.pdf", "split")
  47. @options.manager.switchToSplitView()
  48. "click .delete-cached-files > a": -> @options.manager.deleteCachedFiles()
  49. initialize: (@options) ->
  50. @ide = @options.ide
  51. @ide.layoutManager.on "resize", => @resize()
  52. @ide.editor.on "resize", => @resize()
  53. if @ide.userSettings.pdfViewer == "native"
  54. PdfView = NativePdfView
  55. @pdfjs = false
  56. else
  57. PdfView = PdfjsView
  58. @pdfjs = true
  59. @pdfView = new PdfView(manager: @)
  60. @pdfView.on "dblclick", (e) => @trigger "dblclick", e
  61. render: () ->
  62. @setElement(@templates.pdfPanel)
  63. @$("#pdfAreaContent").append @pdfView.render().$el
  64. @showBeforeCompile()
  65. return this
  66. resize: () ->
  67. toolbarHeight = @$("#pdfToolBar").outerHeight()
  68. areaHeight = @$el.outerHeight()
  69. @$("#pdfAreaContent").height(areaHeight - toolbarHeight)
  70. @pdfView.onResize?()
  71. updateLog: (options) ->
  72. {pdfExists, logExists, compileErrors, rawLog} = options
  73. if @errorViews?
  74. for errorView in @errorViews
  75. errorView.remove()
  76. @errorViews = []
  77. errorLogs = @$("#logArea").find('ul')
  78. errorLogs.empty()
  79. logButtonHtml = "Logs"
  80. if compileErrors?
  81. for error in compileErrors.errors.concat(compileErrors.warnings).concat(compileErrors.typesetting)
  82. errorView = new LatexErrorView(@options.manager.ide, error)
  83. errorView.render()
  84. @errorViews.push(errorView)
  85. # TODO: The event handlers introduced by LatexError are never freed
  86. errorLogs.append(errorView.el)
  87. if compileErrors.errors.length > 0
  88. logButtonHtml += " <span class='label label-important'>#{compileErrors.errors.length}</span>"
  89. if compileErrors.warnings.length > 0
  90. logButtonHtml += " <span class='label label-warning'>#{compileErrors.warnings.length}</span>"
  91. if compileErrors.typesetting.length > 0
  92. logButtonHtml += " <span class='label label-info'>#{compileErrors.typesetting.length}</span>"
  93. @$("#showLog").html(logButtonHtml)
  94. if !pdfExists
  95. if !compileErrors?
  96. errorLogs.prepend($(@templates.compileError))
  97. else
  98. errorLogs.prepend($(@templates.compileFailed))
  99. else if pdfExists && compileErrors.all.length == 0
  100. errorLogs.prepend($(@templates.compileSuccess))
  101. @$("#rawLogArea").find("pre").text(rawLog)
  102. setPdf: (pdfUrl) ->
  103. @pdfUrl = pdfUrl
  104. @pdfView.setPdf pdfUrl
  105. @$("#downloadPdf").removeAttr("disabled")
  106. @$("#downloadLinksButton").removeAttr("disabled")
  107. unsetPdf: () ->
  108. delete @pdfUrl
  109. @pdfView.unsetPdf()
  110. @$("#downloadPdf").attr("disabled", "disabled")
  111. @$("#downloadLinksButton").attr("disabled", "disabled")
  112. return @
  113. hasPdf: () -> !!@pdfUrl
  114. IGNORE_FILES: ["output.fls", "output.fdb_latexmk"]
  115. showOutputFileDownloadLinks: (outputFiles) ->
  116. @$("#downloadLinks").empty()
  117. for file in outputFiles
  118. if @IGNORE_FILES.indexOf(file.path) == -1
  119. if file.path.match(/^output\./)
  120. name = "#{file.path.replace(/^output\./, "")} file"
  121. else
  122. name = file.path
  123. link = $ Mustache.to_html(@templates.outputFileLink, {
  124. project_id: @ide.project_id
  125. name: name
  126. path: file.path
  127. })
  128. @$("#downloadLinks").append(link)
  129. afterSwitchView: ()->
  130. if !@pdfjs
  131. @pdfView.unsetPdf()
  132. @pdfView.hide()
  133. @$(".not-compiled-yet-message").show()
  134. showBeforeCompile: () ->
  135. @pdfView.hide()
  136. @$("#showPdfGroup").hide()
  137. @$("#showLog").attr("disabled", "disabled")
  138. @$("#downloadPdf").attr("disabled", "disabled")
  139. @$("#downloadLinksButton").attr("disabled", "disabled")
  140. @$(".compiling-message").hide()
  141. @$(".not-compiled-yet-message").show()
  142. showPdf: () ->
  143. @$("#logArea").hide()
  144. @$("#rawLogArea").hide()
  145. @pdfView.show()
  146. @$("#showPdfGroup").hide()
  147. @$("#showLogGroup").show()
  148. showLog: () ->
  149. @$("#rawLogArea").hide()
  150. @pdfView.hide()
  151. @$("#logArea").show()
  152. @$("#showPdfGroup").show()
  153. @$("#showLogGroup").hide()
  154. showRawLog: () ->
  155. @pdfView.hide()
  156. @$("#logArea").hide()
  157. @$("#rawLogArea").show()
  158. @$("#showPdfGroup").show()
  159. @$("#showLogGroup").hide()
  160. onCompiling: () ->
  161. @$(".not-compiled-yet-message").hide()
  162. @$(".compiling-message").show()
  163. @$("#recompilePdf").attr("disabled", "disabled")
  164. doneCompiling: () ->
  165. @$(".compiling-message").hide()
  166. @$("#recompilePdf").removeAttr("disabled")
  167. @$("#showLog").removeAttr("disabled")
  168. recompilePdf: () ->
  169. @options.manager.trigger "compile:pdf"
  170. @options.manager.refreshPdf()
  171. toggleFlatViewButton: () -> @$("#flatViewButton").button("toggle")
  172. toggleSplitViewButton: () -> @$("#splitViewButton").button("toggle")
  173. downloadPdf: () ->
  174. @options.manager.downloadPdf()
  175. delegateEvents: () ->
  176. Backbone.View::delegateEvents.apply(this, arguments)
  177. @pdfView.delegateEvents()
  178. undelegateEvents: () ->
  179. Backbone.View::undelegateEvents.apply(this, arguments)
  180. @pdfView.undelegateEvents()
  181. highlightInPdf: (args...) ->
  182. @pdfView.highlightInPdf?(args...)
  183. getPdfPosition: () ->
  184. @pdfView.getPdfPosition?()