             return @_error(err) if err
             @_fileChanged 'openedFile', content, metadata, {openedContent: content.clone()}, @_getHashParams metadata
 
+  isSaveInProgress: ->
+    @state.saving?
+
   save: (callback = null) ->
     @_event 'getContent', {}, (stringContent) =>
       @saveContent stringContent, callback

    if @_autoSaveInterval
      clearInterval @_autoSaveInterval

    # in case the caller uses milliseconds
    if interval > 1000
      interval = Math.round(interval / 1000)
    if interval > 0
      @_autoSaveInterval = setInterval (=> @save() if @state.dirty and not @state.metadata?.autoSaveDisabled and @state.metadata?.provider?.can 'save'), (interval * 1000)

  isAutoSaving: ->
    @_autoSaveInterval?

      currentContent = @_createOrUpdateCurrentContent stringContent, metadata
      metadata.provider.save currentContent, metadata, (err) =>
        if err
          # disable autosave on save failure; clear "Saving..." message
          metadata.autoSaveDisabled = true
          @_setState { metadata: metadata, saving: null }
          return @_error(err)
