if (org.eclipse.wst.sse.core.internal.util.Debug.perfTestAdapterClassLoading) {
      startPerfTime = System.currentTimeMillis();
    }
    Object result = null;
    // text editor
    IStructuredModel internalModel = getInternalModel();
    if (ITextEditor.class.equals(required) || ITextEditorExtension5.class.equals(required) || ITextEditorExtension4.class.equals(required) || ITextEditorExtension3.class.equals(required) || ITextEditorExtension2.class.equals(required) || ITextEditorExtension.class.equals(required)) {
      result = this;
    }
    else if (IWorkbenchSiteProgressService.class.equals(required)) {
      return getEditorPart().getSite().getAdapter(IWorkbenchSiteProgressService.class);
    }
    // content outline page
    else if (IContentOutlinePage.class.equals(required)) {
      if (fOutlinePage == null || fOutlinePage.getControl() == null || fOutlinePage.getControl().isDisposed()) {
        ContentOutlineConfiguration cfg = createContentOutlineConfiguration();
        if (cfg != null) {
          ConfigurableContentOutlinePage outlinePage = new ConfigurableContentOutlinePage();
          outlinePage.setConfiguration(cfg);
          if (internalModel != null) {
            outlinePage.setInputContentTypeIdentifier(internalModel.getContentTypeIdentifier());
            outlinePage.setInput(internalModel);
          }
          if (fOutlinePageListener == null) {
            fOutlinePageListener = new OutlinePageListener();
          }
          outlinePage.addSelectionChangedListener(fOutlinePageListener);
          outlinePage.addDoubleClickListener(fOutlinePageListener);
          fOutlinePage = outlinePage;
        }
      }
      result = fOutlinePage;
    }
    // property sheet page, but only if the input's editable
    else if (IPropertySheetPage.class.equals(required) && isEditable()) {
      if (fPropertySheetPage == null || fPropertySheetPage.getControl() == null || fPropertySheetPage.getControl().isDisposed()) {
        PropertySheetConfiguration cfg = createPropertySheetConfiguration();
        if (cfg != null) {
          ConfigurablePropertySheetPage propertySheetPage = new ConfigurablePropertySheetPage();
          propertySheetPage.setConfiguration(cfg);
          fPropertySheetPage = propertySheetPage;
        }
      }
      result = fPropertySheetPage;
    }
    else if (IDocument.class.equals(required)) {
      result = getDocumentProvider().getDocument(getEditorInput());
    }
    else if (ISourceEditingTextTools.class.equals(required)) {
      result = createSourceEditingTextTools();
    }
    else if (IToggleBreakpointsTarget.class.equals(required)) {
      result = ToggleBreakpointsTarget.getInstance();
    }
    else if (ITextEditorExtension4.class.equals(required)) {
      result = this;
    }
    else if (IShowInTargetList.class.equals(required)) {
      result = new ShowInTargetListAdapter();
    }
    else if (IVerticalRuler.class.equals(required)) {
      return getVerticalRuler();
    }
    else if (SelectionHistory.class.equals(required)) {
      if (fSelectionHistory == null)
        fSelectionHistory = new SelectionHistory(this);
      result = fSelectionHistory;
    }
    else if (IResource.class.equals(required)) {
      IEditorInput input = getEditorInput();
      if (input != null) {
        result = input.getAdapter(required);
      }
    }
    else {
      if (result == null && internalModel != null) {
        result = internalModel.getAdapter(required);
      }
      // others
      if (result == null)
        result = super.getAdapter(required);
    }