CompiledView.coffee 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  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. errorLogs.find(".js-clear-cache").on "click", () =>
  104. @options.manager.deleteCachedFiles()
  105. @$("#rawLogArea").find("pre").text(rawLog)
  106. setPdf: (pdfUrl) ->
  107. @pdfUrl = pdfUrl
  108. @pdfView.setPdf pdfUrl
  109. @$("#downloadPdf").removeAttr("disabled")
  110. @$("#downloadLinksButton").removeAttr("disabled")
  111. unsetPdf: () ->
  112. delete @pdfUrl
  113. @pdfView.unsetPdf()
  114. @$("#downloadPdf").attr("disabled", "disabled")
  115. @$("#downloadLinksButton").attr("disabled", "disabled")
  116. return @
  117. hasPdf: () -> !!@pdfUrl
  118. IGNORE_FILES: ["output.fls", "output.fdb_latexmk"]
  119. showOutputFileDownloadLinks: (outputFiles) ->
  120. @$("#downloadLinks").empty()
  121. for file in outputFiles
  122. if @IGNORE_FILES.indexOf(file.path) == -1
  123. if file.path.match(/^output\./)
  124. name = "#{file.path.replace(/^output\./, "")} file"
  125. else
  126. name = file.path
  127. link = $ Mustache.to_html(@templates.outputFileLink, {
  128. project_id: @ide.project_id
  129. name: name
  130. path: file.path
  131. })
  132. @$("#downloadLinks").append(link)
  133. afterSwitchView: ()->
  134. if !@pdfjs
  135. @pdfView.unsetPdf()
  136. @pdfView.hide()
  137. @$(".not-compiled-yet-message").show()
  138. showBeforeCompile: () ->
  139. @pdfView.hide()
  140. @$("#showPdfGroup").hide()
  141. @$("#showLog").attr("disabled", "disabled")
  142. @$("#downloadPdf").attr("disabled", "disabled")
  143. @$("#downloadLinksButton").attr("disabled", "disabled")
  144. @$(".compiling-message").hide()
  145. @$(".not-compiled-yet-message").show()
  146. showPdf: () ->
  147. @$("#logArea").hide()
  148. @$("#rawLogArea").hide()
  149. @pdfView.show()
  150. @$("#showPdfGroup").hide()
  151. @$("#showLogGroup").show()
  152. showLog: () ->
  153. @$("#rawLogArea").hide()
  154. @pdfView.hide()
  155. @$("#logArea").show()
  156. @$("#showPdfGroup").show()
  157. @$("#showLogGroup").hide()
  158. showRawLog: () ->
  159. @pdfView.hide()
  160. @$("#logArea").hide()
  161. @$("#rawLogArea").show()
  162. @$("#showPdfGroup").show()
  163. @$("#showLogGroup").hide()
  164. onCompiling: () ->
  165. @$(".not-compiled-yet-message").hide()
  166. @$(".compiling-message").show()
  167. @$("#recompilePdf").attr("disabled", "disabled")
  168. doneCompiling: () ->
  169. @$(".compiling-message").hide()
  170. @$("#recompilePdf").removeAttr("disabled")
  171. @$("#showLog").removeAttr("disabled")
  172. recompilePdf: () ->
  173. @options.manager.trigger "compile:pdf"
  174. rootDocOverride_id = null
  175. for line in @ide.editor.getLines()
  176. match = line.match /(.*)\\documentclass/
  177. if match and !match[1].match /%/
  178. rootDocOverride_id = @ide.editor.getCurrentDocId()
  179. @options.manager.refreshPdf {rootDocOverride_id}
  180. toggleFlatViewButton: () -> @$("#flatViewButton").button("toggle")
  181. toggleSplitViewButton: () -> @$("#splitViewButton").button("toggle")
  182. downloadPdf: () ->
  183. @options.manager.downloadPdf()
  184. delegateEvents: () ->
  185. Backbone.View::delegateEvents.apply(this, arguments)
  186. @pdfView.delegateEvents()
  187. undelegateEvents: () ->
  188. Backbone.View::undelegateEvents.apply(this, arguments)
  189. @pdfView.undelegateEvents()
  190. highlightInPdf: (args...) ->
  191. @pdfView.highlightInPdf?(args...)
  192. getPdfPosition: () ->
  193. @pdfView.getPdfPosition?()