     @_bottomTabFile.count = counts.file
     @_bottomTabProject.count = counts.project
     @_bottomStatus.count = counts.project
+
+  updateBubble: (point)->
+    @removeBubble()
+    return unless @_showBubble
+    return unless @_messages.length
+    point = point || @linter.activeEditor.getCursorBufferPosition()
+    for message in @_messages
+      continue unless message.currentFile
+      continue unless message.range
+      continue unless message.range.containsPoint point
+
+  removeBubble: ->
+    return unless @_bubble
+    @_bubble.destroy()
+    @_bubble = null
 
   # consumed in views/bottom-tab-{file, project}
   changeTab: (Tab)->

    @_panel.id = 'linter-panel'

    # Bubble
    @linter.subscriptions.add atom.config.observe 'linter.showErrorInline', (showErrorInline) =>
      if showErrorInline
        @bubble = new Bubble @linter
      else
        @bubble?.remove()
        @bubble = null

  # This message is called in editor-linter.coffee
  render: ->

BottomTabProject = require './views/bottom-tab-project'
BottomStatus = require './views/bottom-status'
Message = require './views/message'

class LinterViews
  constructor: (@linter) ->
    @_messages = []
    @_decorations = []
    @_showBubble = true

    @_bottomTabFile = new BottomTabFile()
    @_bottomTabProject = new BottomTabProject()
    @_panel = document.createElement 'div'
    @_bubble = document.createElement 'div'
    @_bottomStatus = new BottomStatus()

    @_bottomTabFile.initialize(@linter)
