vcs: Sync non-modal commit inclusion with "Local Changes" tree state (IDEA-212228)

GitOrigin-RevId: 9ad731ff7ff6d8ff8f35b1de3999863d6df6600b
This commit is contained in:
Konstantin Kolosovsky
2019-05-26 15:04:31 +03:00
committed by intellij-monorepo-bot
parent 3930a4a656
commit a35a9c1e32
2 changed files with 27 additions and 2 deletions
@@ -49,6 +49,7 @@ import com.intellij.util.xmlb.annotations.XCollection;
import com.intellij.vcs.commit.ChangesViewCommitPanel;
import com.intellij.vcs.commit.ChangesViewCommitWorkflow;
import com.intellij.vcs.commit.ChangesViewCommitWorkflowHandler;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -335,16 +336,18 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
if (!ProjectLevelVcsManager.getInstance(myProject).hasActiveVcss()) return;
ChangeListManagerImpl changeListManager = ChangeListManagerImpl.getInstanceImpl(myProject);
List<LocalChangeList> changeLists = changeListManager.getChangeListsCopy();
List<VirtualFile> unversionedFiles = changeListManager.getUnversionedFiles();
TreeModelBuilder treeModelBuilder = new TreeModelBuilder(myProject, myView.getGrouping())
.setChangeLists(changeListManager.getChangeListsCopy(), Registry.is("vcs.skip.single.default.changelist"))
.setChangeLists(changeLists, Registry.is("vcs.skip.single.default.changelist"))
.setLocallyDeletedPaths(changeListManager.getDeletedFiles())
.setModifiedWithoutEditing(changeListManager.getModifiedWithoutEditing())
.setSwitchedFiles(changeListManager.getSwitchedFilesMap())
.setSwitchedRoots(changeListManager.getSwitchedRoots())
.setLockedFolders(changeListManager.getLockedFolders())
.setLogicallyLockedFiles(changeListManager.getLogicallyLockedFolders())
.setUnversioned(changeListManager.getUnversionedFiles());
.setUnversioned(unversionedFiles);
if (myState.myShowIgnored) {
treeModelBuilder.setIgnored(changeListManager.getIgnoredFiles(), changeListManager.isIgnoredInUpdateMode());
}
@@ -357,6 +360,7 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
myModelUpdateInProgress = true;
try {
myView.updateModel(newModel);
synchronizeInclusion(changeLists, unversionedFiles);
}
finally {
myModelUpdateInProgress = false;
@@ -366,6 +370,16 @@ public class ChangesViewManager implements ChangesViewI, ProjectComponent, Persi
}, indicator);
}
private void synchronizeInclusion(@NotNull List<LocalChangeList> changeLists, @NotNull List<VirtualFile> unversionedFiles) {
if (myView.isShowCheckboxes() && !myView.isInclusionEmpty()) {
THashSet<Object> possibleInclusion = new THashSet<>(ChangeListChange.HASHING_STRATEGY);
changeLists.forEach(changeList -> possibleInclusion.addAll(changeList.getChanges()));
possibleInclusion.addAll(unversionedFiles);
myView.retainInclusion(possibleInclusion);
}
}
private void updatePreview(boolean fromModelRefresh) {
if (mySplitterComponent != null) {
mySplitterComponent.updatePreview(fromModelRefresh);
@@ -485,6 +485,13 @@ public abstract class ChangesTree extends Tree implements DataProvider {
repaint();
}
public void retainInclusion(@NotNull Collection<?> changes) {
if (myIncludedChanges.retainAll(changes)) {
notifyInclusionListener();
repaint();
}
}
public void includeChange(final Object change) {
includeChanges(Collections.singleton(change));
}
@@ -522,6 +529,10 @@ public abstract class ChangesTree extends Tree implements DataProvider {
}
}
public boolean isInclusionEmpty() {
return myIncludedChanges.isEmpty();
}
public boolean isIncluded(final Object change) {
return myIncludedChanges.contains(change);
}