summaryrefslogtreecommitdiff
path: root/platform/platform-impl/src/com/intellij/openapi/diff/impl
diff options
context:
space:
mode:
Diffstat (limited to 'platform/platform-impl/src/com/intellij/openapi/diff/impl')
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffUtil.java12
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/external/BaseExternalTool.java26
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFiles.java3
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtCompareFolders.java5
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/external/ExtMergeFiles.java54
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/highlighting/EditorPlaceHolder.java4
-rw-r--r--platform/platform-impl/src/com/intellij/openapi/diff/impl/util/SyncScrollSupport.java66
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) {