private void createVerticalRuler(IDocument newInput, Class<SourceViewer> sourceViewerClazz)
      throws SecurityException, NoSuchMethodException, IllegalArgumentException,
          IllegalAccessException, InvocationTargetException, NoSuchFieldException {

    forceCustomAnnotationHover();

    Method declaredMethod2 = sourceViewerClazz.getDeclaredMethod("getVerticalRuler");
    declaredMethod2.setAccessible(true);
    CompositeRuler ruler = (CompositeRuler) declaredMethod2.invoke(sourceViewer);
    boolean hasDecorator = false;

    Iterator<?> iter = (ruler).getDecoratorIterator();
    while (iter.hasNext()) {
      Object obj = iter.next();
      if (obj instanceof AnnotationColumn) {
        hasDecorator = true;
      }
    }

    if (!hasDecorator) {
      AnnotationColumn annotationColumn = new AnnotationColumn();
      annotationColumn.createControl(ruler, ruler.getControl().getParent());
      ruler.addDecorator(0, annotationColumn);
    }
  }
  @Override
  protected CompositeRuler createCompositeRuler() {
    annotationAccess = new AnnotationMarkerAccess();
    IAnnotationModel annotationModel = getDocumentProvider().getAnnotationModel(getEditorInput());
    AnnotationRulerColumn annotationRulerCol =
        new AnnotationRulerColumn(annotationModel, 16, annotationAccess);
    annotationRulerCol.addAnnotationType(AlternativeAnnotation.ALTERNATIVE_TYPE);

    CompositeRuler compositeRuler = new CompositeRuler();
    compositeRuler.setModel(annotationModel);
    compositeRuler.addDecorator(0, annotationRulerCol);

    return compositeRuler;
  }
  /**
   * @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();
  }
 protected void setLastRulerMouseLocation(ISourceViewer viewer, int line) {
   // set last mouse activity in order to get the correct context menu
   if (fCompositeRuler != null) {
     StyledText st = viewer.getTextWidget();
     if (st != null && !st.isDisposed()) {
       if (viewer instanceof ITextViewerExtension5) {
         int widgetLine = ((ITextViewerExtension5) viewer).modelLine2WidgetLine(line);
         Point loc = st.getLocationAtOffset(st.getOffsetAtLine(widgetLine));
         fCompositeRuler.setLocationOfLastMouseButtonActivity(0, loc.y);
       } else if (viewer instanceof TextViewer) {
         // TODO remove once TextViewer implements the extension
         int widgetLine = ((TextViewer) viewer).modelLine2WidgetLine(line);
         Point loc = st.getLocationAtOffset(st.getOffsetAtLine(widgetLine));
         fCompositeRuler.setLocationOfLastMouseButtonActivity(0, loc.y);
       }
     }
   }
 }
 @SuppressWarnings("unchecked")
 protected IVerticalRuler createCompositeRuler() {
   CompositeRuler ruler = new CompositeRuler();
   ruler.addDecorator(0, new AnnotationRulerColumn(VERTICAL_RULER_WIDTH, getAnnotationAccess()));
   for (Iterator iter = ruler.getDecoratorIterator(); iter.hasNext(); ) {
     IVerticalRulerColumn col = (IVerticalRulerColumn) iter.next();
     if (col instanceof AnnotationRulerColumn) {
       AnnotationRulerColumn column = (AnnotationRulerColumn) col;
       for (Iterator iter2 = fAnnotationPreferences.getAnnotationPreferences().iterator();
           iter2.hasNext(); ) {
         AnnotationPreference preference = (AnnotationPreference) iter2.next();
         column.addAnnotationType(preference.getAnnotationType());
       }
       column.addAnnotationType(Annotation.TYPE_UNKNOWN);
       break;
     }
   }
   return ruler;
 }