annotate Lib/stdwin/srcwin.py @ 4566:6403c94de50d legacy-trunk

Added safeguard against failure in __del__.
author Guido van Rossum <guido@python.org>
date Wed, 27 Nov 1996 19:39:58 +0000
parents 560ec7030817
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # srcwin.py -- a source listing window
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import stdwin
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 from stdwinevents import *
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 import basewin
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 WIDTH = 40
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 MAXHEIGHT = 24
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
10
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
11 class TextWindow(basewin.BaseWindow):
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 647
diff changeset
13 def __init__(self, title, contents):
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
14 self.contents = contents
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
15 self.linecount = countlines(self.contents)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 #
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 self.lineheight = lh = stdwin.lineheight()
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
18 self.leftmargin = self.getmargin()
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
19 self.top = 0
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 self.rightmargin = 30000 # Infinity
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 self.bottom = lh * self.linecount
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 #
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 width = WIDTH*stdwin.textwidth('0')
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 height = lh*min(MAXHEIGHT, self.linecount)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 stdwin.setdefwinsize(width, height)
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 647
diff changeset
26 basewin.BaseWindow.__init__(self, title)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
28 self.win.setdocsize(0, self.bottom)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 self.initeditor()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 def initeditor(self):
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
32 r = (self.leftmargin, self.top), (self.rightmargin, self.bottom)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 self.editor = self.win.textcreate(r)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 self.editor.settext(self.contents)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 def closeeditor(self):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 self.editor.close()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
39 # def reopen(self):
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
40 # self.closeeditor()
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
41 # basewin.BaseWindow.reopen(self)
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
42 # self.initeditor()
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
44 # Override the following two methods to format line numbers differently
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 def getmark(self, lineno):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 return `lineno`
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
49 def getmargin(self):
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
50 return stdwin.textwidth(`self.linecount + 1` + ' ')
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
51
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
52 # Event dispatcher, called from mainloop.mainloop()
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
53
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 def dispatch(self, event):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 if event[0] == WE_NULL: return # Dummy tested by mainloop
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if event[0] == WE_DRAW or not self.editor.event(event):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 basewin.BaseWindow.dispatch(self, event)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
59 # Event handlers
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
60
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
61 def close(self):
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
62 self.closeeditor()
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
63 basewin.BaseWindow.close(self)
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
64
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 def draw(self, detail):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 dummy = self.editor.draw(detail)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 # Draw line numbers
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 (left, top), (right, bottom) = detail
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 topline = top/self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 botline = bottom/self.lineheight + 1
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 botline = min(self.linecount, botline)
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 d = self.win.begindrawing()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 try:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 h, v = 0, self.lineheight * topline
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 for lineno in range(topline+1, botline+1):
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 d.text((h, v), self.getmark(lineno))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 v = v + self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 finally:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 d.close()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
81 # Calls from outside
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
82
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
83 def changemark(self, lineno): # redraw the mark for a line
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 left = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 top = (lineno-1) * self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 right = self.leftmargin
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 bottom = lineno * self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 d = self.win.begindrawing()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 try:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 d.erase((left, top), (right, bottom))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 d.text((left, top), self.getmark(lineno))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 finally:
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 d.close()
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
95 def showline(self, lineno): # scroll to make a line visible
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 left = 0
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 top = (lineno-1) * self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 right = self.leftmargin
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 bottom = lineno * self.lineheight
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 self.win.show((left, top), (right, bottom))
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
103 # Subroutine to count the number of lines in a string
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
104
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
105 def countlines(text):
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
106 n = 0
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
107 for c in text:
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
108 if c == '\n': n = n+1
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
109 if text and text[-1] != '\n': n = n+1 # Partial last line
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
110 return n
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
111
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
112
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
113 class SourceWindow(TextWindow):
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
114
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 647
diff changeset
115 def __init__(self, filename):
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
116 self.filename = filename
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
117 f = open(self.filename, 'r')
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
118 contents = f.read()
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
119 f.close()
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 647
diff changeset
120 TextWindow.__init__(self, self.filename, contents)
647
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
121
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
122 # ------------------------------ testing ------------------------------
8bba14f7db8a Split in TextWindow and SourceWindow.
Guido van Rossum <guido@python.org>
parents: 622
diff changeset
123
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 TESTFILE = 'srcwin.py'
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 def test():
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 import mainloop
1435
560ec7030817 * Mass change: get rid of all init() methods, in favor of __init__()
Guido van Rossum <guido@python.org>
parents: 647
diff changeset
128 sw = SourceWindow(TESTFILE)
622
a0d4c5ef1d5d Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 mainloop.mainloop()