CompiledView.coffee 6.2 KB

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