diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java b/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java index 78f22616b1bd..c35f94c047b6 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/push/PushController.java @@ -88,8 +88,12 @@ public class PushController implements Disposable { myPushLog.getTree().addPropertyChangeListener(PushLogTreeUtil.EDIT_MODE_PROP, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { + // when user starts edit we need to force disable ok actions, because tree.isEditing() still false; + // after editing completed okActions will be enabled automatically by dialog validation Boolean isEditMode = (Boolean)evt.getNewValue(); - myDialog.enableOkActions(!isEditMode && isPushAllowed()); + if (isEditMode) { + myDialog.disableOkActions(); + } } }); startLoadingCommits(); @@ -234,7 +238,7 @@ public class PushController implements Disposable { @Override public void onSelectionChanged(boolean isSelected) { - myDialog.enableOkActions(isPushAllowed()); + myDialog.updateOkActions(); if (isSelected) { boolean forceLoad = myExcludedRepositoryRoots.remove(model.getRepository().getRoot().getPath()); if (!model.hasCommitInfo() && (forceLoad || !model.getSupport().shouldRequestIncomingChangesForNotCheckedRepositories())) { @@ -277,21 +281,21 @@ public class PushController implements Disposable { return names; } - public boolean isPushAllowed() { + public boolean isPushAllowed(final boolean force) { JTree tree = myPushLog.getTree(); return !tree.isEditing() && ContainerUtil.exists(myPushSupports, new Condition>() { @Override public boolean value(PushSupport support) { - return isPushAllowed(support); + return isPushAllowed(support, force); } }); } - private boolean isPushAllowed(@NotNull PushSupport pushSupport) { + private boolean isPushAllowed(@NotNull PushSupport pushSupport, boolean force) { Collection nodes = getNodesForSupport(pushSupport); if (hasSomethingToPush(nodes)) return true; - if (hasCheckedNodesWithContent(nodes, myDialog.getAdditionalOptionValue(pushSupport) != null)) { + if (hasCheckedNodesWithContent(nodes, force || myDialog.getAdditionalOptionValue(pushSupport) != null)) { return !pushSupport.getRepositoryManager().isSyncEnabled() || allNodesAreLoaded(nodes); } return false; @@ -399,7 +403,7 @@ public class PushController implements Disposable { if (shouldBeSelected) { // never remove selection; initially all checkboxes are not selected node.setChecked(true); } - myDialog.enableOkActions(isPushAllowed()); + myDialog.updateOkActions(); } }); } diff --git a/platform/dvcs-impl/src/com/intellij/dvcs/push/ui/VcsPushDialog.java b/platform/dvcs-impl/src/com/intellij/dvcs/push/ui/VcsPushDialog.java index 2e811916c8e5..7dbe1b20096e 100644 --- a/platform/dvcs-impl/src/com/intellij/dvcs/push/ui/VcsPushDialog.java +++ b/platform/dvcs-impl/src/com/intellij/dvcs/push/ui/VcsPushDialog.java @@ -36,7 +36,6 @@ public class VcsPushDialog extends DialogWrapper { private static final String ID = "Vcs.Push.Dialog"; - @NotNull private final Project myProject; private final PushLog myListPanel; private final PushController myController; private final Map myAdditionalPanels; @@ -48,13 +47,12 @@ public class VcsPushDialog extends DialogWrapper { @NotNull List selectedRepositories, @Nullable Repository currentRepo) { super(project); - myProject = project; myController = new PushController(project, this, selectedRepositories, currentRepo); myAdditionalPanels = myController.createAdditionalPanels(); myListPanel = myController.getPushPanelLog(); init(); - enableOkActions(myController.isPushAllowed()); + updateOkActions(); setOKButtonText("Push"); setOKButtonMnemonic('P'); setTitle("Push Commits"); @@ -80,7 +78,7 @@ public class VcsPushDialog extends DialogWrapper { @Nullable @Override protected ValidationInfo doValidate() { - enableOkActions(myController.isPushAllowed()); + updateOkActions(); return null; } @@ -103,8 +101,12 @@ public class VcsPushDialog extends DialogWrapper { return actions.toArray(new Action[actions.size()]); } + private boolean canPush() { + return myController.isPushAllowed(false); + } + private boolean canForcePush() { - return myController.isForcePushEnabled() && myController.getProhibitedTarget() == null; + return myController.isForcePushEnabled() && myController.getProhibitedTarget() == null && myController.isPushAllowed(true); } @Nullable @@ -123,11 +125,12 @@ public class VcsPushDialog extends DialogWrapper { protected String getHelpId() { return ID; } - public void enableOkActions(boolean isEnabled) { - myPushAction.setEnabled(isEnabled); + + public void updateOkActions() { + myPushAction.setEnabled(canPush()); if (myForcePushAction != null) { boolean canForcePush = canForcePush(); - myForcePushAction.setEnabled(isEnabled && canForcePush); + myForcePushAction.setEnabled(canForcePush); String tooltip = null; if (!canForcePush) { PushTarget target = myController.getProhibitedTarget(); @@ -139,6 +142,10 @@ public class VcsPushDialog extends DialogWrapper { } } + public void disableOkActions() { + myPushAction.setEnabled(false); + } + @Nullable public VcsPushOptionValue getAdditionalOptionValue(@NotNull PushSupport support) { VcsPushOptionsPanel panel = myAdditionalPanels.get(support); diff --git a/plugins/hg4idea/testSrc/hg4idea/test/HgEncodingTest.java b/plugins/hg4idea/testSrc/hg4idea/test/HgEncodingTest.java index 009f90c9a58a..cfc649cd6913 100644 --- a/plugins/hg4idea/testSrc/hg4idea/test/HgEncodingTest.java +++ b/plugins/hg4idea/testSrc/hg4idea/test/HgEncodingTest.java @@ -24,7 +24,9 @@ import org.zmlx.hg4idea.command.HgLogCommand; import org.zmlx.hg4idea.execution.HgCommandException; import org.zmlx.hg4idea.repo.HgRepository; import org.zmlx.hg4idea.repo.HgRepositoryImpl; +import org.zmlx.hg4idea.util.HgEncodingUtil; +import java.nio.charset.Charset; import java.util.List; import static com.intellij.openapi.vcs.Executor.cd; @@ -49,6 +51,7 @@ public class HgEncodingTest extends HgPlatformTest { cd(myRepository); String fileName = "file.txt"; echo(fileName, "lalala"); + Charset charset = HgEncodingUtil.getDefaultCharset(myProject); String comment = "öäüß"; HgRepository hgRepo = HgRepositoryImpl.getInstance(myRepository, myProject, myProject); HgCommitCommand commitCommand = new HgCommitCommand(myProject, hgRepo, comment); @@ -59,6 +62,6 @@ public class HgEncodingTest extends HgPlatformTest { assert file != null; List revisions = logCommand.execute(new HgFile(myProject, file), 1, false); HgFileRevision rev = revisions.get(0); - assertEquals(comment, rev.getCommitMessage()); + assertEquals(new String(comment.getBytes(charset)), rev.getCommitMessage()); } }