annotate Lib/idlelib/CodeContext.py @ 79691:05c8928362ee

Merge __next__ method link fixes with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Fri, 12 Oct 2012 13:46:37 +0300
parents ef4cca2d6171
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 """
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
12 import tkinter
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
13 from tkinter.constants 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
44277
9a09d442bce2 maxint->maxsize. Wouldn't import.
Kurt B. Kaiser <kbk@shore.net>
parents: 42714
diff changeset
15 from sys import maxsize as INFINITY
42714
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
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
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 35691
diff changeset
18 BLOCKOPENERS = set(["class", "def", "elif", "else", "except", "finally", "for",
39610
3674f20ac781 Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents: 39442
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:
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
57 # Calculate the border width and horizontal padding required to
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
58 # align the context with the text in the main Text widget.
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
59 #
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
60 # All values are passed through int(str(<value>)), since some
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
61 # values may be pixel objects, which can't simply be added to ints.
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
62 widgets = self.editwin.text, self.editwin.text_frame
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
63 # Calculate the required vertical padding
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
64 padx = 0
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
65 for widget in widgets:
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
66 padx += int(str( widget.pack_info()['padx'] ))
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
67 padx += int(str( widget.cget('padx') ))
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
68 # Calculate the required border width
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
69 border = 0
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
70 for widget in widgets:
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
71 border += int(str( widget.cget('border') ))
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 44277
diff changeset
72 self.label = tkinter.Label(self.editwin.top,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
73 text="\n" * (self.context_depth - 1),
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
74 anchor=W, justify=LEFT,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
75 font=self.textfont,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
76 bg=self.bgcolor, fg=self.fgcolor,
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
diff changeset
77 width=1, #don't request more than we get
40893
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
78 padx=padx, border=border,
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
79 relief=SUNKEN)
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
80 # Pack the label widget before and above the text_frame widget,
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
81 # thus ensuring that it will appear directly above text_frame
32c4897b5d46 Merged revisions 53623-53858 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 40742
diff changeset
82 self.label.pack(side=TOP, fill=X, expand=False,
40450
cc992d75d5b3 Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents: 39610
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.
41642
a6eb6acfe04a Merged revisions 55007-55179 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 40893
diff changeset
120 for linenum in range(new_topvisible, stopline-1, -1):
35690
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)