dir-diff: open API for other DiffTool impls; cleanup

This commit is contained in:
Gregory.Shrago
2017-08-25 07:57:16 +03:00
parent ab942bd988
commit 0024a3aeb3
4 changed files with 52 additions and 34 deletions
@@ -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);
@@ -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);
}
}
@@ -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<DiffContent> 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);
});
@@ -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) {