Merge remote-tracking branch 'origin/master'

This commit is contained in:
Ilya.Kazakevich
2015-05-18 20:33:37 +03:00
8 changed files with 401 additions and 299 deletions
@@ -24,10 +24,10 @@ import com.intellij.diff.contents.FileContent;
import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.tools.util.DiffNotifications;
import com.intellij.diff.tools.util.FocusTrackerSupport;
import com.intellij.diff.tools.util.SimpleDiffPanel;
import com.intellij.diff.tools.util.StatusPanel;
import com.intellij.diff.tools.util.base.ListenerDiffViewerBase;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.DiffUtil;
import com.intellij.diff.util.Side;
import com.intellij.openapi.Disposable;
@@ -61,8 +61,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@@ -79,10 +77,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
@Nullable private final FileEditorProvider myEditorProvider1;
@Nullable private final FileEditorProvider myEditorProvider2;
@Nullable private final MyEditorFocusListener myEditorFocusListener1;
@Nullable private final MyEditorFocusListener myEditorFocusListener2;
@NotNull private Side myCurrentSide = Side.LEFT;
@NotNull private final FocusTrackerSupport.TwosideFocusTrackerSupport myFocusTrackerSupport;
public BinaryDiffViewer(@NotNull DiffContext context, @NotNull DiffRequest request) {
super(context, (ContentDiffRequest)request);
@@ -96,32 +91,18 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
myEditorProvider2 = editors.second.second;
assert myEditor1 != null || myEditor2 != null;
if (myEditor1 != null && myEditor2 != null) {
myEditorFocusListener1 = new MyEditorFocusListener(Side.LEFT);
myEditorFocusListener2 = new MyEditorFocusListener(Side.RIGHT);
}
else {
myEditorFocusListener1 = null;
myEditorFocusListener2 = null;
}
myContentPanel = new BinaryContentPanel(titlePanel, myEditor1, myEditor2);
myFocusTrackerSupport = new FocusTrackerSupport.TwosideFocusTrackerSupport(getEditor1(), getEditor2());
myContentPanel = new BinaryContentPanel(titlePanel, getEditor1(), getEditor2());
myPanel = new SimpleDiffPanel(myContentPanel, this, context);
myStatusPanel = new MyStatusPanel();
new MyFocusOppositePaneAction().setupAction(myPanel);
installEditorListeners();
}
@Override
@CalledInAwt
public void onDispose() {
destroyEditorListeners();
destroyEditors();
super.onDispose();
}
@@ -130,25 +111,14 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
@CalledInAwt
protected void processContextHints() {
super.processContextHints();
if (myEditor1 == null) {
myCurrentSide = Side.RIGHT;
}
else if (myEditor2 == null) {
myCurrentSide = Side.LEFT;
}
else {
Side side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE);
if (side != null) myCurrentSide = side;
}
myFocusTrackerSupport.processContextHints(myRequest, myContext);
}
@Override
@CalledInAwt
protected void updateContextHints() {
super.updateContextHints();
if (myEditor1 != null && myEditor2 != null) {
myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide);
}
myFocusTrackerSupport.updateContextHints(myRequest, myContext);
}
//
@@ -212,27 +182,13 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
private void destroyEditors() {
if (myEditor1 != null) {
if (getEditor1() != null) {
assert myEditorProvider1 != null;
myEditorProvider1.disposeEditor(myEditor1);
myEditorProvider1.disposeEditor(getEditor1());
}
if (myEditor2 != null) {
if (getEditor2() != null) {
assert myEditorProvider2 != null;
myEditorProvider2.disposeEditor(myEditor2);
}
}
private void installEditorListeners() {
if (myEditor1 != null && myEditor2 != null) {
myEditor1.getComponent().addFocusListener(myEditorFocusListener1);
myEditor2.getComponent().addFocusListener(myEditorFocusListener2);
}
}
private void destroyEditorListeners() {
if (myEditor1 != null && myEditor2 != null) {
myEditor1.getComponent().removeFocusListener(myEditorFocusListener1);
myEditor2.getComponent().removeFocusListener(myEditorFocusListener2);
myEditorProvider2.disposeEditor(getEditor2());
}
}
@@ -364,8 +320,12 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
}
@NotNull
Side getCurrentSide() {
return myCurrentSide;
public Side getCurrentSide() {
return myFocusTrackerSupport.getCurrentSide();
}
public void setCurrentSide(@NotNull Side side) {
myFocusTrackerSupport.setCurrentSide(side);
}
@Nullable
@@ -381,7 +341,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
@NotNull
FileEditor getCurrentEditor() {
//noinspection ConstantConditions
return getCurrentSide().select(myEditor1, myEditor2);
return getCurrentSide().select(getEditor1(), getEditor2());
}
@NotNull
@@ -446,14 +406,14 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
private class MyFocusOppositePaneAction extends FocusOppositePaneAction {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
assert myEditor1 != null && myEditor2 != null;
myCurrentSide = myCurrentSide.other();
assert getEditor1() != null && getEditor2() != null;
setCurrentSide(getCurrentSide().other());
myPanel.requestFocus();
}
@Override
public void update(@NotNull AnActionEvent e) {
e.getPresentation().setEnabled(myEditor1 != null && myEditor2 != null);
e.getPresentation().setEnabled(getEditor1() != null && getEditor2() != null);
}
}
@@ -465,7 +425,7 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
@Override
public Object getData(@NonNls String dataId) {
if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) {
return DiffUtil.getVirtualFile(myRequest, myCurrentSide);
return DiffUtil.getVirtualFile(myRequest, getCurrentSide());
}
return super.getData(dataId);
}
@@ -476,17 +436,4 @@ public class BinaryDiffViewer extends ListenerDiffViewerBase {
return -1;
}
}
private class MyEditorFocusListener extends FocusAdapter {
@NotNull private final Side mySide;
private MyEditorFocusListener(@NotNull Side side) {
mySide = side;
}
public void focusGained(FocusEvent e) {
if (myEditor1 == null || myEditor2 == null) return;
myCurrentSide = mySide;
}
}
}
@@ -86,7 +86,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
mySyncScrollable = new MySyncScrollable();
myPrevNextDifferenceIterable = new MyPrevNextDifferenceIterable();
myStatusPanel = new MyStatusPanel();
myFoldingModel = createFoldingModel(myEditor1, myEditor2);
myFoldingModel = createFoldingModel(getEditor1(), getEditor2());
myModifierProvider = new ModifierProvider();
}
@@ -192,10 +192,10 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
try {
indicator.checkCanceled();
assert myActualContent1 != null || myActualContent2 != null;
assert getActualContent1() != null || getActualContent2() != null;
if (myActualContent1 == null) {
final DocumentContent content = myActualContent2;
if (getActualContent1() == null) {
final DocumentContent content = getActualContent2();
final Document document = content.getDocument();
CompareData data = ApplicationManager.getApplication().runReadAction(new Computable<CompareData>() {
@@ -210,8 +210,8 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
return apply(data);
}
if (myActualContent2 == null) {
final DocumentContent content = myActualContent1;
if (getActualContent2() == null) {
final DocumentContent content = getActualContent1();
final Document document = content.getDocument();
CompareData data = ApplicationManager.getApplication().runReadAction(new Computable<CompareData>() {
@@ -226,8 +226,8 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
return apply(data);
}
final DocumentContent content1 = myActualContent1;
final DocumentContent content2 = myActualContent2;
final DocumentContent content1 = getActualContent1();
final DocumentContent content2 = getActualContent2();
final Document document1 = content1.getDocument();
final Document document2 = content2.getDocument();
@@ -284,8 +284,8 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
return new Runnable() {
@Override
public void run() {
if (myEditor1 != null && myEditor1.getDocument().getModificationStamp() != data.getStamp1()) return;
if (myEditor2 != null && myEditor2.getDocument().getModificationStamp() != data.getStamp2()) return;
if (getEditor1() != null && getEditor1().getDocument().getModificationStamp() != data.getStamp1()) return;
if (getEditor2() != null && getEditor2().getDocument().getModificationStamp() != data.getStamp2()) return;
if (myFoldingModel != null) myFoldingModel.updateContext(myRequest, getFoldingModelSettings());
clearDiffPresentation();
@@ -294,7 +294,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
if (data.getFragments() != null) {
for (LineFragment fragment : data.getFragments()) {
myDiffChanges.add(new SimpleDiffChange(SimpleDiffViewer.this, fragment, myEditor1, myEditor2,
myDiffChanges.add(new SimpleDiffChange(SimpleDiffViewer.this, fragment, getEditor1(), getEditor2(),
getHighlightPolicy().isFineFragments()));
}
}
@@ -353,13 +353,13 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
protected void onBeforeDocumentChange(@NotNull DocumentEvent e) {
super.onBeforeDocumentChange(e);
if (myDiffChanges.isEmpty()) return;
if (myEditor1 == null || myEditor2 == null) return;
if (getEditor1() == null || getEditor2() == null) return;
Side side;
if (e.getDocument() == myEditor1.getDocument()) {
if (e.getDocument() == getEditor1().getDocument()) {
side = Side.LEFT;
}
else if (e.getDocument() == myEditor2.getDocument()) {
else if (e.getDocument() == getEditor2().getDocument()) {
side = Side.RIGHT;
}
else {
@@ -401,7 +401,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@CalledInAwt
protected boolean doScrollToChange(@NotNull ScrollToPolicy scrollToPolicy) {
if (myDiffChanges.isEmpty()) return false;
if (myEditor1 == null || myEditor2 == null) return true;
if (getEditor1() == null || getEditor2() == null) return true;
SimpleDiffChange targetChange;
switch (scrollToPolicy) {
@@ -421,7 +421,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
}
private void doScrollToChange(@NotNull SimpleDiffChange change, final boolean animated) {
if (myEditor1 == null || myEditor2 == null) return;
if (getEditor1() == null || getEditor2() == null) return;
assert mySyncScrollSupport != null;
final int line1 = change.getStartLine(Side.LEFT);
@@ -429,14 +429,14 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
final int endLine1 = change.getEndLine(Side.LEFT);
final int endLine2 = change.getEndLine(Side.RIGHT);
DiffUtil.moveCaret(myEditor1, line1);
DiffUtil.moveCaret(myEditor2, line2);
DiffUtil.moveCaret(getEditor1(), line1);
DiffUtil.moveCaret(getEditor2(), line2);
mySyncScrollSupport.makeVisible(getCurrentSide(), line1, endLine1, line2, endLine2, animated);
}
protected boolean doScrollToContext(@NotNull DiffNavigationContext context) {
if (myEditor2 == null) return false;
if (getEditor2() == null) return false;
ChangedLinesIterator changedLinesIterator = new ChangedLinesIterator(Side.RIGHT);
NavigationContextChecker checker = new NavigationContextChecker(changedLinesIterator, context);
@@ -492,7 +492,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@NotNull
@CalledInAwt
private List<SimpleDiffChange> getSelectedChanges(@NotNull Side side) {
EditorEx editor = side.select(myEditor1, myEditor2);
EditorEx editor = side.select(getEditor1(), getEditor2());
if (editor == null) return Collections.emptyList();
final BitSet lines = DiffUtil.getSelectedLines(editor);
@@ -512,7 +512,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@Nullable
@CalledInAwt
private SimpleDiffChange getSelectedChange(@NotNull Side side) {
EditorEx editor = side.select(myEditor1, myEditor2);
EditorEx editor = side.select(getEditor1(), getEditor2());
if (editor == null) return null;
int caretLine = editor.getCaretModel().getLogicalPosition().line;
@@ -629,19 +629,19 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@Override
public void update(@NotNull AnActionEvent e) {
Editor editor = e.getData(CommonDataKeys.EDITOR);
Side side = Side.fromLeft(editor == myEditor1);
Side side = Side.fromLeft(editor == getEditor1());
if (myEditor1 == null || myEditor2 == null) {
if (getEditor1() == null || getEditor2() == null) {
e.getPresentation().setEnabledAndVisible(false);
return;
}
if (editor != myEditor1 && editor != myEditor2) {
if (editor != getEditor1() && editor != getEditor2()) {
e.getPresentation().setEnabledAndVisible(false);
return;
}
Editor modifiedEditor = side.other(myModifyOpposite).select(myEditor1, myEditor2);
Editor modifiedEditor = side.other(myModifyOpposite).select(getEditor1(), getEditor2());
if (!DiffUtil.isEditable(modifiedEditor)) {
e.getPresentation().setEnabledAndVisible(false);
return;
@@ -653,13 +653,13 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@Override
public void actionPerformed(@NotNull final AnActionEvent e) {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
final Side side = Side.fromLeft(editor == myEditor1);
final Side side = Side.fromLeft(editor == getEditor1());
final List<SimpleDiffChange> selectedChanges = getSelectedChanges(side);
Editor modifiedEditor = side.other(myModifyOpposite).select(myEditor1, myEditor2);
Editor modifiedEditor = side.other(myModifyOpposite).select(getEditor1(), getEditor2());
String title = e.getPresentation().getText() + " selected changes";
DiffUtil.executeWriteCommand(modifiedEditor.getDocument(), e.getProject(), title, new Runnable() {
@Override
@@ -672,7 +672,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
protected boolean isSomeChangeSelected(@NotNull Side side) {
if (myDiffChanges.isEmpty()) return false;
Editor editor = side.select(myEditor1, myEditor2);
Editor editor = side.select(getEditor1(), getEditor2());
if (editor == null) return false;
List<Caret> carets = editor.getCaretModel().getAllCarets();
@@ -753,12 +753,12 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@CalledWithWriteLock
public void replaceChange(@NotNull SimpleDiffChange change, @NotNull final Side sourceSide) {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
if (!change.isValid()) return;
final Document document1 = myEditor1.getDocument();
final Document document2 = myEditor2.getDocument();
final Document document1 = getEditor1().getDocument();
final Document document2 = getEditor2().getDocument();
DiffUtil.applyModification(sourceSide.other().select(document1, document2),
change.getStartLine(sourceSide.other()), change.getEndLine(sourceSide.other()),
@@ -771,13 +771,13 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@CalledWithWriteLock
public void appendChange(@NotNull SimpleDiffChange change, @NotNull final Side sourceSide) {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
if (!change.isValid()) return;
if (change.getStartLine(sourceSide) == change.getEndLine(sourceSide)) return;
final Document document1 = myEditor1.getDocument();
final Document document2 = myEditor2.getDocument();
final Document document1 = getEditor1().getDocument();
final Document document2 = getEditor2().getDocument();
DiffUtil.applyModification(sourceSide.other().select(document1, document2),
change.getEndLine(sourceSide.other()), change.getEndLine(sourceSide.other()),
@@ -807,7 +807,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
private AllLinesIterator(@NotNull Side side) {
mySide = side;
Editor editor = mySide.select(myEditor1, myEditor2);
Editor editor = mySide.select(getEditor1(), getEditor2());
assert editor != null;
myDocument = editor.getDocument();
}
@@ -858,7 +858,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
int line1 = change.getStartLine(mySide);
int line2 = change.getEndLine(mySide);
Editor editor = mySide.select(myEditor1, myEditor2);
Editor editor = mySide.select(getEditor1(), getEditor2());
assert editor != null;
Document document = editor.getDocument();
@@ -907,28 +907,28 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
@Override
protected void processHelper(@NotNull ScrollHelper helper) {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
if (!helper.process(0, 0)) return;
for (SimpleDiffChange diffChange : myDiffChanges) {
if (!helper.process(diffChange.getStartLine(Side.LEFT), diffChange.getStartLine(Side.RIGHT))) return;
if (!helper.process(diffChange.getEndLine(Side.LEFT), diffChange.getEndLine(Side.RIGHT))) return;
}
helper.process(myEditor1.getDocument().getLineCount(), myEditor2.getDocument().getLineCount());
helper.process(getEditor1().getDocument().getLineCount(), getEditor2().getDocument().getLineCount());
}
}
private class MyDividerPainter implements DiffSplitter.Painter, DiffDividerDrawUtil.DividerPaintable {
@Override
public void paint(@NotNull Graphics g, @NotNull JComponent divider) {
if (myEditor1 == null || myEditor2 == null) return;
Graphics2D gg = DiffDividerDrawUtil.getDividerGraphics(g, divider, myEditor1.getComponent());
if (getEditor1() == null || getEditor2() == null) return;
Graphics2D gg = DiffDividerDrawUtil.getDividerGraphics(g, divider, getEditor1().getComponent());
gg.setColor(DiffDrawUtil.getDividerColor(myEditor1));
gg.setColor(DiffDrawUtil.getDividerColor(getEditor1()));
gg.fill(gg.getClipBounds());
//DividerPolygonUtil.paintSimplePolygons(gg, divider.getWidth(), myEditor1, myEditor2, this);
DiffDividerDrawUtil.paintPolygons(gg, divider.getWidth(), myEditor1, myEditor2, this);
//DividerPolygonUtil.paintSimplePolygons(gg, divider.getWidth(), getEditor1(), getEditor2(), this);
DiffDividerDrawUtil.paintPolygons(gg, divider.getWidth(), getEditor1(), getEditor2(), this);
if (myFoldingModel != null) myFoldingModel.paintOnDivider(gg, divider);
@@ -940,7 +940,7 @@ public class SimpleDiffViewer extends TwosideTextDiffViewer {
for (SimpleDiffChange diffChange : myDiffChanges) {
if (!handler.process(diffChange.getStartLine(Side.LEFT), diffChange.getEndLine(Side.LEFT),
diffChange.getStartLine(Side.RIGHT), diffChange.getEndLine(Side.RIGHT),
diffChange.getDiffType().getColor(myEditor1))) {
diffChange.getDiffType().getColor(getEditor1()))) {
return;
}
}
@@ -34,7 +34,7 @@ import java.util.List;
public class SimpleThreesideDiffChange {
@NotNull private final MergeLineFragment myFragment;
@NotNull private final List<EditorEx> myEditors;
@NotNull private final List<? extends EditorEx> myEditors;
@NotNull private ConflictType myType;
@@ -44,7 +44,7 @@ public class SimpleThreesideDiffChange {
private int[] myLineEndShifts = new int[3];
public SimpleThreesideDiffChange(@NotNull MergeLineFragment fragment,
@NotNull List<EditorEx> editors,
@NotNull List<? extends EditorEx> editors,
@NotNull ComparisonPolicy policy) {
myFragment = fragment;
myEditors = editors;
@@ -154,7 +154,7 @@ public class SimpleThreesideDiffChange {
@NotNull
private static ConflictType calcType(@NotNull MergeLineFragment fragment,
@NotNull List<EditorEx> editors,
@NotNull List<? extends EditorEx> editors,
@NotNull ComparisonPolicy policy) {
boolean isLeftEmpty = isIntervalEmpty(fragment, ThreeSide.LEFT);
boolean isBaseEmpty = isIntervalEmpty(fragment, ThreeSide.BASE);
@@ -192,7 +192,7 @@ public class SimpleThreesideDiffChange {
}
private static boolean compareLeftAndRight(@NotNull MergeLineFragment fragment,
@NotNull List<EditorEx> editors,
@NotNull List<? extends EditorEx> editors,
@NotNull ComparisonPolicy policy) {
CharSequence content1 = getRangeContent(fragment, editors, ThreeSide.LEFT);
CharSequence content2 = getRangeContent(fragment, editors, ThreeSide.RIGHT);
@@ -209,7 +209,7 @@ public class SimpleThreesideDiffChange {
}
private static boolean compareWithBase(@NotNull MergeLineFragment fragment,
@NotNull List<EditorEx> editors,
@NotNull List<? extends EditorEx> editors,
@NotNull ThreeSide side) {
CharSequence content1 = getRangeContent(fragment, editors, ThreeSide.BASE);
CharSequence content2 = getRangeContent(fragment, editors, side);
@@ -219,7 +219,7 @@ public class SimpleThreesideDiffChange {
@Nullable
private static CharSequence getRangeContent(@NotNull MergeLineFragment fragment,
@NotNull List<EditorEx> editors,
@NotNull List<? extends EditorEx> editors,
@NotNull ThreeSide side) {
DocumentEx document = side.select(editors).getDocument();
int line1 = fragment.getStartLine(side);
@@ -82,7 +82,7 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
mySyncScrollable2 = new MySyncScrollable(Side.RIGHT);
myPrevNextDifferenceIterable = new MyPrevNextDifferenceIterable();
myStatusPanel = new MyStatusPanel();
myFoldingModel = new MyFoldingModel(myEditors.toArray(new EditorEx[3]), this);
myFoldingModel = new MyFoldingModel(getEditors().toArray(new EditorEx[3]), this);
}
@Override
@@ -233,7 +233,7 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
clearDiffPresentation();
for (MergeLineFragment fragment : fragments) {
myDiffChanges.add(new SimpleThreesideDiffChange(fragment, myEditors, comparisonPolicy));
myDiffChanges.add(new SimpleThreesideDiffChange(fragment, getEditors(), comparisonPolicy));
}
myFoldingModel.install(fragments, myRequest, getFoldingModelSettings());
@@ -280,13 +280,13 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
if (myDiffChanges.isEmpty()) return;
ThreeSide side;
if (e.getDocument() == myEditors.get(0).getDocument()) {
if (e.getDocument() == getEditor(0).getDocument()) {
side = ThreeSide.LEFT;
}
else if (e.getDocument() == myEditors.get(1).getDocument()) {
else if (e.getDocument() == getEditor(1).getDocument()) {
side = ThreeSide.BASE;
}
else if (e.getDocument() == myEditors.get(2).getDocument()) {
else if (e.getDocument() == getEditor(2).getDocument()) {
side = ThreeSide.RIGHT;
}
else {
@@ -396,7 +396,7 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
@Nullable
@CalledInAwt
private SimpleThreesideDiffChange getSelectedChange(@NotNull ThreeSide side) {
EditorEx editor = side.select(myEditors);
EditorEx editor = side.select(getEditors());
int caretLine = editor.getCaretModel().getLogicalPosition().line;
@@ -554,7 +554,7 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
if (!helper.process(diffChange.getStartLine(left), diffChange.getStartLine(right))) return;
if (!helper.process(diffChange.getEndLine(left), diffChange.getEndLine(right))) return;
}
helper.process(left.select(myEditors).getDocument().getLineCount(), right.select(myEditors).getDocument().getLineCount());
helper.process(left.select(getEditors()).getDocument().getLineCount(), right.select(getEditors()).getDocument().getLineCount());
}
}
@@ -574,7 +574,7 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
if (!diffChange.getType().isChange(mySide)) continue;
if (!handler.process(diffChange.getStartLine(left), diffChange.getEndLine(left),
diffChange.getStartLine(right), diffChange.getEndLine(right),
diffChange.getDiffType().getColor(myEditors.get(0)))) {
diffChange.getDiffType().getColor(getEditor(0)))) {
return;
}
}
@@ -592,13 +592,13 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
@Override
public void paint(@NotNull Graphics g, @NotNull JComponent divider) {
Graphics2D gg = DiffDividerDrawUtil.getDividerGraphics(g, divider, myEditors.get(0).getComponent());
Graphics2D gg = DiffDividerDrawUtil.getDividerGraphics(g, divider, getEditor(0).getComponent());
gg.setColor(DiffDrawUtil.getDividerColor(myEditors.get(0)));
gg.setColor(DiffDrawUtil.getDividerColor(getEditor(0)));
gg.fill(gg.getClipBounds());
Editor editor1 = mySide.select(myEditors.get(0), myEditors.get(1));
Editor editor2 = mySide.select(myEditors.get(1), myEditors.get(2));
Editor editor1 = mySide.select(getEditor(0), getEditor(1));
Editor editor2 = mySide.select(getEditor(1), getEditor(2));
//DividerPolygonUtil.paintSimplePolygons(gg, divider.getWidth(), editor1, editor2, myPaintable);
DiffDividerDrawUtil.paintPolygons(gg, divider.getWidth(), editor1, editor2, myPaintable);
@@ -614,8 +614,8 @@ public class SimpleThreesideDiffViewer extends ThreesideTextDiffViewer {
@Override
public void call(Graphics g) {
EditorEx editor1 = myEditors.get(1);
EditorEx editor2 = myEditors.get(2);
EditorEx editor1 = getEditor(1);
EditorEx editor2 = getEditor(2);
int width = editor1.getScrollPane().getVerticalScrollBar().getWidth();
DiffDividerDrawUtil.paintPolygonsOnScrollbar((Graphics2D)g, width, editor1, editor2, myPaintable);
@@ -0,0 +1,188 @@
/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.diff.tools.util;
import com.intellij.diff.DiffContext;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.Side;
import com.intellij.diff.util.ThreeSide;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.fileEditor.FileEditor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.List;
public class FocusTrackerSupport<T> {
public static class TwosideFocusTrackerSupport {
@NotNull private Side myCurrentSide;
private final boolean myDumbMode;
@Nullable private final MyFocusListener myListener1;
@Nullable private final MyFocusListener myListener2;
public TwosideFocusTrackerSupport(@Nullable Editor editor1, @Nullable Editor editor2) {
this(getComponent(editor1), getComponent(editor2));
}
public TwosideFocusTrackerSupport(@Nullable FileEditor editor1, @Nullable FileEditor editor2) {
this(getComponent(editor1), getComponent(editor2));
}
public TwosideFocusTrackerSupport(@Nullable JComponent component1, @Nullable JComponent component2) {
assert component1 != null || component2 != null;
myCurrentSide = component2 != null ? Side.RIGHT : Side.LEFT;
myDumbMode = component1 == null || component2 == null;
if (!myDumbMode) {
myListener1 = new MyFocusListener(Side.LEFT);
component1.addFocusListener(myListener1);
myListener2 = new MyFocusListener(Side.RIGHT);
component2.addFocusListener(myListener2);
}
else {
myListener1 = null;
myListener2 = null;
}
}
@NotNull
public Side getCurrentSide() {
return myCurrentSide;
}
public void setCurrentSide(@NotNull Side side) {
if (myDumbMode) return;
myCurrentSide = side;
}
public void processContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) {
Side side = context.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE);
if (side != null) setCurrentSide(side);
}
public void updateContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) {
if (myDumbMode) return;
context.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide);
}
private class MyFocusListener extends FocusAdapter {
@NotNull private final Side mySide;
private MyFocusListener(@NotNull Side side) {
mySide = side;
}
public void focusGained(FocusEvent e) {
myCurrentSide = mySide;
}
}
}
public static class ThreesideFocusTrackerSupport {
@NotNull private ThreeSide myCurrentSide;
private final boolean myDumbMode;
@Nullable private final MyFocusListener myListener1;
@Nullable private final MyFocusListener myListener2;
@Nullable private final MyFocusListener myListener3;
public ThreesideFocusTrackerSupport(@NotNull List<? extends Editor> editors) {
this(editors.get(0), editors.get(1), editors.get(2));
}
public ThreesideFocusTrackerSupport(@Nullable Editor editor1, @Nullable Editor editor2, @Nullable Editor editor3) {
this(getComponent(editor1), getComponent(editor2), getComponent(editor3));
}
public ThreesideFocusTrackerSupport(@Nullable FileEditor editor1, @Nullable FileEditor editor2, @Nullable FileEditor editor3) {
this(getComponent(editor1), getComponent(editor2), getComponent(editor3));
}
public ThreesideFocusTrackerSupport(@Nullable JComponent component1, @Nullable JComponent component2, @Nullable JComponent component3) {
assert component1 != null || component2 != null || component3 != null;
myCurrentSide = component2 != null ? ThreeSide.BASE : component1 != null ? ThreeSide.LEFT : ThreeSide.RIGHT;
boolean c1 = component1 != null;
boolean c2 = component2 != null;
boolean c3 = component3 != null;
myDumbMode = (!c1 && !c2) || (!c1 && !c3) || (!c2 && !c3); // only one not-null element
if (!myDumbMode) {
myListener1 = component1 != null ? new MyFocusListener(ThreeSide.LEFT) : null;
if (component1 != null) component1.addFocusListener(myListener1);
myListener2 = component2 != null ? new MyFocusListener(ThreeSide.BASE) : null;
if (component2 != null) component2.addFocusListener(myListener2);
myListener3 = component3 != null ? new MyFocusListener(ThreeSide.RIGHT) : null;
if (component3 != null) component3.addFocusListener(myListener3);
}
else {
myListener1 = null;
myListener2 = null;
myListener3 = null;
}
}
@NotNull
public ThreeSide getCurrentSide() {
return myCurrentSide;
}
public void setCurrentSide(@NotNull ThreeSide side) {
if (myDumbMode || side.select(myListener1, myListener2, myListener3) == null) return;
myCurrentSide = side;
}
public void processContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) {
ThreeSide side = context.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE);
if (side != null) setCurrentSide(side);
}
public void updateContextHints(@NotNull DiffRequest request, @NotNull DiffContext context) {
if (myDumbMode) return;
context.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE, myCurrentSide);
}
private class MyFocusListener extends FocusAdapter {
@NotNull private final ThreeSide mySide;
private MyFocusListener(@NotNull ThreeSide side) {
mySide = side;
}
public void focusGained(FocusEvent e) {
myCurrentSide = mySide;
}
}
}
@Nullable
private static JComponent getComponent(@Nullable Editor editor) {
return editor != null ? editor.getContentComponent() : null;
}
@Nullable
private static JComponent getComponent(@Nullable FileEditor editor) {
return editor != null ? editor.getComponent() : null;
}
}
@@ -24,12 +24,12 @@ import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.requests.SimpleDiffRequest;
import com.intellij.diff.tools.util.DiffDataKeys;
import com.intellij.diff.tools.util.FocusTrackerSupport.ThreesideFocusTrackerSupport;
import com.intellij.diff.tools.util.SimpleDiffPanel;
import com.intellij.diff.tools.util.SyncScrollSupport;
import com.intellij.diff.tools.util.SyncScrollSupport.ThreesideSyncScrollSupport;
import com.intellij.diff.tools.util.base.InitialScrollPositionSupport;
import com.intellij.diff.tools.util.base.TextDiffViewerBase;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.DiffUtil;
import com.intellij.diff.util.Side;
import com.intellij.diff.util.ThreeSide;
@@ -55,8 +55,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.ArrayList;
import java.util.List;
@@ -68,22 +66,17 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@NotNull protected final SimpleDiffPanel myPanel;
@NotNull protected final ThreesideTextContentPanel myContentPanel;
@NotNull protected final List<EditorEx> myEditors;
@NotNull private final List<EditorEx> myEditors;
@NotNull private final List<DocumentContent> myActualContents;
@NotNull protected final List<DocumentContent> myActualContents;
@NotNull private final List<MyEditorFocusListener> myEditorFocusListeners =
ContainerUtil.newArrayList(new MyEditorFocusListener(ThreeSide.LEFT),
new MyEditorFocusListener(ThreeSide.BASE),
new MyEditorFocusListener(ThreeSide.RIGHT));
@NotNull private final MyVisibleAreaListener myVisibleAreaListener1 = new MyVisibleAreaListener(Side.LEFT);
@NotNull private final MyVisibleAreaListener myVisibleAreaListener2 = new MyVisibleAreaListener(Side.RIGHT);
@NotNull protected final MySetEditorSettingsAction myEditorSettingsAction;
@Nullable private ThreesideSyncScrollSupport mySyncScrollListener;
@NotNull private final ThreesideFocusTrackerSupport myFocusTrackerSupport;
@NotNull private ThreeSide myCurrentSide;
@Nullable private ThreesideSyncScrollSupport mySyncScrollSupport;
public ThreesideTextDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) {
super(context, request);
@@ -95,11 +88,10 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
myEditors = createEditors();
List<JComponent> titlePanel = DiffUtil.createTextTitles(myRequest, myEditors);
List<JComponent> titlePanel = DiffUtil.createTextTitles(myRequest, getEditors());
myCurrentSide = ThreeSide.BASE;
myContentPanel = new ThreesideTextContentPanel(myEditors, titlePanel);
myFocusTrackerSupport = new ThreesideFocusTrackerSupport(getEditors());
myContentPanel = new ThreesideTextContentPanel(getEditors(), titlePanel);
myPanel = new SimpleDiffPanel(myContentPanel, this, context);
@@ -121,15 +113,14 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@CalledInAwt
protected void processContextHints() {
super.processContextHints();
ThreeSide side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE);
if (side != null) myCurrentSide = side;
myFocusTrackerSupport.processContextHints(myRequest, myContext);
}
@Override
@CalledInAwt
protected void updateContextHints() {
super.updateContextHints();
myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_THREESIDE, myCurrentSide);
myFocusTrackerSupport.updateContextHints(myRequest, myContext);
}
@NotNull
@@ -137,8 +128,8 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
boolean[] forceReadOnly = checkForceReadOnly();
List<EditorEx> editors = new ArrayList<EditorEx>(3);
for (int i = 0; i < myActualContents.size(); i++) {
DocumentContent content = myActualContents.get(i);
for (int i = 0; i < getActualContents().size(); i++) {
DocumentContent content = getActualContents().get(i);
EditorEx editor = DiffUtil.createEditor(content.getDocument(), myProject, forceReadOnly[i], true);
DiffUtil.configureEditor(editor, content, myProject);
editors.add(editor);
@@ -155,7 +146,7 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
}
private void destroyEditors() {
for (EditorEx editor : myEditors) {
for (EditorEx editor : getEditors()) {
myEditorFactory.releaseEditor(editor);
}
}
@@ -168,20 +159,17 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@Override
protected void installEditorListeners() {
super.installEditorListeners();
for (int i = 0; i < 3; i++) {
myEditors.get(i).getContentComponent().addFocusListener(myEditorFocusListeners.get(i));
}
myEditors.get(0).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1);
myEditors.get(1).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1);
getEditor(0).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1);
getEditor(1).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener1);
myEditors.get(1).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener2);
myEditors.get(2).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener2);
getEditor(1).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener2);
getEditor(2).getScrollingModel().addVisibleAreaListener(myVisibleAreaListener2);
SyncScrollSupport.SyncScrollable scrollable1 = getSyncScrollable(Side.LEFT);
SyncScrollSupport.SyncScrollable scrollable2 = getSyncScrollable(Side.RIGHT);
if (scrollable1 != null && scrollable2 != null) {
mySyncScrollListener = new ThreesideSyncScrollSupport(myEditors, scrollable1, scrollable2);
mySyncScrollSupport = new ThreesideSyncScrollSupport(getEditors(), scrollable1, scrollable2);
}
}
@@ -190,22 +178,18 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
public void destroyEditorListeners() {
super.destroyEditorListeners();
for (int i = 0; i < 3; i++) {
myEditors.get(i).getContentComponent().removeFocusListener(myEditorFocusListeners.get(i));
}
getEditor(0).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1);
getEditor(1).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1);
myEditors.get(0).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1);
myEditors.get(1).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener1);
getEditor(1).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener2);
getEditor(2).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener2);
myEditors.get(1).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener2);
myEditors.get(2).getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener2);
mySyncScrollListener = null;
mySyncScrollSupport = null;
}
protected void disableSyncScrollSupport(boolean disable) {
if (mySyncScrollListener != null) {
mySyncScrollListener.setDisabled(disable);
if (mySyncScrollSupport != null) {
mySyncScrollSupport.setDisabled(disable);
}
}
@@ -238,12 +222,12 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@NotNull
public EditorEx getCurrentEditor() {
return myCurrentSide.select(myEditors);
return getCurrentSide().select(getEditors());
}
@NotNull
public DocumentContent getCurrentContent() {
return myCurrentSide.select(myActualContents);
return getCurrentSide().select(getActualContents());
}
@NotNull
@@ -252,9 +236,23 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
return myEditors;
}
@NotNull
protected EditorEx getEditor(int index) {
return myEditors.get(index);
}
@NotNull
public List<DocumentContent> getActualContents() {
return myActualContents;
}
@NotNull
public ThreeSide getCurrentSide() {
return myCurrentSide;
return myFocusTrackerSupport.getCurrentSide();
}
public void setCurrentSide(@NotNull ThreeSide side) {
myFocusTrackerSupport.setCurrentSide(side);
}
//
@@ -263,9 +261,9 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@CalledInAwt
protected void scrollToLine(@NotNull ThreeSide side, int line) {
Editor editor = side.select(myEditors);
Editor editor = side.select(getEditors());
DiffUtil.scrollEditor(editor, line, false);
myCurrentSide = side;
setCurrentSide(side);
}
@Nullable
@@ -365,26 +363,14 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
return getCurrentEditor();
}
else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) {
return DiffUtil.getVirtualFile(myRequest, myCurrentSide);
return DiffUtil.getVirtualFile(myRequest, getCurrentSide());
}
else if (DiffDataKeys.CURRENT_CONTENT.is(dataId)) {
return getCurrentContent();
}
return super.getData(dataId);
}
private class MyEditorFocusListener extends FocusAdapter {
@NotNull private final ThreeSide mySide;
private MyEditorFocusListener(@NotNull ThreeSide side) {
mySide = side;
}
public void focusGained(FocusEvent e) {
myCurrentSide = mySide;
}
}
private class MyVisibleAreaListener implements VisibleAreaListener {
@NotNull Side mySide;
@@ -394,7 +380,7 @@ public abstract class ThreesideTextDiffViewer extends TextDiffViewerBase {
@Override
public void visibleAreaChanged(VisibleAreaEvent e) {
if (mySyncScrollListener != null) mySyncScrollListener.visibleAreaChanged(e);
if (mySyncScrollSupport != null) mySyncScrollSupport.visibleAreaChanged(e);
if (Registry.is("diff.divider.repainting.fix")) {
myContentPanel.repaint();
}
@@ -24,12 +24,12 @@ import com.intellij.diff.contents.EmptyContent;
import com.intellij.diff.requests.ContentDiffRequest;
import com.intellij.diff.requests.DiffRequest;
import com.intellij.diff.tools.util.DiffDataKeys;
import com.intellij.diff.tools.util.FocusTrackerSupport.TwosideFocusTrackerSupport;
import com.intellij.diff.tools.util.SimpleDiffPanel;
import com.intellij.diff.tools.util.SyncScrollSupport;
import com.intellij.diff.tools.util.SyncScrollSupport.TwosideSyncScrollSupport;
import com.intellij.diff.tools.util.base.InitialScrollPositionSupport;
import com.intellij.diff.tools.util.base.TextDiffViewerBase;
import com.intellij.diff.util.DiffUserDataKeys;
import com.intellij.diff.util.DiffUtil;
import com.intellij.diff.util.Side;
import com.intellij.openapi.actionSystem.AnActionEvent;
@@ -52,8 +52,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.util.Collections;
import java.util.List;
@@ -65,21 +63,19 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@NotNull protected final SimpleDiffPanel myPanel;
@NotNull protected final TwosideTextContentPanel myContentPanel;
@Nullable protected final EditorEx myEditor1;
@Nullable protected final EditorEx myEditor2;
@Nullable private final EditorEx myEditor1;
@Nullable private final EditorEx myEditor2;
@Nullable protected final DocumentContent myActualContent1;
@Nullable protected final DocumentContent myActualContent2;
@Nullable private final DocumentContent myActualContent1;
@Nullable private final DocumentContent myActualContent2;
@NotNull protected final MySetEditorSettingsAction myEditorSettingsAction;
@NotNull private final MyEditorFocusListener myEditorFocusListener1 = new MyEditorFocusListener(Side.LEFT);
@NotNull private final MyEditorFocusListener myEditorFocusListener2 = new MyEditorFocusListener(Side.RIGHT);
@NotNull private final MyVisibleAreaListener myVisibleAreaListener = new MyVisibleAreaListener();
@Nullable protected TwosideSyncScrollSupport mySyncScrollSupport;
@NotNull private final TwosideFocusTrackerSupport myFocusTrackerSupport;
@NotNull private Side myCurrentSide;
@Nullable protected TwosideSyncScrollSupport mySyncScrollSupport;
public TwosideTextDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) {
super(context, request);
@@ -97,9 +93,8 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
myEditor2 = editors.get(1);
assert myEditor1 != null || myEditor2 != null;
myCurrentSide = myEditor1 == null ? Side.RIGHT : Side.LEFT;
myContentPanel = new TwosideTextContentPanel(titlePanel, myEditor1, myEditor2);
myFocusTrackerSupport = new TwosideFocusTrackerSupport(getEditor1(), getEditor2());
myContentPanel = new TwosideTextContentPanel(titlePanel, getEditor1(), getEditor2());
myPanel = new SimpleDiffPanel(myContentPanel, this, context);
@@ -124,25 +119,14 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@CalledInAwt
protected void processContextHints() {
super.processContextHints();
if (myEditor1 == null) {
myCurrentSide = Side.RIGHT;
}
else if (myEditor2 == null) {
myCurrentSide = Side.LEFT;
}
else {
Side side = myContext.getUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE);
if (side != null) myCurrentSide = side;
}
myFocusTrackerSupport.processContextHints(myRequest, myContext);
}
@Override
@CalledInAwt
protected void updateContextHints() {
super.updateContextHints();
if (myEditor1 != null && myEditor2 != null) {
myContext.putUserData(DiffUserDataKeys.PREFERRED_FOCUS_SIDE, myCurrentSide);
}
myFocusTrackerSupport.updateContextHints(myRequest, myContext);
}
@NotNull
@@ -152,13 +136,13 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
// TODO: we may want to set editor highlighter in init() to speedup editor initialization
EditorEx editor1 = null;
EditorEx editor2 = null;
if (myActualContent1 != null) {
editor1 = DiffUtil.createEditor(myActualContent1.getDocument(), myProject, forceReadOnly[0], true);
DiffUtil.configureEditor(editor1, myActualContent1, myProject);
if (getActualContent1() != null) {
editor1 = DiffUtil.createEditor(getActualContent1().getDocument(), myProject, forceReadOnly[0], true);
DiffUtil.configureEditor(editor1, getActualContent1(), myProject);
}
if (myActualContent2 != null) {
editor2 = DiffUtil.createEditor(myActualContent2.getDocument(), myProject, forceReadOnly[1], true);
DiffUtil.configureEditor(editor2, myActualContent2, myProject);
if (getActualContent2() != null) {
editor2 = DiffUtil.createEditor(getActualContent2().getDocument(), myProject, forceReadOnly[1], true);
DiffUtil.configureEditor(editor2, getActualContent2(), myProject);
}
if (editor1 != null && editor2 != null) {
editor1.setVerticalScrollbarOrientation(EditorEx.VERTICAL_SCROLLBAR_LEFT);
@@ -186,26 +170,24 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
//
private void destroyEditors() {
if (myEditor1 != null) myEditorFactory.releaseEditor(myEditor1);
if (myEditor2 != null) myEditorFactory.releaseEditor(myEditor2);
if (getEditor1() != null) myEditorFactory.releaseEditor(getEditor1());
if (getEditor2() != null) myEditorFactory.releaseEditor(getEditor2());
}
@CalledInAwt
@Override
protected void installEditorListeners() {
super.installEditorListeners();
if (myEditor1 != null) {
myEditor1.getContentComponent().addFocusListener(myEditorFocusListener1);
myEditor1.getScrollingModel().addVisibleAreaListener(myVisibleAreaListener);
if (getEditor1() != null) {
getEditor1().getScrollingModel().addVisibleAreaListener(myVisibleAreaListener);
}
if (myEditor2 != null) {
myEditor2.getContentComponent().addFocusListener(myEditorFocusListener2);
myEditor2.getScrollingModel().addVisibleAreaListener(myVisibleAreaListener);
if (getEditor2() != null) {
getEditor2().getScrollingModel().addVisibleAreaListener(myVisibleAreaListener);
}
if (myEditor1 != null && myEditor2 != null) {
if (getEditor1() != null && getEditor2() != null) {
SyncScrollSupport.SyncScrollable scrollable = getSyncScrollable();
if (scrollable != null) {
mySyncScrollSupport = new TwosideSyncScrollSupport(myEditor1, myEditor2, scrollable);
mySyncScrollSupport = new TwosideSyncScrollSupport(getEditor1(), getEditor2(), scrollable);
}
}
}
@@ -214,13 +196,11 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@Override
protected void destroyEditorListeners() {
super.destroyEditorListeners();
if (myEditor1 != null) {
myEditor1.getContentComponent().removeFocusListener(myEditorFocusListener1);
myEditor1.getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener);
if (getEditor1() != null) {
getEditor1().getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener);
}
if (myEditor2 != null) {
myEditor2.getContentComponent().removeFocusListener(myEditorFocusListener2);
myEditor2.getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener);
if (getEditor2() != null) {
getEditor2().getScrollingModel().removeVisibleAreaListener(myVisibleAreaListener);
}
mySyncScrollSupport = null;
}
@@ -238,14 +218,14 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@NotNull
@Override
protected List<? extends EditorEx> getEditors() {
if (myEditor1 != null && myEditor2 != null) {
return ContainerUtil.list(myEditor1, myEditor2);
if (getEditor1() != null && getEditor2() != null) {
return ContainerUtil.list(getEditor1(), getEditor2());
}
if (myEditor1 != null) {
return Collections.singletonList(myEditor1);
if (getEditor1() != null) {
return Collections.singletonList(getEditor1());
}
if (myEditor2 != null) {
return Collections.singletonList(myEditor2);
if (getEditor2() != null) {
return Collections.singletonList(getEditor2());
}
return Collections.emptyList();
}
@@ -264,19 +244,23 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@NotNull
public Side getCurrentSide() {
return myCurrentSide;
return myFocusTrackerSupport.getCurrentSide();
}
public void setCurrentSide(@NotNull Side side) {
myFocusTrackerSupport.setCurrentSide(side);
}
@NotNull
public EditorEx getCurrentEditor() {
//noinspection ConstantConditions
return getCurrentSide().select(myEditor1, myEditor2);
return getCurrentSide().select(getEditor1(), getEditor2());
}
@NotNull
public DocumentContent getCurrentContent() {
//noinspection ConstantConditions
return getCurrentSide().select(myActualContent1, myActualContent2);
return getCurrentSide().select(getActualContent1(), getActualContent2());
}
@Nullable
@@ -289,6 +273,16 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
return myEditor2;
}
@Nullable
public DocumentContent getActualContent1() {
return myActualContent1;
}
@Nullable
public DocumentContent getActualContent2() {
return myActualContent2;
}
//
// Abstract
//
@@ -303,10 +297,10 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@CalledInAwt
protected void scrollToLine(@NotNull Side side, int line) {
Editor editor = side.select(myEditor1, myEditor2);
Editor editor = side.select(getEditor1(), getEditor2());
if (editor == null) return;
DiffUtil.scrollEditor(editor, line, false);
myCurrentSide = side;
setCurrentSide(side);
}
@Nullable
@@ -362,16 +356,16 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
@Override
public void actionPerformed(@NotNull AnActionEvent e) {
if (myEditor1 == null || myEditor2 == null) return;
if (getEditor1() == null || getEditor2() == null) return;
if (myScrollToPosition) {
EditorEx currentEditor = myCurrentSide.select(myEditor1, myEditor2);
EditorEx targetEditor = myCurrentSide.other().select(myEditor1, myEditor2);
LogicalPosition position = transferPosition(myCurrentSide, currentEditor.getCaretModel().getLogicalPosition());
EditorEx currentEditor = getCurrentSide().select(getEditor1(), getEditor2());
EditorEx targetEditor = getCurrentSide().other().select(getEditor1(), getEditor2());
LogicalPosition position = transferPosition(getCurrentSide(), currentEditor.getCaretModel().getLogicalPosition());
targetEditor.getCaretModel().moveToLogicalPosition(position);
}
myCurrentSide = myCurrentSide.other();
setCurrentSide(getCurrentSide().other());
myPanel.requestFocus();
getCurrentEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
}
@@ -380,10 +374,10 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
private class MyOpenInEditorWithMouseAction extends OpenInEditorWithMouseAction {
@Override
protected OpenFileDescriptor getDescriptor(@NotNull Editor editor, int line) {
if (editor != myEditor1 && editor != myEditor2) return null;
Side side = Side.fromLeft(editor == myEditor1);
if (editor != getEditor1() && editor != getEditor2()) return null;
Side side = Side.fromLeft(editor == getEditor1());
DocumentContent content = side.select(myActualContent1, myActualContent2);
DocumentContent content = side.select(getActualContent1(), getActualContent2());
if (content == null) return null;
int offset = editor.logicalPositionToOffset(new LogicalPosition(line, 0));
@@ -406,25 +400,12 @@ public abstract class TwosideTextDiffViewer extends TextDiffViewerBase {
return getCurrentContent();
}
else if (CommonDataKeys.VIRTUAL_FILE.is(dataId)) {
return DiffUtil.getVirtualFile(myRequest, myCurrentSide);
return DiffUtil.getVirtualFile(myRequest, getCurrentSide());
}
return super.getData(dataId);
}
private class MyEditorFocusListener extends FocusAdapter {
@NotNull private final Side mySide;
private MyEditorFocusListener(@NotNull Side side) {
mySide = side;
}
public void focusGained(FocusEvent e) {
if (myEditor1 == null || myEditor2 == null) return;
myCurrentSide = mySide;
}
}
private class MyVisibleAreaListener implements VisibleAreaListener {
@Override
public void visibleAreaChanged(VisibleAreaEvent e) {
@@ -69,7 +69,7 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
myWrapperRequest = request;
myDiffChanges = diffChanges;
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
for (EditorEx editor : getEditors()) {
EditorSettings settings = editor.getSettings();
@@ -90,8 +90,8 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
}
for (DiffChange change : myDiffChanges) {
DiffDrawUtil.createBorderLineMarker(myEditor1, change.myEndLine1, SeparatorPlacement.TOP);
DiffDrawUtil.createBorderLineMarker(myEditor2, change.myEndLine2, SeparatorPlacement.TOP);
DiffDrawUtil.createBorderLineMarker(getEditor1(), change.myEndLine1, SeparatorPlacement.TOP);
DiffDrawUtil.createBorderLineMarker(getEditor2(), change.myEndLine2, SeparatorPlacement.TOP);
}
DiffSplitter splitter = myContentPanel.getSplitter();
@@ -146,10 +146,10 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
return new Runnable() {
@Override
public void run() {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
for (DiffChange change : myDiffChanges) {
setupHighlighting(myEditor1, change, Side.LEFT);
setupHighlighting(myEditor2, change, Side.RIGHT);
setupHighlighting(getEditor1(), change, Side.LEFT);
setupHighlighting(getEditor2(), change, Side.RIGHT);
}
}
};
@@ -205,7 +205,7 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
@Override
public void paint(@NotNull Graphics g, @NotNull JComponent divider) {
assert myEditor1 != null && myEditor2 != null;
assert getEditor1() != null && getEditor2() != null;
Graphics2D gg = DiffDividerDrawUtil.getDividerGraphics(g, divider, getEditor1().getComponent());
Rectangle clip = gg.getClipBounds();
if (clip == null) return;
@@ -213,23 +213,23 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
gg.setColor(DiffDrawUtil.getDividerColor());
gg.fill(clip);
JComponent header1 = myEditor1.getHeaderComponent();
JComponent header2 = myEditor2.getHeaderComponent();
JComponent header1 = getEditor1().getHeaderComponent();
JComponent header2 = getEditor2().getHeaderComponent();
int headerOffset1 = header1 == null ? 0 : header1.getHeight();
int headerOffset2 = header2 == null ? 0 : header2.getHeight();
// TODO: painting is ugly if shift1 != shift2 (ex: search field is opened for one of editors)
int shift1 = myEditor1.getScrollingModel().getVerticalScrollOffset() - headerOffset1;
int shift2 = myEditor2.getScrollingModel().getVerticalScrollOffset() - headerOffset2;
int shift1 = getEditor1().getScrollingModel().getVerticalScrollOffset() - headerOffset1;
int shift2 = getEditor2().getScrollingModel().getVerticalScrollOffset() - headerOffset2;
double rotate = shift1 == shift2 ? 0 : Math.atan2(shift2 - shift1, clip.width);
DiffDividerDrawUtil.paintPolygons(gg, divider.getWidth(), false, rotate == 0, myEditor1, myEditor2, this);
DiffDividerDrawUtil.paintPolygons(gg, divider.getWidth(), false, rotate == 0, getEditor1(), getEditor2(), this);
for (DiffChange change : myDiffChanges) {
int y1 = myEditor1.logicalPositionToXY(new LogicalPosition(change.getStartLine(Side.LEFT), 0)).y - shift1;
int y2 = myEditor2.logicalPositionToXY(new LogicalPosition(change.getStartLine(Side.RIGHT), 0)).y - shift2;
int endY1 = myEditor1.logicalPositionToXY(new LogicalPosition(change.getEndLine(Side.LEFT), 0)).y - shift1;
int endY2 = myEditor2.logicalPositionToXY(new LogicalPosition(change.getEndLine(Side.RIGHT), 0)).y - shift2;
int y1 = getEditor1().logicalPositionToXY(new LogicalPosition(change.getStartLine(Side.LEFT), 0)).y - shift1;
int y2 = getEditor2().logicalPositionToXY(new LogicalPosition(change.getStartLine(Side.RIGHT), 0)).y - shift2;
int endY1 = getEditor1().logicalPositionToXY(new LogicalPosition(change.getEndLine(Side.LEFT), 0)).y - shift1;
int endY2 = getEditor2().logicalPositionToXY(new LogicalPosition(change.getEndLine(Side.RIGHT), 0)).y - shift2;
AffineTransform oldTransform = gg.getTransform();
gg.translate(0, y1);
@@ -261,7 +261,7 @@ public class SvnPropertiesDiffViewer extends TwosideTextDiffViewer {
for (LineFragment fragment : diffChange.getFragments()) {
if (!handler.process(Side.LEFT.getStartLine(fragment) + shift1, Side.LEFT.getEndLine(fragment) + shift1,
Side.RIGHT.getStartLine(fragment) + shift2, Side.RIGHT.getEndLine(fragment) + shift2,
DiffUtil.getLineDiffType(fragment).getColor(myEditor1))) {
DiffUtil.getLineDiffType(fragment).getColor(getEditor1()))) {
return;
}
}