[devkit] make `UElementAsPsiInspection` report on return values
[idea/community.git] / platform / diff-impl / src / com / intellij / diff / tools / fragmented / UnifiedDiffModel.java
1 // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package com.intellij.diff.tools.fragmented;
3
4 import com.intellij.diff.util.Side;
5 import com.intellij.openapi.editor.RangeMarker;
6 import com.intellij.openapi.editor.ex.DocumentEx;
7 import com.intellij.util.ThreeState;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.util.ArrayList;
12 import java.util.Collections;
13 import java.util.List;
14
15 public class UnifiedDiffModel {
16   @NotNull private final UnifiedDiffViewer myViewer;
17
18   @Nullable private ChangedBlockData myData = null;
19   @NotNull private ThreeState myIsContentsEqual = ThreeState.UNSURE;
20
21   @NotNull private final List<UnifiedDiffChangeUi> myPresentations = new ArrayList<>();
22   @NotNull private final List<RangeMarker> myGuardedRangeBlocks = new ArrayList<>();
23
24   public UnifiedDiffModel(@NotNull UnifiedDiffViewer viewer) {
25     myViewer = viewer;
26   }
27
28   public boolean isValid() {
29     return myData != null;
30   }
31
32   @NotNull
33   public ThreeState isContentsEqual() {
34     return myIsContentsEqual;
35   }
36
37   @Nullable
38   public ChangedBlockData getData() {
39     return myData;
40   }
41
42   @Nullable
43   public List<UnifiedDiffChange> getDiffChanges() {
44     ChangedBlockData data = myData;
45     return data != null ? data.getDiffChanges() : null;
46   }
47
48   @Nullable
49   public LineNumberConvertor getLineNumberConvertor(@NotNull Side side) {
50     ChangedBlockData data = myData;
51     return data != null ? data.getLineNumberConvertor(side) : null;
52   }
53
54   public void setChanges(@NotNull List<UnifiedDiffChange> changes,
55                          boolean isContentsEqual,
56                          @NotNull List<RangeMarker> guardedBlocks,
57                          @NotNull LineNumberConvertor convertor1,
58                          @NotNull LineNumberConvertor convertor2,
59                          @NotNull List<HighlightRange> ranges) {
60     assert myPresentations.isEmpty() && myGuardedRangeBlocks.isEmpty() && myData == null;
61
62     for (UnifiedDiffChange change : changes) {
63       UnifiedDiffChangeUi changeUi = myViewer.createUi(change);
64       changeUi.installHighlighter();
65       myPresentations.add(changeUi);
66     }
67
68     myGuardedRangeBlocks.addAll(guardedBlocks);
69
70     myData = new ChangedBlockData(changes, convertor1, convertor2, ranges);
71     myIsContentsEqual = ThreeState.fromBoolean(isContentsEqual);
72   }
73
74   public void clear() {
75     for (UnifiedDiffChangeUi changeUi : myPresentations) {
76       changeUi.destroyHighlighter();
77     }
78     myPresentations.clear();
79
80     DocumentEx document = myViewer.getEditor().getDocument();
81     for (RangeMarker block : myGuardedRangeBlocks) {
82       document.removeGuardedBlock(block);
83     }
84     myGuardedRangeBlocks.clear();
85
86     myData = null;
87     myIsContentsEqual = ThreeState.UNSURE;
88   }
89
90   public void updateGutterActions() {
91     for (UnifiedDiffChangeUi changeUi : myPresentations) {
92       changeUi.updateGutterActions();
93     }
94   }
95
96   public static class ChangedBlockData {
97     @NotNull private final List<UnifiedDiffChange> myDiffChanges;
98     @NotNull private final LineNumberConvertor myLineNumberConvertor1;
99     @NotNull private final LineNumberConvertor myLineNumberConvertor2;
100     @NotNull private final List<HighlightRange> myRanges;
101
102     ChangedBlockData(@NotNull List<UnifiedDiffChange> diffChanges,
103                      @NotNull LineNumberConvertor lineNumberConvertor1,
104                      @NotNull LineNumberConvertor lineNumberConvertor2,
105                      @NotNull List<HighlightRange> ranges) {
106       myDiffChanges = Collections.unmodifiableList(diffChanges);
107       myLineNumberConvertor1 = lineNumberConvertor1;
108       myLineNumberConvertor2 = lineNumberConvertor2;
109       myRanges = Collections.unmodifiableList(ranges);
110     }
111
112     @NotNull
113     public List<UnifiedDiffChange> getDiffChanges() {
114       return myDiffChanges;
115     }
116
117     @NotNull
118     public LineNumberConvertor getLineNumberConvertor(@NotNull Side side) {
119       return side.select(myLineNumberConvertor1, myLineNumberConvertor2);
120     }
121
122     @NotNull
123     public List<HighlightRange> getRanges() {
124       return myRanges;
125     }
126   }
127 }