blob: 29b78010a616b9060aec78d8427c38f5db4075fa [file] [log] [blame]
Guido van Rossumbabe2bf1992-01-22 22:21:31 +00001# srcwin.py -- a source listing window
2
3import stdwin
4from stdwinevents import *
5import basewin
6
7WIDTH = 40
8MAXHEIGHT = 24
9
Guido van Rossum6fd42b81992-01-27 16:58:03 +000010
11class TextWindow(basewin.BaseWindow):
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000012
Guido van Rossum7bc817d1993-12-17 15:25:27 +000013 def __init__(self, title, contents):
Guido van Rossum6fd42b81992-01-27 16:58:03 +000014 self.contents = contents
15 self.linecount = countlines(self.contents)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000016 #
17 self.lineheight = lh = stdwin.lineheight()
Guido van Rossum6fd42b81992-01-27 16:58:03 +000018 self.leftmargin = self.getmargin()
19 self.top = 0
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000020 self.rightmargin = 30000 # Infinity
21 self.bottom = lh * self.linecount
22 #
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000023 width = WIDTH*stdwin.textwidth('0')
24 height = lh*min(MAXHEIGHT, self.linecount)
25 stdwin.setdefwinsize(width, height)
Guido van Rossum7bc817d1993-12-17 15:25:27 +000026 basewin.BaseWindow.__init__(self, title)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000027 #
Guido van Rossum6fd42b81992-01-27 16:58:03 +000028 self.win.setdocsize(0, self.bottom)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000029 self.initeditor()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000030
31 def initeditor(self):
Guido van Rossum6fd42b81992-01-27 16:58:03 +000032 r = (self.leftmargin, self.top), (self.rightmargin, self.bottom)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000033 self.editor = self.win.textcreate(r)
34 self.editor.settext(self.contents)
35
36 def closeeditor(self):
37 self.editor.close()
38
Guido van Rossum6fd42b81992-01-27 16:58:03 +000039# def reopen(self):
40# self.closeeditor()
41# basewin.BaseWindow.reopen(self)
42# self.initeditor()
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000043
Guido van Rossum6fd42b81992-01-27 16:58:03 +000044 # Override the following two methods to format line numbers differently
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000045
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000046 def getmark(self, lineno):
47 return `lineno`
48
Guido van Rossum6fd42b81992-01-27 16:58:03 +000049 def getmargin(self):
50 return stdwin.textwidth(`self.linecount + 1` + ' ')
51
52 # Event dispatcher, called from mainloop.mainloop()
53
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000054 def dispatch(self, event):
55 if event[0] == WE_NULL: return # Dummy tested by mainloop
56 if event[0] == WE_DRAW or not self.editor.event(event):
57 basewin.BaseWindow.dispatch(self, event)
58
Guido van Rossum6fd42b81992-01-27 16:58:03 +000059 # Event handlers
60
61 def close(self):
62 self.closeeditor()
63 basewin.BaseWindow.close(self)
64
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000065 def draw(self, detail):
66 dummy = self.editor.draw(detail)
67 # Draw line numbers
68 (left, top), (right, bottom) = detail
69 topline = top/self.lineheight
70 botline = bottom/self.lineheight + 1
71 botline = min(self.linecount, botline)
72 d = self.win.begindrawing()
73 try:
74 h, v = 0, self.lineheight * topline
75 for lineno in range(topline+1, botline+1):
76 d.text((h, v), self.getmark(lineno))
77 v = v + self.lineheight
78 finally:
79 d.close()
80
Guido van Rossum6fd42b81992-01-27 16:58:03 +000081 # Calls from outside
82
83 def changemark(self, lineno): # redraw the mark for a line
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000084 left = 0
85 top = (lineno-1) * self.lineheight
86 right = self.leftmargin
87 bottom = lineno * self.lineheight
88 d = self.win.begindrawing()
89 try:
90 d.erase((left, top), (right, bottom))
91 d.text((left, top), self.getmark(lineno))
92 finally:
93 d.close()
94
Guido van Rossum6fd42b81992-01-27 16:58:03 +000095 def showline(self, lineno): # scroll to make a line visible
Guido van Rossumbabe2bf1992-01-22 22:21:31 +000096 left = 0
97 top = (lineno-1) * self.lineheight
98 right = self.leftmargin
99 bottom = lineno * self.lineheight
100 self.win.show((left, top), (right, bottom))
101
102
Guido van Rossum6fd42b81992-01-27 16:58:03 +0000103# Subroutine to count the number of lines in a string
104
105def countlines(text):
106 n = 0
107 for c in text:
108 if c == '\n': n = n+1
109 if text and text[-1] != '\n': n = n+1 # Partial last line
110 return n
111
112
113class SourceWindow(TextWindow):
114
Guido van Rossum7bc817d1993-12-17 15:25:27 +0000115 def __init__(self, filename):
Guido van Rossum6fd42b81992-01-27 16:58:03 +0000116 self.filename = filename
117 f = open(self.filename, 'r')
118 contents = f.read()
119 f.close()
Guido van Rossum7bc817d1993-12-17 15:25:27 +0000120 TextWindow.__init__(self, self.filename, contents)
Guido van Rossum6fd42b81992-01-27 16:58:03 +0000121
122# ------------------------------ testing ------------------------------
123
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000124TESTFILE = 'srcwin.py'
125
126def test():
127 import mainloop
Guido van Rossum7bc817d1993-12-17 15:25:27 +0000128 sw = SourceWindow(TESTFILE)
Guido van Rossumbabe2bf1992-01-22 22:21:31 +0000129 mainloop.mainloop()