private void updateDocumentProvider(IEditorInput input) {

    IProgressMonitor rememberedProgressMonitor = null;

    IDocumentProvider provider = getDocumentProvider();
    if (provider != null) {
      provider.removeElementStateListener(fElementStateListener);
      if (provider instanceof IDocumentProviderExtension2) {
        IDocumentProviderExtension2 extension = (IDocumentProviderExtension2) provider;
        rememberedProgressMonitor = extension.getProgressMonitor();
        extension.setProgressMonitor(null);
      }
    }

    setDocumentProvider(input);

    provider = getDocumentProvider();
    if (provider != null) {
      provider.addElementStateListener(fElementStateListener);
      if (provider instanceof IDocumentProviderExtension2) {
        IDocumentProviderExtension2 extension = (IDocumentProviderExtension2) provider;
        extension.setProgressMonitor(rememberedProgressMonitor);
      }
    }
  }
  /**
   * Disposes of the connection with the document provider. Subclasses may extend.
   *
   * @since 3.0
   */
  protected void disposeDocumentProvider() {
    IDocumentProvider provider = getDocumentProvider();
    if (provider != null) {

      IEditorInput input = getEditorInput();
      if (input != null) provider.disconnect(input);

      if (fElementStateListener != null) {
        provider.removeElementStateListener(fElementStateListener);
        fElementStateListener = null;
      }
    }
    fImplicitDocumentProvider = null;
  }
  /*
   * @see org.eclipse.ui.texteditor.quickdiff.IQuickDiffReferenceProvider#dispose()
   */
  public void dispose() {
    IProgressMonitor monitor = fProgressMonitor;
    if (monitor != null) {
      monitor.setCanceled(true);
    }

    IDocumentProvider provider = fDocumentProvider;

    synchronized (fLock) {
      if (provider != null) provider.removeElementStateListener(this);
      fEditorInput = null;
      fDocumentProvider = null;
      fReference = null;
      fDocumentRead = false;
      fProgressMonitor = null;
      fEditor = null;
    }
  }