From 1ee7c413fb23ad6b8fdc40b1a0d5eac039e30c70 Mon Sep 17 00:00:00 2001 From: Kirill Likhodedov Date: Mon, 18 Feb 2013 12:53:00 +0400 Subject: [PATCH] Revert "[diff] Stop "Go to source" on click on local version in the diff dialog." This reverts commit e74b321e79f92074e4b0763c4546d5fc7b0d9efe. User requests this functionality to be kept, but with Ctrl/Alt+Click IDEA-101289 The change from Click to Ctrl/Alt+Click will follow. --- .../openapi/diff/impl/DiffSideView.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSideView.java b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSideView.java index 8577f1a80543..26ea37f5e798 100644 --- a/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSideView.java +++ b/platform/platform-impl/src/com/intellij/openapi/diff/impl/DiffSideView.java @@ -25,6 +25,10 @@ import com.intellij.openapi.diff.impl.util.LabeledEditor; import com.intellij.openapi.diff.impl.util.SyncScrollSupport; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.colors.EditorColors; +import com.intellij.openapi.editor.event.EditorMouseAdapter; +import com.intellij.openapi.editor.event.EditorMouseEvent; +import com.intellij.openapi.editor.event.EditorMouseEventArea; +import com.intellij.openapi.editor.event.EditorMouseMotionAdapter; import com.intellij.openapi.editor.ex.EditorEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.fileEditor.FileEditor; @@ -38,8 +42,10 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import javax.swing.border.Border; +import java.awt.*; import java.awt.event.FocusAdapter; import java.awt.event.FocusEvent; +import java.awt.event.MouseEvent; public class DiffSideView { private final JComponent MOCK_COMPONENT = new JPanel(); @@ -94,6 +100,7 @@ public class DiffSideView { editor.getScrollingModel().scrollHorizontally(0); insertComponent(editor.getComponent()); applyHighlighter(); + setMouseListeners(source); MyEditorFocusListener.install(this); state.restore(); @@ -122,6 +129,11 @@ public class DiffSideView { myPanel.updateTitle(myTitle); } + private void setMouseListeners(EditorSource source) { + DiffContent content = source.getContent(); + MouseLineNumberListener.install(content, source, myContainer); + } + public void beSlave() { myIsMaster = false; myLineMarker.hide(); @@ -137,6 +149,69 @@ public class DiffSideView { return content.getOpenFileDescriptor(editor.getCaretModel().getOffset()); } + private static class MouseLineNumberListener { + private static final Cursor HAND__CURSOR = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + private final Editor myEditor; + private final DiffSidesContainer myContainer; + private final DiffContent myContent; + private final Project myProject; + + private final EditorMouseAdapter myMouseListener = new EditorMouseAdapter() { + public void mouseReleased(EditorMouseEvent e) { + if (e.getMouseEvent().getButton() != MouseEvent.BUTTON1) { + return; + } + if (!isInMyArea(e)) return; + OpenFileDescriptor descriptor = getOpenFileDescriptor(e); + if (descriptor == null) return; + myContainer.showSource(descriptor); + } + }; + + private OpenFileDescriptor getOpenFileDescriptor(EditorMouseEvent e) { + int offset = myEditor.logicalPositionToOffset(myEditor.xyToLogicalPosition(e.getMouseEvent().getPoint())); + return myContent.getOpenFileDescriptor(offset); + } + + private boolean isInMyArea(EditorMouseEvent e) { + return e.getArea() == EditorMouseEventArea.LINE_NUMBERS_AREA; + } + + private final EditorMouseMotionAdapter myMouseMotionListener = new EditorMouseMotionAdapter() { + public void mouseMoved(EditorMouseEvent e) { + Editor editor = e.getEditor(); + if (editor.getProject() != null && editor.getProject() != myProject && myProject != null/*???*/) return; + if (!isInMyArea(e)) return; + Cursor cursor = getOpenFileDescriptor(e) != null ? HAND__CURSOR : Cursor.getDefaultCursor(); + e.getMouseEvent().getComponent().setCursor(cursor); + myEditor.getContentComponent().setCursor(cursor); + } + }; + + public MouseLineNumberListener(DiffContent content, Editor editor, DiffSidesContainer container, Project project) { + myEditor = editor; + myContainer = container; + myContent = content; + myProject = project; + } + + public static void install(DiffContent content, EditorSource source, DiffSidesContainer container) { + final Editor editor = source.getEditor(); + Project project = container.getProject(); + if (project == null) return; + final MouseLineNumberListener listener = new MouseLineNumberListener(content, editor, container, project); + editor.addEditorMouseListener(listener.myMouseListener); + editor.addEditorMouseMotionListener(listener.myMouseMotionListener); + source.addDisposable(new Disposable() { + public void dispose() { + editor.removeEditorMouseListener(listener.myMouseListener); + editor.removeEditorMouseMotionListener(listener.myMouseMotionListener); + } + }); + } + + } + private static class MyEditorFocusListener extends FocusAdapter { private final DiffSideView mySideView;