From d4f35837798ea007eac8349177e01015c3c491f9 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Wed, 30 Jul 2014 16:08:30 +0400 Subject: [PATCH] IDEA-54491 diff: ask if there are left unprocessed changes on merge apply --- .../impl/incrementalMerge/ui/MergePanel2.java | 20 ++++++++++++++++--- .../diff/impl/mergeTool/MergeRequestImpl.java | 6 ++++++ .../src/messages/DiffBundle.properties | 2 ++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java index 352b01b902ac..091ac47c7251 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/incrementalMerge/ui/MergePanel2.java @@ -53,13 +53,14 @@ import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogBuilder; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.ui.EditorNotificationPanel; -import com.intellij.util.diff.FilesTooBigForDiffException; +import com.intellij.util.containers.Convertor; import gnu.trove.TIntHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -371,7 +372,20 @@ public class MergePanel2 implements DiffViewer { data.customizeToolbar(myPanel.resetToolbar()); myPanel.registerToolbarActions(); if ( data instanceof MergeRequestImpl && myBuilder != null){ - ((MergeRequestImpl)data).setActions(myBuilder, this); + Convertor preOkHook = new Convertor() { + @Override + public Boolean convert(DialogWrapper dialog) { + ChangeCounter counter = ChangeCounter.getOrCreate(myMergeList); + int changes = counter.getChangeCounter(); + int conflicts = counter.getConflictCounter(); + if (changes == 0 && conflicts == 0) return true; + return Messages.showYesNoDialog(dialog.getRootPane(), + DiffBundle.message("merge.dialog.apply.partially.resolved.changes.confirmation.message", changes, conflicts), + DiffBundle.message("apply.partially.resolved.merge.dialog.title"), + Messages.getQuestionIcon()) == Messages.YES; + } + }; + ((MergeRequestImpl)data).setActions(myBuilder, this, preOkHook); } } finally { diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java index f8c847e11f4f..f6642b720acc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/mergeTool/MergeRequestImpl.java @@ -28,6 +28,7 @@ import com.intellij.openapi.ui.DialogBuilder; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.containers.Convertor; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -189,6 +190,10 @@ public class MergeRequestImpl extends MergeRequest { } public void setActions(final DialogBuilder builder, MergePanel2 mergePanel) { + setActions(builder, mergePanel, null); + } + + public void setActions(final DialogBuilder builder, MergePanel2 mergePanel, final Convertor preOkHook) { builder.removeAllActions(); // otherwise dialog will get default actions (OK, Cancel) if (myOkButtonPresentation != null) { @@ -200,6 +205,7 @@ public class MergeRequestImpl extends MergeRequest { builder.setOkOperation(new Runnable() { @Override public void run() { + if (preOkHook != null && !preOkHook.convert(builder.getDialogWrapper())) return; myOkButtonPresentation.run(builder.getDialogWrapper()); } }); diff --git a/platform/platform-resources-en/src/messages/DiffBundle.properties b/platform/platform-resources-en/src/messages/DiffBundle.properties index 598cc9714697..aafd6884a3d6 100644 --- a/platform/platform-resources-en/src/messages/DiffBundle.properties +++ b/platform/platform-resources-en/src/messages/DiffBundle.properties @@ -67,6 +67,8 @@ merge.partial.diff.action.name.0.1=Compare left and middle panel contents merge.partial.diff.action.name.1.2=Compare middle and right panel contents merge.dialog.exit.without.applying.changes.confirmation.message=Are you sure you want to exit without applying changes? cancel.visual.merge.dialog.title=Cancel Visual Merge +merge.dialog.apply.partially.resolved.changes.confirmation.message=There are {0, choice, 0#|1#one change|2#{0, number} changes}{0, choice, 0#|1#'{1, choice, 0#|1# and }'}{1, choice, 0#|1#one conflict|2#{1, number} conflicts} left unprocessed.\nAre you sure you want to save changes and finish merging? +apply.partially.resolved.merge.dialog.title=Apply Changes merge.all.changes.have.processed.save.and.finish.confirmation.text=All changes have been processed.\nWould you like to save changes and finish merging? all.changes.processed.dialog.title=All Changes Processed merge.save.and.finish.button=Save and &Finish