diff options
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/diff/impl')
7 files changed, 125 insertions, 45 deletions
diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffUtil.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffUtil.java index 2a5a01b43ca5..a67a6ad5af71 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffUtil.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffUtil.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.diff.impl; +import com.intellij.codeStyle.CodeStyleFacade; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.diff.DiffContent; import com.intellij.openapi.diff.DiffContentUtil; @@ -84,11 +85,22 @@ public class DiffUtil { } public static EditorEx createEditor(Document document, Project project, boolean isViewer) { + return createEditor(document, project, isViewer, null); + } + + public static EditorEx createEditor(Document document, Project project, boolean isViewer, @Nullable FileType fileType) { EditorFactory factory = EditorFactory.getInstance(); EditorEx editor = (EditorEx)(isViewer ? factory.createViewer(document, project) : factory.createEditor(document, project)); editor.putUserData(DiffManagerImpl.EDITOR_IS_DIFF_KEY, Boolean.TRUE); editor.setSoftWrapAppliancePlace(SoftWrapAppliancePlaces.VCS_DIFF); editor.getGutterComponentEx().revalidateMarkup(); + + if (fileType != null && project != null && !project.isDisposed()) { + CodeStyleFacade codeStyleFacade = CodeStyleFacade.getInstance(project); + editor.getSettings().setTabSize(codeStyleFacade.getTabSize(fileType)); + editor.getSettings().setUseTabCharacter(codeStyleFacade.useTabCharacter(fileType)); + } + return editor; } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java index 9ae17ec50df0..d4fbf23aa6c4 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java @@ -46,7 +46,7 @@ abstract class BaseExternalTool implements DiffTool { myToolProperty = toolProperty; } - public final boolean canShow(DiffRequest request) { + public final boolean canShow(@NotNull DiffRequest request) { if (!isEnabled() || StringUtil.isEmpty(getToolPath())) return false; return isAvailable(request); } @@ -56,10 +56,10 @@ abstract class BaseExternalTool implements DiffTool { return null; } - public abstract boolean isAvailable(DiffRequest request); + public abstract boolean isAvailable(@NotNull DiffRequest request); @Nullable - protected ContentExternalizer externalize(final DiffRequest request, final int index) { + protected ContentExternalizer externalize(@NotNull DiffRequest request, final int index) { final VirtualFile file = getLocalFile(request.getContents()[index].getFile()); if (LocalFileExternalizer.canExternalizeAsFile(file)) { @@ -81,7 +81,8 @@ abstract class BaseExternalTool implements DiffTool { return myEnableProperty.value(getProperties()); } - protected List<String> getParameters(DiffRequest request) throws Exception { + @NotNull + protected List<String> getParameters(@NotNull DiffRequest request) throws Exception { final String p1 = convertToPath(request, 0); final String p2 = convertToPath(request, 1); final List<String> params = new ArrayList<String>(); @@ -91,12 +92,8 @@ abstract class BaseExternalTool implements DiffTool { } public void show(DiffRequest request) { - for (DiffContent diffContent : request.getContents()) { - Document document = diffContent.getDocument(); - if (document != null) { - FileDocumentManager.getInstance().saveDocument(document); - } - } + saveContents(request); + GeneralCommandLine commandLine = new GeneralCommandLine(); commandLine.setExePath(getToolPath()); try { @@ -109,6 +106,15 @@ abstract class BaseExternalTool implements DiffTool { } } + protected void saveContents(DiffRequest request) { + for (DiffContent diffContent : request.getContents()) { + Document document = diffContent.getDocument(); + if (document != null) { + FileDocumentManager.getInstance().saveDocument(document); + } + } + } + @Nullable protected String convertToPath(DiffRequest request, int index) throws Exception { final ContentExternalizer externalize = externalize(request, index); diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFiles.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFiles.java index 0594ab09c0c5..6f661acf9463 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFiles.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFiles.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diff.DiffContent; import com.intellij.openapi.diff.DiffRequest; import com.intellij.openapi.diff.impl.DiffUtil; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; /** * @author Konstantin Bulenkov @@ -30,7 +31,7 @@ class ExtCompareFiles extends BaseExternalTool { super(DiffManagerImpl.ENABLE_FILES, DiffManagerImpl.FILES_TOOL); } - public boolean isAvailable(DiffRequest request) { + public boolean isAvailable(@NotNull DiffRequest request) { final DiffContent[] contents = request.getContents(); for (DiffContent content : contents) { final VirtualFile file = getLocalFile(content.getFile()); diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFolders.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFolders.java index 14c0a9607293..6260176d3e26 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFolders.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFolders.java @@ -18,6 +18,7 @@ package com.intellij.openapi.diff.impl.external; import com.intellij.openapi.diff.DiffContent; import com.intellij.openapi.diff.DiffRequest; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -31,7 +32,7 @@ class ExtCompareFolders extends BaseExternalTool { } @Override - public boolean isAvailable(DiffRequest request) { + public boolean isAvailable(@NotNull DiffRequest request) { final DiffContent[] contents = request.getContents(); if (contents.length != 2) return false; if (externalize(request, 0) == null) return false; @@ -40,7 +41,7 @@ class ExtCompareFolders extends BaseExternalTool { } @Nullable - protected ContentExternalizer externalize(DiffRequest request, int index) { + protected ContentExternalizer externalize(@NotNull DiffRequest request, int index) { final VirtualFile file = request.getContents()[index].getFile(); if (!isLocalDirectory(file)) { diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java index 82313a5c9c35..cfee691a1f1f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java @@ -15,10 +15,21 @@ */ package com.intellij.openapi.diff.impl.external; +import com.intellij.execution.ExecutionException; +import com.intellij.execution.configurations.GeneralCommandLine; +import com.intellij.execution.util.ExecutionErrorDialog; +import com.intellij.openapi.diff.DiffBundle; import com.intellij.openapi.diff.DiffContent; import com.intellij.openapi.diff.DiffRequest; import com.intellij.openapi.diff.impl.mergeTool.MergeRequestImpl; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; +import com.intellij.openapi.progress.Task; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.TimeoutUtil; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -34,7 +45,8 @@ public class ExtMergeFiles extends BaseExternalTool { } @Override - public boolean isAvailable(DiffRequest request) { + public boolean isAvailable(@NotNull DiffRequest request) { + if (!(request instanceof MergeRequestImpl)) return false; DiffContent[] contents = request.getContents(); if (contents.length != 3) return false; if (externalize(request, 0) == null) return false; @@ -45,7 +57,8 @@ public class ExtMergeFiles extends BaseExternalTool { } @Override - protected List<String> getParameters(DiffRequest request) throws Exception { + @NotNull + protected List<String> getParameters(@NotNull DiffRequest request) throws Exception { final List<String> params = new ArrayList<String>(); String result = ((MergeRequestImpl)request).getResultContent().getFile().getPath(); String left = externalize(request, 0).getContentFile().getPath(); @@ -60,4 +73,41 @@ public class ExtMergeFiles extends BaseExternalTool { } return params; } + + @Override + public void show(@NotNull DiffRequest request) { + saveContents(request); + + int result = DialogWrapper.CANCEL_EXIT_CODE; + + GeneralCommandLine commandLine = new GeneralCommandLine(); + commandLine.setExePath(getToolPath()); + try { + commandLine.addParameters(getParameters(request)); + commandLine.createProcess(); + + ProgressManager.getInstance().run(new Task.Modal(request.getProject(), "Launching external tool", false) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + indicator.setIndeterminate(true); + TimeoutUtil.sleep(1000); + } + }); + + if (Messages.YES == Messages.showYesNoDialog(request.getProject(), + "Press \"Mark as Resolved\" when you finish resolving conflicts in the external tool", + "Merge In External Tool", "Mark as Resolved", "Revert", null)) { + result = DialogWrapper.OK_EXIT_CODE; + } + ((MergeRequestImpl)request).getResultContent().getFile().refresh(false, false); + // We can actually check exit code of external tool, but some of them could work with tabs -> do not close at all + } + catch (Exception e) { + ExecutionErrorDialog + .show(new ExecutionException(e.getMessage()), DiffBundle.message("cant.launch.diff.tool.error.message"), request.getProject()); + } + finally { + ((MergeRequestImpl)request).setResult(result); + } + } } diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/EditorPlaceHolder.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/EditorPlaceHolder.java index 0632b56d0f0e..dabaf5f1f030 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/EditorPlaceHolder.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/EditorPlaceHolder.java @@ -93,7 +93,7 @@ class EditorPlaceHolder extends DiffMarkup implements DiffVersionComponent { } else { document = new DocumentImpl("Can not show", true); final EditorFactory editorFactory = EditorFactory.getInstance(); - myEditor = DiffUtil.createEditor(document, getProject(), true); + myEditor = DiffUtil.createEditor(document, getProject(), true, content.getContentType()); addDisposable(new Disposable() { public void dispose() { editorFactory.releaseEditor(myEditor); @@ -105,7 +105,7 @@ class EditorPlaceHolder extends DiffMarkup implements DiffVersionComponent { } else { final EditorFactory editorFactory = EditorFactory.getInstance(); - myEditor = DiffUtil.createEditor(document, getProject(), false); + myEditor = DiffUtil.createEditor(document, getProject(), false, content.getContentType()); addDisposable(new Disposable() { public void dispose() { editorFactory.releaseEditor(myEditor); diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java index f6cd904c9503..3bc3e90b81b3 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java @@ -136,16 +136,13 @@ public class SyncScrollSupport implements Disposable { Editor slaveEditor = sidesContainer.getEditor(masterSide.otherSide()); if (slaveEditor == null) return; - ScrollingModel scrollingModel = slaveEditor.getScrollingModel(); - scrollingModel.disableAnimation(); - scrollingModel.scrollHorizontally(newScrollOffset); - scrollingModel.enableAnimation(); + doScrollHorizontally(slaveEditor.getScrollingModel(), newScrollOffset); } private static void syncVerticalScroll(@NotNull ScrollingContext context, @NotNull Rectangle newRectangle, @NotNull Rectangle oldRectangle) { - if (newRectangle.y == oldRectangle.y && newRectangle.height == oldRectangle.height) return; + if (newRectangle.y == oldRectangle.y) return; EditingSides sidesContainer = context.getSidesContainer(); FragmentSide masterSide = context.getMasterSide(); FragmentSide masterDiffSide = context.getMasterDiffSide(); @@ -155,42 +152,55 @@ public class SyncScrollSupport implements Disposable { if (master == null || slave == null) return; + int masterVerticalScrollOffset = master.getScrollingModel().getVerticalScrollOffset(); + int slaveVerticalScrollOffset = slave.getScrollingModel().getVerticalScrollOffset(); + Rectangle viewRect = master.getScrollingModel().getVisibleArea(); int middleY = viewRect.height / 3; - int masterVerticalScrollOffset = getScrollOffset(master); - int slaveVerticalScrollOffset = getScrollOffset(slave); + if (master.getDocument().getTextLength() == 0) return; LogicalPosition masterPos = master.xyToLogicalPosition(new Point(viewRect.x, masterVerticalScrollOffset + middleY)); int masterCenterLine = masterPos.line; - if (masterCenterLine > master.getDocument().getLineCount()) { - masterCenterLine = master.getDocument().getLineCount(); + int scrollToLine = sidesContainer.getLineBlocks().transform(masterDiffSide, masterCenterLine); + + int offset; + if (scrollToLine < 0) { + offset = slaveVerticalScrollOffset + newRectangle.y - oldRectangle.y; } - int scrollToLine = sidesContainer.getLineBlocks().transform(masterDiffSide, masterCenterLine) + 1; - int actualLine = scrollToLine - 1; + else { + int correction = (masterVerticalScrollOffset + middleY) % master.getLineHeight(); + Point point = slave.logicalPositionToXY(new LogicalPosition(scrollToLine, masterPos.column)); + offset = point.y - middleY + correction; + } + + int deltaHeaderOffset = getHeaderOffset(slave) - getHeaderOffset(master); + doScrollVertically(slave.getScrollingModel(), offset + deltaHeaderOffset); + } + private static int getHeaderOffset(@NotNull final Editor editor) { + final JComponent header = editor.getHeaderComponent(); + return header == null ? 0 : header.getHeight(); + } - slave.getScrollingModel().disableAnimation(); + private static void doScrollVertically(@NotNull ScrollingModel model, int offset) { + model.disableAnimation(); try { - if (scrollToLine <= 0) { - int offset = newRectangle.y - oldRectangle.y; - slave.getScrollingModel().scrollVertically(slaveVerticalScrollOffset + offset); - } - else { - int correction = (masterVerticalScrollOffset + middleY) % master.getLineHeight(); - Point point = slave.logicalPositionToXY(new LogicalPosition(actualLine, masterPos.column)); - slave.getScrollingModel().scrollVertically(point.y - middleY + correction); - } - } finally { - slave.getScrollingModel().enableAnimation(); + model.scrollVertically(offset); + } + finally { + model.enableAnimation(); } } - private static int getScrollOffset(@NotNull final Editor editor) { - final JComponent header = editor.getHeaderComponent(); - int headerOffset = header == null ? 0 : header.getHeight(); - - return editor.getScrollingModel().getVerticalScrollOffset() - headerOffset; + private static void doScrollHorizontally(@NotNull ScrollingModel model, int offset) { + model.disableAnimation(); + try { + model.scrollHorizontally(offset); + } + finally { + model.enableAnimation(); + } } public static void scrollEditor(@NotNull Editor editor, int logicalLine) { |