Index: components/synedit/synedit.pp
===================================================================
--- components/synedit/synedit.pp	(revision 17810)
+++ components/synedit/synedit.pp	(working copy)
@@ -306,6 +306,9 @@
   end;
   {$ENDIF}
 
+  TSynMouseLinkEvent = procedure (
+    Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean) of object;
+
   { TCustomSynEdit }
 
   TCustomSynEdit = class(TSynEditBase)
@@ -437,6 +440,7 @@
     {$IFDEF SYN_LAZARUS}
     FOnSpecialLineMarkup: TSpecialLineMarkupEvent;// needed, because bug fpc 11926
     FOnClickLink: TMouseEvent;
+    FOnMouseLink: TSynMouseLinkEvent;
     {$ENDIF}
 
     {$IFDEF SYN_LAZARUS}
@@ -753,6 +757,7 @@
       var Attri: TSynHighlighterAttributes): boolean;                           //L505
 
     {$IFDEF SYN_LAZARUS}
+    function IsLinkable(Y, X1, X2: Integer): Boolean;
     procedure GetWordBoundsAtRowCol(const XY: TPoint; var StartX, EndX: integer);
     function GetLineIndentProposal(Line: integer;
                                    IgnoreCurrentLineText: boolean): integer;
@@ -1039,6 +1044,7 @@
     property OnMouseUp;
     {$IFDEF SYN_LAZARUS}
     property OnClickLink : TMouseEvent read FOnClickLink write FOnClickLink;
+    property OnMouseLink: TSynMouseLinkEvent read FOnMouseLink write FOnMouseLink;
     property OnMouseEnter;
     property OnMouseLeave;
     {$ENDIF}
@@ -3270,7 +3276,10 @@
       exit;
     GetWordBoundsAtRowCol(PhysicalToLogicalPos(fLastMouseCaret),
                           fLastCtrlMouseLinkX1,fLastCtrlMouseLinkX2);
-    if fLastCtrlMouseLinkX1=fLastCtrlMouseLinkX2 then
+    if
+      not IsLinkable(
+        fLastMouseCaret.Y, fLastCtrlMouseLinkX1, fLastCtrlMouseLinkX2)
+    then
       exit;
     fLastCtrlMouseLinkY:=fLastMouseCaret.Y;
     with fMarkupCtrlMouse do begin
@@ -5998,7 +6007,7 @@
   end;
 
 var
-  NewY, NewX1, NewX2: integer;
+  NewY, NewX1, NewX2: Integer;
 begin
   fLastControlIsPressed:=(GetKeyShiftState=[SYNEDIT_LINK_MODIFIER]);
   if (eoShowCtrlMouseLinks in Options) and fLastControlIsPressed
@@ -6006,7 +6015,7 @@
     // show link
     NewY:=fLastMouseCaret.Y;
     GetWordBoundsAtRowCol(PhysicalToLogicalPos(fLastMouseCaret),NewX1,NewX2);
-    if NewX1<>NewX2 then begin
+    if IsLinkable(NewY, NewX1, NewX2) then begin
       // there is a word to underline as link
       if (NewY<>fLastCtrlMouseLinkY)
       or (NewX1<>fLastCtrlMouseLinkX1)
@@ -6075,6 +6084,14 @@
 begin
   Result:=(length(c)=1) and (c[1] in IdentChars);
 end;
+
+function TCustomSynEdit.IsLinkable(Y, X1, X2: Integer): Boolean;
+begin
+  Result := true;
+  if Assigned(FOnMouseLink) then
+    FOnMouseLink(Self, X1, Y, Result);
+end;
+
 {$ENDIF}
 
 procedure TCustomSynEdit.SetBookMark(BookMark: Integer; X: Integer; Y: Integer);
Index: ide/main.pp
===================================================================
--- ide/main.pp	(revision 17810)
+++ ide/main.pp	(working copy)
@@ -353,6 +353,8 @@
       APageIndex: integer; DeleteForwardHistory: boolean);
     procedure OnSrcNoteBookClickLink(Sender: TObject;
       Button: TMouseButton; Shift: TShiftstate; X, Y: Integer);
+    procedure OnSrcNoteBookMouseLink(
+      Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean);
     procedure OnSrcNotebookDeleteLastJumPoint(Sender: TObject);
     procedure OnSrcNotebookEditorVisibleChanged(Sender: TObject);
     procedure OnSrcNotebookEditorChanged(Sender: TObject);
@@ -1776,6 +1778,7 @@
   SourceNotebook.OnAddJumpPoint := @OnSrcNoteBookAddJumpPoint;
   SourceNotebook.OnCloseClicked := @OnSrcNotebookFileClose;
   SourceNotebook.OnClickLink := @OnSrcNoteBookClickLink;
+  SourceNotebook.OnMouseLink := @OnSrcNoteBookMouseLink;
   SourceNotebook.OnCurrentCodeBufferChanged:=@OnSrcNotebookCurCodeBufferChanged;
   SourceNotebook.OnDeleteLastJumpPoint := @OnSrcNotebookDeleteLastJumPoint;
   SourceNotebook.OnEditorVisibleChanged := @OnSrcNotebookEditorVisibleChanged;
@@ -13675,6 +13678,19 @@
   {$ENDIF}
 end;
 
+procedure TMainIDE.OnSrcNoteBookMouseLink(
+  Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean);
+var
+  ActiveSrcEdit: TSourceEditor;
+  ActiveUnitInfo: TUnitInfo;
+  NewSource: TCodeBuffer;
+  NewX, NewY, NewTopLine: integer;
+begin
+  if not BeginCodeTool(ActiveSrcEdit,ActiveUnitInfo,[]) then exit;
+  AllowMouseLink := CodeToolBoss.FindDeclaration(
+    ActiveUnitInfo.Source,X,Y,NewSource,NewX,NewY,NewTopLine);
+end;
+
 procedure TMainIDE.OnSrcNotebookMovingPage(Sender: TObject; OldPageIndex,
   NewPageIndex: integer);
 begin
