@Nullable
    public GutterIconRenderer createRenderer() {
      myCtrlPressed = myViewer.getModifierProvider().isCtrlPressed();

      boolean isEditable = DiffUtil.isEditable(myViewer.getEditor(mySide));
      boolean isOtherEditable = DiffUtil.isEditable(myViewer.getEditor(mySide.other()));
      boolean isAppendable =
          myFragment.getStartLine1() != myFragment.getEndLine1()
              && myFragment.getStartLine2() != myFragment.getEndLine2();

      if (isOtherEditable && isEditable) {
        if (myCtrlPressed && isAppendable) {
          return createAppendRenderer(mySide);
        } else {
          return createApplyRenderer(mySide);
        }
      } else if (isEditable) {
        return createRevertRenderer(mySide);
      } else if (isOtherEditable) {
        if (isAppendable) {
          return createAppendRenderer(mySide);
        }
      }
      return null;
    }
 @Nullable
 private GutterIconRenderer createIconRenderer(
     @NotNull final Side sourceSide,
     @NotNull final String tooltipText,
     @NotNull final Icon icon,
     @NotNull final Runnable perform) {
   if (!DiffUtil.isEditable(myViewer.getEditor(sourceSide.other()))) return null;
   return new DiffGutterRenderer(icon, tooltipText) {
     @Override
     protected void performAction(AnActionEvent e) {
       if (!myIsValid) return;
       final Project project = e.getProject();
       final Document document = myViewer.getEditor(sourceSide.other()).getDocument();
       DiffUtil.executeWriteCommand(
           document,
           project,
           "Replace change",
           new Runnable() {
             @Override
             public void run() {
               perform.run();
             }
           });
     }
   };
 }