annotate Lib/idlelib/CodeContext.py @ 80661:94de77bd0b4b 2.7

Issue #16194: document imp.load_dynamic problems when read several extension modules from the same binary object file.
author Andrew Svetlov <andrew.svetlov@gmail.com>
date Thu, 29 Nov 2012 19:51:28 +0200
parents eab361617f6a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
1 """CodeContext - Extension to display the block context above the edit window
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
2
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
3 Once code has scrolled off the top of a window, it can be difficult to
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
4 determine which block you are in. This extension implements a pane at the top
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
5 of each IDLE edit window which provides block structure hints. These hints are
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
6 the lines which contain the block opening keywords, e.g. 'if', for the
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
7 enclosing block. The number of hint lines is determined by the numlines
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
8 variable in the CodeContext section of config-extensions.def. Lines which do
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
9 not open blocks are not shown in the context hints pane.
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
10
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
11 """
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
12 import Tkinter
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
13 from Tkconstants import TOP, LEFT, X, W, SUNKEN
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
14 import re
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
15 from sys import maxint as INFINITY
60144
eab361617f6a #7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents: 47183
diff changeset
16 from idlelib.configHandler import idleConf
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
17
39108
008941521805 Remove usage of sets module (patch #1500609).
Georg Brandl <georg@python.org>
parents: 35691
diff changeset
18 BLOCKOPENERS = set(["class", "def", "elif", "else", "except", "finally", "for",
39509
95f656690a00 The 'with' statement is now a Code Context block opener
Kurt B. Kaiser <kbk@shore.net>
parents: 39108
diff changeset
19 "if", "try", "while", "with"])
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
20 UPDATEINTERVAL = 100 # millisec
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
21 FONTUPDATEINTERVAL = 1000 # millisec
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
22
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
23 getspacesfirstword =\
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
24 lambda s, c=re.compile(r"^(\s*)(\w*)"): c.match(s).groups()
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
25
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
26 class CodeContext:
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
27 menudefs = [('options', [('!Code Conte_xt', '<<toggle-code-context>>')])]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
28 context_depth = idleConf.GetOption("extensions", "CodeContext",
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
29 "numlines", type="int", default=3)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
30 bgcolor = idleConf.GetOption("extensions", "CodeContext",
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
31 "bgcolor", type="str", default="LightGray")
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
32 fgcolor = idleConf.GetOption("extensions", "CodeContext",
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
33 "fgcolor", type="str", default="Black")
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
34 def __init__(self, editwin):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
35 self.editwin = editwin
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
36 self.text = editwin.text
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
37 self.textfont = self.text["font"]
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
38 self.label = None
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
39 # self.info is a list of (line number, indent level, line text, block
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
40 # keyword) tuples providing the block structure associated with
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
41 # self.topvisible (the linenumber of the line displayed at the top of
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
42 # the edit window). self.info[0] is initialized as a 'dummy' line which
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
43 # starts the toplevel 'block' of the module.
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
44 self.info = [(0, -1, "", False)]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
45 self.topvisible = 1
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
46 visible = idleConf.GetOption("extensions", "CodeContext",
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
47 "visible", type="bool", default=False)
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
48 if visible:
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
49 self.toggle_code_context_event()
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
50 self.editwin.setvar('<<toggle-code-context>>', True)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
51 # Start two update cycles, one for context lines, one for font changes.
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
52 self.text.after(UPDATEINTERVAL, self.timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
53 self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
54
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
55 def toggle_code_context_event(self, event=None):
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
56 if not self.label:
40749
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
57 # Calculate the border width and horizontal padding required to
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
58 # align the context with the text in the main Text widget.
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
59 #
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
60 # All values are passed through int(str(<value>)), since some
40749
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
61 # values may be pixel objects, which can't simply be added to ints.
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
62 widgets = self.editwin.text, self.editwin.text_frame
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
63 # Calculate the required vertical padding
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
64 padx = 0
40749
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
65 for widget in widgets:
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
66 padx += int(str( widget.pack_info()['padx'] ))
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
67 padx += int(str( widget.cget('padx') ))
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
68 # Calculate the required border width
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
69 border = 0
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
70 for widget in widgets:
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
71 border += int(str( widget.cget('border') ))
47183
b53604fad54b Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents: 47101
diff changeset
72 self.label = Tkinter.Label(self.editwin.top,
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
73 text="\n" * (self.context_depth - 1),
40749
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
74 anchor=W, justify=LEFT,
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
75 font=self.textfont,
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
76 bg=self.bgcolor, fg=self.fgcolor,
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
77 width=1, #don't request more than we get
40749
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
78 padx=padx, border=border,
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
79 relief=SUNKEN)
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
80 # Pack the label widget before and above the text_frame widget,
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
81 # thus ensuring that it will appear directly above text_frame
0528d6f94eb6 Updated patch (CodeContext.061217.patch) to
Kurt B. Kaiser <kbk@shore.net>
parents: 40732
diff changeset
82 self.label.pack(side=TOP, fill=X, expand=False,
40383
93dbfc654b6a Patch #1362975: Rework CodeContext indentation algorithm to
Martin v. Löwis <martin@v.loewis.de>
parents: 39509
diff changeset
83 before=self.editwin.text_frame)
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
84 else:
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
85 self.label.destroy()
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
86 self.label = None
32272
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
87 idleConf.SetOption("extensions", "CodeContext", "visible",
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
88 str(self.label is not None))
014b0d84422f Noam Raphel: Further developemt of CodeContext feature.
Kurt B. Kaiser <kbk@shore.net>
parents: 31949
diff changeset
89 idleConf.SaveUserCfgFiles()
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
90
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
91 def get_line_info(self, linenum):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
92 """Get the line indent value, text, and any block start keyword
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
93
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
94 If the line does not start a block, the keyword value is False.
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
95 The indentation of empty lines (or comment lines) is INFINITY.
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
96
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
97 """
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
98 text = self.text.get("%d.0" % linenum, "%d.end" % linenum)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
99 spaces, firstword = getspacesfirstword(text)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
100 opener = firstword in BLOCKOPENERS and firstword
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
101 if len(text) == len(spaces) or text[len(spaces)] == '#':
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
102 indent = INFINITY
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
103 else:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
104 indent = len(spaces)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
105 return indent, text, opener
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
106
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
107 def get_context(self, new_topvisible, stopline=1, stopindent=0):
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
108 """Get context lines, starting at new_topvisible and working backwards.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
109
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
110 Stop when stopline or stopindent is reached. Return a tuple of context
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
111 data and the indent level at the top of the region inspected.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
112
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
113 """
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
114 assert stopline > 0
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
115 lines = []
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
116 # The indentation level we are currently in:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
117 lastindent = INFINITY
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
118 # For a line to be interesting, it must begin with a block opening
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
119 # keyword, and have less indentation than lastindent.
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
120 for linenum in xrange(new_topvisible, stopline-1, -1):
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
121 indent, text, opener = self.get_line_info(linenum)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
122 if indent < lastindent:
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
123 lastindent = indent
31949
3838cdee1a20 Fix a bug I introduced which causes all block openers at an indent level
Kurt B. Kaiser <kbk@shore.net>
parents: 31947
diff changeset
124 if opener in ("else", "elif"):
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
125 # We also show the if statement
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
126 lastindent += 1
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
127 if opener and linenum < new_topvisible and indent >= stopindent:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
128 lines.append((linenum, indent, text, opener))
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
129 if lastindent <= stopindent:
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
130 break
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
131 lines.reverse()
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
132 return lines, lastindent
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
133
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
134 def update_code_context(self):
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
135 """Update context information and lines visible in the context pane.
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
136
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
137 """
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
138 new_topvisible = int(self.text.index("@0,0").split('.')[0])
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
139 if self.topvisible == new_topvisible: # haven't scrolled
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
140 return
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
141 if self.topvisible < new_topvisible: # scroll down
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
142 lines, lastindent = self.get_context(new_topvisible,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
143 self.topvisible)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
144 # retain only context info applicable to the region
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
145 # between topvisible and new_topvisible:
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
146 while self.info[-1][1] >= lastindent:
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
147 del self.info[-1]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
148 elif self.topvisible > new_topvisible: # scroll up
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
149 stopindent = self.info[-1][1] + 1
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
150 # retain only context info associated
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
151 # with lines above new_topvisible:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
152 while self.info[-1][0] >= new_topvisible:
35668
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
153 stopindent = self.info[-1][1]
84541731b166 Increased performance in CodeContext extension Patch 936169 Noam Raphael
Kurt B. Kaiser <kbk@shore.net>
parents: 32272
diff changeset
154 del self.info[-1]
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
155 lines, lastindent = self.get_context(new_topvisible,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
156 self.info[-1][0]+1,
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
157 stopindent)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
158 self.info.extend(lines)
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
159 self.topvisible = new_topvisible
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
160 # empty lines in context pane:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
161 context_strings = [""] * max(0, self.context_depth - len(self.info))
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
162 # followed by the context hint lines:
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
163 context_strings += [x[2] for x in self.info[-self.context_depth:]]
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
164 self.label["text"] = '\n'.join(context_strings)
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
165
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
166 def timer_event(self):
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
167 if self.label:
35690
548bad215429 Tweak CodeContext.py docstrings, comments, and names.
Kurt B. Kaiser <kbk@shore.net>
parents: 35668
diff changeset
168 self.update_code_context()
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
169 self.text.after(UPDATEINTERVAL, self.timer_event)
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
170
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
171 def font_timer_event(self):
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
172 newtextfont = self.text["font"]
31947
765fe16f665b 1. Add an Options menu entry: Code Context
Kurt B. Kaiser <kbk@shore.net>
parents: 31937
diff changeset
173 if self.label and newtextfont != self.textfont:
31937
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
174 self.textfont = newtextfont
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
175 self.label["font"] = self.textfont
ff5a31a71d9a - New Extension: CodeContext. Provides block structuring hints for code
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
176 self.text.after(FONTUPDATEINTERVAL, self.font_timer_event)