From 0024a3aeb328f64545fe68fe11d5fdeacd6d92a7 Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Fri, 25 Aug 2017 07:27:41 +0300 Subject: [PATCH] dir-diff: open API for other DiffTool impls; cleanup --- .../intellij/diff/impl/DiffWindowBase.java | 4 +-- .../intellij/diff/tools/dir/DirDiffTool.java | 22 ++++++++++++- .../diff/tools/dir/DirDiffViewer.java | 33 ++++++++++--------- .../openapi/diff/impl/dir/DirDiffPanel.java | 27 ++++++++------- 4 files changed, 52 insertions(+), 34 deletions(-) diff --git a/platform/diff-impl/src/com/intellij/diff/impl/DiffWindowBase.java b/platform/diff-impl/src/com/intellij/diff/impl/DiffWindowBase.java index 2618a34113de..47976678057f 100644 --- a/platform/diff-impl/src/com/intellij/diff/impl/DiffWindowBase.java +++ b/platform/diff-impl/src/com/intellij/diff/impl/DiffWindowBase.java @@ -53,9 +53,7 @@ public abstract class DiffWindowBase { .setParent(myHints.getParent()) .setDimensionServiceKey(dialogGroupKey) .setPreferredFocusedComponent(() -> myProcessor.getPreferredFocusedComponent()) - .setOnShowCallback(() -> { - myProcessor.updateRequest(); - }) + .setOnShowCallback(() -> myProcessor.updateRequest()) .build(); myWrapper.setImages(DiffUtil.DIFF_FRAME_ICONS); Disposer.register(myWrapper, myProcessor); diff --git a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffTool.java b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffTool.java index 48ab915e62d3..ce943d1e8a4c 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffTool.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffTool.java @@ -19,7 +19,11 @@ import com.intellij.diff.DiffContext; import com.intellij.diff.FrameDiffTool; import com.intellij.diff.requests.ContentDiffRequest; import com.intellij.diff.requests.DiffRequest; +import com.intellij.ide.diff.DiffElement; +import com.intellij.ide.diff.DirDiffSettings; +import com.intellij.internal.statistic.UsageTrigger; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class DirDiffTool implements FrameDiffTool { public static final DirDiffTool INSTANCE = new DirDiffTool(); @@ -27,7 +31,8 @@ public class DirDiffTool implements FrameDiffTool { @NotNull @Override public DiffViewer createComponent(@NotNull DiffContext context, @NotNull DiffRequest request) { - return new DirDiffViewer(context, (ContentDiffRequest)request); + UsageTrigger.trigger("diff.DirDiffViewer"); + return createViewer(context, (ContentDiffRequest)request); } @Override @@ -40,4 +45,19 @@ public class DirDiffTool implements FrameDiffTool { public String getName() { return "Directory viewer"; } + + @NotNull + public static FrameDiffTool.DiffViewer createViewer(@NotNull DiffContext context, + @NotNull ContentDiffRequest request) { + return new DirDiffViewer(context, request); + } + + @NotNull + public static FrameDiffTool.DiffViewer createViewer(@NotNull DiffContext context, + @NotNull DiffElement element1, + @NotNull DiffElement element2, + @NotNull DirDiffSettings settings, + @Nullable String helpID) { + return new DirDiffViewer(context, element1, element2, settings, helpID); + } } diff --git a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java index f48c2bd4f986..2ab578fe67d3 100644 --- a/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java +++ b/platform/diff-impl/src/com/intellij/diff/tools/dir/DirDiffViewer.java @@ -30,7 +30,6 @@ import com.intellij.ide.diff.DirDiffSettings; import com.intellij.ide.diff.JarFileDiffElement; import com.intellij.ide.diff.VirtualFileDiffElement; import com.intellij.ide.highlighter.ArchiveFileType; -import com.intellij.internal.statistic.UsageTrigger; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.actionSystem.PlatformDataKeys; @@ -51,26 +50,28 @@ import java.util.Collections; import java.util.List; class DirDiffViewer implements FrameDiffTool.DiffViewer { - @NotNull private final DiffContext myContext; - @NotNull private final ContentDiffRequest myRequest; - @NotNull private final DirDiffPanel myDirDiffPanel; - @NotNull private final JPanel myPanel; + private final DirDiffPanel myDirDiffPanel; + private final JPanel myPanel; + private final String myHelpID; - public DirDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) { - UsageTrigger.trigger("diff.DirDiffViewer"); + DirDiffViewer(@NotNull DiffContext context, @NotNull ContentDiffRequest request) { + this(context, + createDiffElement(request.getContents().get(0)), + createDiffElement(request.getContents().get(1)), + ObjectUtils.notNull(context.getUserData(DirDiffSettings.KEY), new DirDiffSettings()), + "reference.dialogs.diff.folder"); + } - myContext = context; - myRequest = request; - - List contents = request.getContents(); - DiffElement element1 = createDiffElement(contents.get(0)); - DiffElement element2 = createDiffElement(contents.get(1)); + DirDiffViewer(@NotNull DiffContext context, + @NotNull DiffElement element1, + @NotNull DiffElement element2, + @NotNull DirDiffSettings settings, + @Nullable String helpID) { + myHelpID = helpID; Project project = context.getProject(); if (project == null) project = DefaultProjectFactory.getInstance().getDefaultProject(); - - DirDiffSettings settings = ObjectUtils.notNull(context.getUserData(DirDiffSettings.KEY), new DirDiffSettings()); DirDiffTableModel model = new DirDiffTableModel(project, element1, element2, settings); myDirDiffPanel = new DirDiffPanel(model, new DirDiffWindow() { @@ -90,7 +91,7 @@ class DirDiffViewer implements FrameDiffTool.DiffViewer { myPanel.add(myDirDiffPanel.getPanel(), BorderLayout.CENTER); DataManager.registerDataProvider(myPanel, dataId -> { if (PlatformDataKeys.HELP_ID.is(dataId)) { - return "reference.dialogs.diff.folder"; + return myHelpID; } return myDirDiffPanel.getData(dataId); }); diff --git a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java index 1dfa189b2039..b0c889099e6c 100644 --- a/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java +++ b/platform/diff-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java @@ -30,7 +30,6 @@ import com.intellij.ide.diff.DiffElement; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.*; -import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diff.impl.dir.actions.DirDiffToolbarActions; import com.intellij.openapi.diff.impl.dir.actions.RefreshDirDiffAction; import com.intellij.openapi.keymap.KeymapUtil; @@ -79,10 +78,10 @@ import static com.intellij.util.ArrayUtil.toObjectArray; */ @SuppressWarnings({"unchecked"}) public class DirDiffPanel implements Disposable, DataProvider { - private static final Logger LOG = Logger.getInstance(DirDiffPanel.class); - public static final String DIVIDER_PROPERTY = "dir.diff.panel.divider.location"; + private static final int DIVIDER_PROPERTY_DEFAULT_VALUE = 200; + private JPanel myDiffPanel; private JBTable myTable; private JPanel myComponent; @@ -130,21 +129,22 @@ public class DirDiffPanel implements Disposable, DataProvider { myTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { - final int lastIndex = e.getLastIndex(); - final int firstIndex = e.getFirstIndex(); - final DirDiffElementImpl last = myModel.getElementAt(lastIndex); - final DirDiffElementImpl first = myModel.getElementAt(firstIndex); + ListSelectionModel selectionModel = (ListSelectionModel)e.getSource(); + int lastIndex = e.getLastIndex(); + int firstIndex = e.getFirstIndex(); + DirDiffElementImpl last = myModel.getElementAt(lastIndex); + DirDiffElementImpl first = myModel.getElementAt(firstIndex); if (last == null || first == null) { update(false); return; } - if (last.isSeparator()) { - final int ind = lastIndex + ((lastIndex < firstIndex) ? 1 : -1); - myTable.getSelectionModel().addSelectionInterval(ind, ind); + if (last.isSeparator() && selectionModel.isSelectedIndex(lastIndex)) { + int ind = lastIndex + ((lastIndex < firstIndex) ? 1 : -1); + selectionModel.addSelectionInterval(ind, ind); } - else if (first.isSeparator()) { - final int ind = firstIndex + ((firstIndex < lastIndex) ? 1 : -1); - myTable.getSelectionModel().addSelectionInterval(ind, ind); + if (first.isSeparator() && selectionModel.isSelectedIndex(firstIndex)) { + int ind = firstIndex + ((firstIndex < lastIndex) ? 1 : -1); + selectionModel.addSelectionInterval(ind, ind); } else { update(false); @@ -153,7 +153,6 @@ public class DirDiffPanel implements Disposable, DataProvider { } }); if (model.isOperationsEnabled()) { - new AnAction("Change diff operation") { @Override public void actionPerformed(AnActionEvent e) {