From 0532e2e1a8ad57653681401e1e48647bb891c8cc Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Tue, 19 Apr 2011 01:41:32 +0400 Subject: [PATCH] make filters work --- .../openapi/diff/impl/dir/DirDiffDialog.java | 1 + .../openapi/diff/impl/dir/DirDiffElement.java | 7 +++++-- .../diff/impl/dir/DirDiffOperation.java | 3 ++- .../openapi/diff/impl/dir/DirDiffPanel.java | 1 + .../diff/impl/dir/DirDiffTableModel.java | 19 ++++++++++++++++++- .../diff/impl/dir/actions/DirDiffAction.java | 15 +++++++++++++++ .../diff/impl/dir/actions/EnableEqual.java | 3 +-- .../diff/impl/dir/actions/EnableLeft.java | 3 +-- .../diff/impl/dir/actions/EnableNotEqual.java | 3 +-- .../diff/impl/dir/actions/EnableRight.java | 3 +-- .../dir/actions/RefreshDirDiffAction.java | 3 +-- 11 files changed, 47 insertions(+), 14 deletions(-) diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffDialog.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffDialog.java index c75e55e6772b..7649e0c52844 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffDialog.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffDialog.java @@ -32,6 +32,7 @@ public class DirDiffDialog extends DialogWrapper { public DirDiffDialog(Project project, DirDiffTableModel model, DirDiffSettings settings) { super(project); + setModal(false); myModel = model; mySettings = settings; setSize(600, 600); diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java index 3a43ea6baa62..69b6a6ea172e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffElement.java @@ -50,6 +50,9 @@ public class DirDiffElement { else if (isTarget()) { myOperation = DirDiffOperation.COPY_FROM; } + else if (type == DType.EQUAL) { + myOperation = DirDiffOperation.EQUAL; + } else if (type == DType.CHANGED) { assert source != null; myOperation = source.getFileType().isBinary() ? NONE : DirDiffOperation.MERGE; @@ -106,7 +109,7 @@ public class DirDiffElement { @Nullable public String getSourceName() { - return myType == DType.CHANGED || myType == DType.SOURCE + return myType == DType.CHANGED || myType == DType.SOURCE || myType == DType.EQUAL ? mySource.getName() : null; } @@ -117,7 +120,7 @@ public class DirDiffElement { @Nullable public String getTargetName() { - return myType == DType.CHANGED || myType == DType.TARGET + return myType == DType.CHANGED || myType == DType.TARGET || myType == DType.EQUAL ? myTarget.getName() : null; } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java index 357166580c6e..f341e27d02d7 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffOperation.java @@ -24,7 +24,7 @@ import javax.swing.*; * @author Konstantin Bulenkov */ public enum DirDiffOperation { - COPY_TO, COPY_FROM, REMOVE, MERGE, NONE; + COPY_TO, COPY_FROM, REMOVE, MERGE, NONE, EQUAL; public Icon getIcon() { switch (this) { @@ -32,6 +32,7 @@ public enum DirDiffOperation { case COPY_FROM: return IconLoader.getIcon("/vcs/arrow_left.png"); case REMOVE: return IconLoader.getIcon("/vcs/remove.png"); case MERGE: return IconLoader.getIcon("/vcs/merge.png"); + case EQUAL: return IconLoader.getIcon("/vcs/equal.png"); case NONE: return EmptyIcon.create(12); } return null; diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java index 853a232aa2a2..4a46a88d7130 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffPanel.java @@ -76,6 +76,7 @@ public class DirDiffPanel { public void valueChanged(ListSelectionEvent e) { final DirDiffElement last = myModel.getElementAt(e.getLastIndex()); final DirDiffElement first = myModel.getElementAt(e.getFirstIndex()); + if (last == null || first == null) return; if (last.isSeparator()) { myTable.getSelectionModel().setLeadSelectionIndex(e.getFirstIndex()); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java index 6ab25e24c2ab..8d1bd4535775 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/DirDiffTableModel.java @@ -38,6 +38,7 @@ public class DirDiffTableModel extends AbstractTableModel { private DiffElement mySrc; private DiffElement myTrg; final List myElements = new ArrayList(); + private boolean myUpdating = false; public DirDiffTableModel(Project project, DiffElement src, DiffElement trg, ProgressIndicator indicator, DirDiffSettings settings) { myProject = project; @@ -48,6 +49,8 @@ public class DirDiffTableModel extends AbstractTableModel { } public void reloadModel(ProgressIndicator indicator) { + myUpdating = true; + clear(); final DTree tree = new DTree(null, "", true); scan(mySrc, tree, true); scan(myTrg, tree, false); @@ -59,6 +62,8 @@ public class DirDiffTableModel extends AbstractTableModel { myElements.clear(); fillElements(tree); + fireTableDataChanged(); + myUpdating = false; } private void fillElements(DTree tree) { @@ -91,6 +96,14 @@ public class DirDiffTableModel extends AbstractTableModel { } } + public void clear() { + if (!myElements.isEmpty()) { + final int size = myElements.size(); + myElements.clear(); + fireTableRowsDeleted(0, size - 1); + } + } + private static void scan(DiffElement element, DTree root, boolean source) { if (element.isContainer()) { try { @@ -108,7 +121,7 @@ public class DirDiffTableModel extends AbstractTableModel { } public DirDiffElement getElementAt(int index) { - return myElements.get(index); + return 0 <= index && index < myElements.size() ? myElements.get(index) : null; } public DiffElement getSourceDir() { @@ -202,4 +215,8 @@ public class DirDiffTableModel extends AbstractTableModel { public void setShowNewOnTarget(boolean show) { mySettings.showNewOnTarget = show; } + + public boolean isUpdating() { + return myUpdating; + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/DirDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/DirDiffAction.java index 399a60f39a70..40b5ab1d23f7 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/DirDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/DirDiffAction.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.diff.impl.dir.actions; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.ToggleAction; import com.intellij.openapi.diff.impl.dir.DirDiffIcons; import com.intellij.openapi.diff.impl.dir.DirDiffTableModel; @@ -35,4 +36,18 @@ public abstract class DirDiffAction extends ToggleAction implements DirDiffIcons public DirDiffTableModel getModel() { return myModel; } + + protected abstract void updateState(boolean state); + + @Override + public final void setSelected(AnActionEvent e, boolean state) { + updateState(state); + getModel().reloadModel(null); + } + + @Override + public void update(AnActionEvent e) { + super.update(e); + e.getPresentation().setEnabled(!getModel().isUpdating()); + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableEqual.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableEqual.java index 80ff1350c238..7b16d121bac0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableEqual.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableEqual.java @@ -31,8 +31,7 @@ public class EnableEqual extends DirDiffAction { return getModel().isShowEqual(); } - @Override - public void setSelected(AnActionEvent e, boolean state) { + public void updateState(boolean state) { getModel().setShowEqual(state); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableLeft.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableLeft.java index 7731b26d86e4..1ac8db191781 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableLeft.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableLeft.java @@ -31,8 +31,7 @@ public class EnableLeft extends DirDiffAction { return getModel().isShowNewOnSource(); } - @Override - public void setSelected(AnActionEvent e, boolean state) { + public void updateState(boolean state) { getModel().setShowNewOnSource(state); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableNotEqual.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableNotEqual.java index 50a462897c37..21a7f9281e85 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableNotEqual.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableNotEqual.java @@ -31,8 +31,7 @@ public class EnableNotEqual extends DirDiffAction { return getModel().isShowDifferent(); } - @Override - public void setSelected(AnActionEvent e, boolean state) { + public void updateState(boolean state) { getModel().setShowDifferent(state); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableRight.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableRight.java index c58043b2856b..f31df709f83e 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableRight.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/EnableRight.java @@ -31,8 +31,7 @@ public class EnableRight extends DirDiffAction { return getModel().isShowNewOnTarget(); } - @Override - public void setSelected(AnActionEvent e, boolean state) { + public void updateState(boolean state) { getModel().setShowNewOnTarget(state); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/RefreshDirDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/RefreshDirDiffAction.java index 99cfc9d2dea0..c875879a254b 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/RefreshDirDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/diff/impl/dir/actions/RefreshDirDiffAction.java @@ -33,7 +33,6 @@ public class RefreshDirDiffAction extends DirDiffAction { } @Override - public void setSelected(AnActionEvent e, boolean state) { - //TODO getModel().refresh(); + protected void updateState(boolean state) { } }