/**
   * @param parent
   * @param ruler
   * @param styles
   */
  public DiffViewer(Composite parent, IVerticalRuler ruler, int styles) {
    super(parent, ruler, styles);
    setDocument(new Document());
    SourceViewerDecorationSupport support =
        new SourceViewerDecorationSupport(this, null, null, EditorsUI.getSharedTextColors());
    support.setCursorLinePainterPreferenceKeys(
        AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE,
        AbstractDecoratedTextEditorPreferenceConstants.EDITOR_CURRENT_LINE_COLOR);
    support.install(EditorsUI.getPreferenceStore());
    if (ruler instanceof CompositeRuler) {
      lineNumberRuler = new LineNumberRulerColumn();
      ((CompositeRuler) ruler).addDecorator(0, lineNumberRuler);
    }
    initListeners();
    getControl()
        .addDisposeListener(
            new DisposeListener() {

              public void widgetDisposed(DisposeEvent e) {
                EditorsUI.getPreferenceStore().removePropertyChangeListener(editorPrefListener);
                PlatformUI.getWorkbench()
                    .getThemeManager()
                    .removePropertyChangeListener(themeListener);
                colors.dispose();
              }
            });
    refreshDiffColors();
    styleViewer();
  }
  private SourceViewerDecorationSupport configureAnnotationPreferences() {
    ISharedTextColors textColors = EditorsUI.getSharedTextColors();
    IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
    final SourceViewerDecorationSupport support =
        new SourceViewerDecorationSupport(sourceViewer, null, annotationAccess, textColors);

    List annotationPreferences = new MarkerAnnotationPreferences().getAnnotationPreferences();
    Iterator e = annotationPreferences.iterator();
    while (e.hasNext()) support.setAnnotationPreference((AnnotationPreference) e.next());

    support.install(EditorsUI.getPreferenceStore());
    return support;
  }
  /*
   * overview ruler problem: displayed in both viewers. the diff editor ruler is actually custom drawn (see
   * TextMergeViewer.fBirdsEyeCanvas) the ruler that gets created in this method is longer than the editor, meaning its
   * not an overview (not next to the scrollbar)
   */
  @SuppressWarnings("unused")
  private void createOverviewRuler(IDocument newInput, Class<SourceViewer> sourceViewerClazz)
      throws SecurityException, NoSuchMethodException, NoSuchFieldException,
          IllegalArgumentException, IllegalAccessException, InvocationTargetException {

    sourceViewer.setOverviewRulerAnnotationHover(new CommentAnnotationHover(null));

    OverviewRuler ruler =
        new OverviewRuler(
            new DefaultMarkerAnnotationAccess(),
            15,
            EditorsPlugin.getDefault().getSharedTextColors());
    Field compositeField = sourceViewerClazz.getDeclaredField("fComposite");
    compositeField.setAccessible(true);

    ruler.createControl((Composite) compositeField.get(sourceViewer), sourceViewer);
    ruler.setModel(annotationModel);
    // ruler.setModel(compareAnnotationModel.leftAnnotationModel);
    // XXX should go through SourceViewerDecorationSupport instead
    //		ruler.addAnnotationType("org.eclipse.mylyn.reviews.ui.comment.Annotation");
    //		ruler.setAnnotationTypeLayer("org.eclipse.mylyn.reviews.ui.comment.Annotation", 1);
    //		ruler.update();

    IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
    final SourceViewerDecorationSupport support =
        new SourceViewerDecorationSupport(
            sourceViewer, ruler, annotationAccess, EditorsUI.getSharedTextColors());
    Iterator<?> e = new MarkerAnnotationPreferences().getAnnotationPreferences().iterator();
    while (e.hasNext()) {
      support.setAnnotationPreference((AnnotationPreference) e.next());
    }
    support.install(EditorsUI.getPreferenceStore());
    sourceViewer
        .getControl()
        .addDisposeListener(
            new DisposeListener() {
              public void widgetDisposed(DisposeEvent e) {
                support.dispose();
              }
            });

    Field overViewRulerField = sourceViewerClazz.getDeclaredField("fOverviewRuler");
    overViewRulerField.setAccessible(true);

    if (overViewRulerField.get(sourceViewer) == null) {
      overViewRulerField.set(sourceViewer, ruler);
    }

    Method declareMethod =
        sourceViewerClazz.getDeclaredMethod("ensureOverviewHoverManagerInstalled");
    declareMethod.setAccessible(true);
    declareMethod.invoke(sourceViewer);
    // overviewRuler is null

    Field hoverManager = sourceViewerClazz.getDeclaredField("fOverviewRulerHoveringController");
    hoverManager.setAccessible(true);
    AnnotationBarHoverManager manager = (AnnotationBarHoverManager) hoverManager.get(sourceViewer);
    if (manager != null) {
      Field annotationHover = AnnotationBarHoverManager.class.getDeclaredField("fAnnotationHover");
      annotationHover.setAccessible(true);
      IAnnotationHover hover = (IAnnotationHover) annotationHover.get(manager);
      annotationHover.set(manager, new CommentAnnotationHover(null));
    }
    sourceViewer.showAnnotations(true);
    sourceViewer.showAnnotationsOverview(true);

    declareMethod =
        sourceViewerClazz.getDeclaredMethod("showAnnotationsOverview", new Class[] {Boolean.TYPE});
    declareMethod.setAccessible(true);
  }
 private void updateCommentedColor(AnnotationPreference pref, IPreferenceStore store) {
   if (pref != null) {
     RGB rgb = CommentAnnotationRulerColumn.getColorFromAnnotationPreference(store, pref);
     colorCommented = EditorsUI.getSharedTextColors().getColor(rgb);
   }
 }
 private ISharedTextColors getSharedColors() {
   return EditorsUI.getSharedTextColors();
 }