diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListAdapter.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListAdapter.java index 9ebcbe293cd2..5dd180d2acd6 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListAdapter.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListAdapter.java @@ -41,6 +41,11 @@ public class ChangeListAdapter implements ChangeListListener { changeListsChanged(); } + @Override + public void changeListDataChanged(ChangeList list) { + changeListsChanged(); + } + @Override public void changeListCommentChanged(ChangeList list, String oldComment) { changeListsChanged(); diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListListener.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListListener.java index 46fe71457107..ff855b9619c5 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListListener.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListListener.java @@ -31,6 +31,7 @@ public interface ChangeListListener extends EventListener { default void changeListAdded(ChangeList list) {} default void changeListRemoved(ChangeList list) {} default void changeListChanged(ChangeList list) {} + default void changeListDataChanged(ChangeList list) {} default void changeListRenamed(ChangeList list, String oldName) {} default void changeListCommentChanged(ChangeList list, String oldComment) {} default void defaultListChanged(ChangeList oldDefaultList, ChangeList newDefaultList) {} diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListModification.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListModification.java index 677c40bd5e24..42125e9e6fba 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListModification.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/ChangeListModification.java @@ -36,5 +36,5 @@ public interface ChangeListModification { boolean editName(@NotNull String fromName, @NotNull String toName); @Nullable - String editComment(@NotNull String fromName, final String newComment); + String editComment(@NotNull String name, final String newComment); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerEx.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerEx.java index 91d22c368be3..ccee40d54b22 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerEx.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerEx.java @@ -30,6 +30,8 @@ public abstract class ChangeListManagerEx extends ChangeListManager { @NotNull public abstract LocalChangeList addChangeList(@NotNull String name, @Nullable String comment, @Nullable ChangeListData data); + public abstract boolean editChangeListData(@NotNull String name, @Nullable ChangeListData newData); + /** * @param automatic true is changelist switch operation was not triggered by user (and, for example, will be reverted soon) * 4ex: This flag disables automatic empty changelist deletion. diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index 28ded913bf57..30ee20d0a141 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -1023,16 +1023,27 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec } @Override - public String editComment(@NotNull String fromName, String newComment) { + public String editComment(@NotNull String name, String newComment) { return ReadAction.compute(() -> { synchronized (myDataLock) { - final String oldComment = myModifier.editComment(fromName, StringUtil.notNullize(newComment)); + final String oldComment = myModifier.editComment(name, StringUtil.notNullize(newComment)); myChangesViewManager.scheduleRefresh(); return oldComment; } }); } + @Override + public boolean editChangeListData(@NotNull String name, @Nullable ChangeListData newData) { + return ReadAction.compute(() -> { + synchronized (myDataLock) { + final boolean result = myModifier.editData(name, newData); + myChangesViewManager.scheduleRefresh(); + return result; + } + }); + } + @Override public void moveChangesTo(@NotNull LocalChangeList list, @NotNull Change... changes) { ApplicationManager.getApplication().runReadAction(() -> { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListWorker.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListWorker.java index 5a573e8207fd..a53ad8c32bbc 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListWorker.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListWorker.java @@ -480,6 +480,15 @@ public class ChangeListWorker { return oldComment; } + public boolean editData(@NotNull String name, @Nullable ChangeListData newData) { + final ListData list = getDataByName(name); + if (list == null) return false; + + list.data = newData; + + return true; + } + @NotNull public LocalChangeList addChangeList(@NotNull String name, @Nullable String description, @Nullable String id, diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/DelayedNotificator.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/DelayedNotificator.java index 603ebc1bf419..ec40e3a60575 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/DelayedNotificator.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/DelayedNotificator.java @@ -69,6 +69,11 @@ public class DelayedNotificator implements ChangeListListener { myScheduler.submit(() -> myDispatcher.getMulticaster().changeListRenamed(list, oldName)); } + @Override + public void changeListDataChanged(ChangeList list) { + myScheduler.submit(() -> myDispatcher.getMulticaster().changeListDataChanged(list)); + } + @Override public void changeListCommentChanged(final ChangeList list, final String oldComment) { myScheduler.submit(() -> myDispatcher.getMulticaster().changeListCommentChanged(list, oldComment)); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/Modifier.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/Modifier.java index f2a0da30f2a6..1f25efc5df7d 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/Modifier.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/Modifier.java @@ -79,6 +79,12 @@ public class Modifier { return command.getOldComment(); } + public boolean editData(@NotNull String fromName, @Nullable ChangeListData newData) { + EditData command = new EditData(fromName, newData); + impl(command); + return command.isResult(); + } + private void impl(@NotNull ChangeListCommand command) { if (myInsideUpdate) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/local/EditData.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/local/EditData.java new file mode 100644 index 000000000000..2c74198c3a77 --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/local/EditData.java @@ -0,0 +1,40 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.vcs.changes.local; + +import com.intellij.openapi.vcs.changes.ChangeListData; +import com.intellij.openapi.vcs.changes.ChangeListListener; +import com.intellij.openapi.vcs.changes.ChangeListWorker; +import com.intellij.openapi.vcs.changes.LocalChangeList; +import com.intellij.util.EventDispatcher; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class EditData implements ChangeListCommand { + private final String myName; + @Nullable private final ChangeListData myNewData; + + private boolean myResult; + private LocalChangeList myListCopy; + + public EditData(@NotNull String name, @Nullable ChangeListData newData) { + myName = name; + myNewData = newData; + } + + @Override + public void apply(final ChangeListWorker worker) { + myResult = worker.editData(myName, myNewData); + myListCopy = worker.getChangeListByName(myName); + } + + @Override + public void doNotify(final EventDispatcher dispatcher) { + if (myListCopy != null) { + dispatcher.getMulticaster().changeListDataChanged(myListCopy); + } + } + + public boolean isResult() { + return myResult; + } +} diff --git a/platform/vcs-impl/testSrc/com/intellij/testFramework/vcs/MockChangeListManager.java b/platform/vcs-impl/testSrc/com/intellij/testFramework/vcs/MockChangeListManager.java index 9dd95a05629f..6d93e33a1373 100644 --- a/platform/vcs-impl/testSrc/com/intellij/testFramework/vcs/MockChangeListManager.java +++ b/platform/vcs-impl/testSrc/com/intellij/testFramework/vcs/MockChangeListManager.java @@ -397,6 +397,11 @@ public class MockChangeListManager extends ChangeListManagerEx { throw new UnsupportedOperationException(); } + @Override + public boolean editChangeListData(@NotNull String name, @Nullable ChangeListData newData) { + throw new UnsupportedOperationException(); + } + @Override public boolean isInUpdate() { throw new UnsupportedOperationException();