CompiledView.coffee 6.5 KB

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