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;