Index: ide/sourceeditor.lfm
===================================================================
--- ide/sourceeditor.lfm	(revision 17810)
+++ ide/sourceeditor.lfm	(working copy)
@@ -3,13 +3,11 @@
   Height = 300
   Top = 374
   Width = 400
-  HorzScrollBar.Page = 399
-  VertScrollBar.Page = 299
   AllowDropFiles = True
   Caption = 'SourceNotebook'
   ClientHeight = 300
   ClientWidth = 400
-  object StatusBar: TStatusBar
+  object StatusBar: TStatusBar[0]
     Height = 20
     Top = 280
     Width = 400
Index: ide/sourceeditor.pp
===================================================================
--- ide/sourceeditor.pp	(revision 17810)
+++ ide/sourceeditor.pp	(working copy)
@@ -137,6 +137,7 @@
     FOnMouseMove: TMouseMoveEvent;
     FOnMouseDown: TMouseEvent;
     FOnClickLink: TMouseEvent;
+    FOnMouseLink: TSynMouseLinkEvent;
     FOnMouseWheel : tMouseWheelEvent;
     FOnKeyDown: TKeyEvent;
 
@@ -147,6 +148,8 @@
           Shift: TShiftState; X,Y: Integer);
     procedure EditorClickLink(Sender: TObject; Button: TMouseButton;
           Shift: TShiftState; X,Y: Integer);
+    procedure EditorMouseLink(
+      Sender: TObject; X,Y: Integer; var AllowMouseLink: Boolean);
     procedure EditorMouseWheel(Sender: TObject; Shift: TShiftState;
          WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
     procedure EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
@@ -361,6 +364,7 @@
     property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
     property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
     property OnClickLink: TMouseEvent read FOnClickLink write FOnClickLink;
+    property OnMouseLink: TSynMouseLinkEvent read FOnMouseLink write FOnMouseLink;
     property OnMouseWheel: TMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
     property OnKeyDown: TKeyEvent read FOnKeyDown write FOnKeyDown;
     property Owner: TComponent read FAOwner;
@@ -475,6 +479,7 @@
     FOnAddWatchAtCursor: TOnAddWatch;
     FOnCloseClicked: TOnCloseSrcEditor;
     FOnClickLink: TMouseEvent;
+    FOnMouseLink: TSynMouseLinkEvent;
     FOnCurrentCodeBufferChanged: TNotifyEvent;
     FOnDeleteLastJumpPoint: TNotifyEvent;
     FOnEditorChanged: TNotifyEvent;
@@ -571,6 +576,8 @@
                               Shift: TShiftstate; X,Y: Integer);
     procedure EditorClickLink(Sender: TObject; Button: TMouseButton;
                             Shift: TShiftstate; X,Y: Integer);
+    procedure EditorMouseLink(
+      Sender: TObject; X,Y: Integer; var AllowMouseLink: Boolean);
     procedure EditorKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
     procedure EditorMouseWheel(Sender: TObject; Shift: TShiftState;
          WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
@@ -750,6 +757,7 @@
     property OnCloseClicked: TOnCloseSrcEditor
                                      read FOnCloseClicked write FOnCloseClicked;
     property OnClickLink: TMouseEvent read FOnClickLink write FOnClickLink;
+    property OnMouseLink: TSynMouseLinkEvent read FOnMouseLink write FOnMouseLink;
     property OnDeleteLastJumpPoint: TNotifyEvent
                        read FOnDeleteLastJumpPoint write FOnDeleteLastJumpPoint;
     property OnEditorVisibleChanged: TNotifyEvent
@@ -2257,6 +2265,7 @@
       OnMouseWheel := @EditorMouseWheel;
       OnMouseDown := @EditorMouseDown;
       OnClickLink := @EditorClickLink;
+      OnMouseLink := @EditorMouseLink;
       OnKeyDown := @EditorKeyDown;
     end;
     if FCodeTemplates<>nil then
@@ -2669,10 +2678,18 @@
     OnMouseDown(Sender, Button, Shift, X,Y);
 end;
 
+procedure TSourceEditor.EditorMouseLink(
+  Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean);
+begin
+  //DebugLn(['TSourceEditor.EditorMouseLink ',X,',',Y]);
+  if Assigned(OnMouseLink) then
+    OnMouseLink(Sender, X, Y, AllowMouseLink);
+end;
+
 procedure TSourceEditor.EditorClickLink(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
-  DebugLn(['TSourceEditor.EditorClickLink ',X,',',Y]);
+  //DebugLn(['TSourceEditor.EditorClickLink ',X,',',Y]);
   if Assigned(OnClickLink) then
     OnClickLink(Sender, Button, Shift, X,Y);
 end;
@@ -4409,6 +4426,7 @@
   Result.OnMouseDown := @EditorMouseDown;
   Result.OnMouseWheel := @EditorMouseWheel;
   Result.OnClickLink := @EditorClickLink;
+  Result.OnMouseLink := @EditorMouseLink;
   Result.OnKeyDown :=@EditorKeyDown;
 
   Result.EditorComponent.EndUpdate;
@@ -6232,6 +6250,13 @@
 
 end;
 
+procedure TSourceNotebook.EditorMouseLink(
+  Sender: TObject; X, Y: Integer; var AllowMouseLink: Boolean);
+begin
+  if Assigned(OnMouseLink) then
+    OnMouseLink(Sender, X, Y, AllowMouseLink);
+end;
+
 Procedure TSourceNotebook.HintTimer(sender: TObject);
 var
   MousePos: TPoint;
