bpo-33768: IDLE: Clicking on code context line moves it to top of editor (GH-7411)

(cherry picked from commit 041272b657867f5bec925b19aabf23944125d49b)

Co-authored-by: Cheryl Sabella <cheryl.sabella@gmail.com>
diff --git a/Lib/idlelib/codecontext.py b/Lib/idlelib/codecontext.py
index 73d3ba6..8b378bc 100644
--- a/Lib/idlelib/codecontext.py
+++ b/Lib/idlelib/codecontext.py
@@ -117,6 +117,7 @@
                     height=1,
                     width=1,  # Don't request more than we get.
                     padx=padx, border=border, relief=SUNKEN, state='disabled')
+            self.context.bind('<ButtonRelease-1>', self.jumptoline)
             # Pack the context widget before and above the text_frame widget,
             # thus ensuring that it will appear directly above text_frame.
             self.context.pack(side=TOP, fill=X, expand=False,
@@ -196,6 +197,20 @@
         self.context.insert('end', '\n'.join(context_strings[showfirst:]))
         self.context['state'] = 'disabled'
 
+    def jumptoline(self, event=None):
+        "Show clicked context line at top of editor."
+        lines = len(self.info)
+        if lines == 1:  # No context lines are showing.
+            newtop = 1
+        else:
+            # Line number clicked.
+            contextline = int(float(self.context.index('insert')))
+            # Lines not displayed due to maxlines.
+            offset = max(1, lines - self.context_depth) - 1
+            newtop = self.info[offset + contextline][0]
+        self.text.yview(f'{newtop}.0')
+        self.update_code_context()
+
     def timer_event(self):
         "Event on editor text widget triggered every UPDATEINTERVAL ms."
         if self.context: