]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Split in TextWindow and SourceWindow.
authorGuido van Rossum <guido@python.org>
Mon, 27 Jan 1992 16:58:03 +0000 (16:58 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 27 Jan 1992 16:58:03 +0000 (16:58 +0000)
Count lines in Python.

Lib/lib-stdwin/srcwin.py
Lib/stdwin/srcwin.py

index 3f323bad53a427b181648405dd8bf6e29e00ce0d..a71c568ace9031b4030fa8e912fd7921ef095eb4 100644 (file)
@@ -7,58 +7,62 @@ import basewin
 WIDTH = 40
 MAXHEIGHT = 24
 
-class SourceWindow(basewin.BaseWindow):
+
+class TextWindow(basewin.BaseWindow):
        
-       def init(self, filename):
-               self.filename = filename
-               #
-               f = open(self.filename, 'r') # raise exception if not found
-               self.contents = f.read()
-               f.seek(0)
-               self.linecount = len(f.readlines())
-               f.close()
+       def init(self, title, contents):
+               self.contents = contents
+               self.linecount = countlines(self.contents)
                #
                self.lineheight = lh = stdwin.lineheight()
-               self.leftmargin = stdwin.textwidth('00000000')
+               self.leftmargin = self.getmargin()
+               self.top = 0
                self.rightmargin = 30000 # Infinity
                self.bottom = lh * self.linecount
                #
-               stdwin.setdefwinpos(0, 0)
                width = WIDTH*stdwin.textwidth('0')
                height = lh*min(MAXHEIGHT, self.linecount)
                stdwin.setdefwinsize(width, height)
-               self = basewin.BaseWindow.init(self, filename)
+               self = basewin.BaseWindow.init(self, title)
                #
-               self.win.setdocsize(0, self.bottom + lh)
+               self.win.setdocsize(0, self.bottom)
                self.initeditor()
                return self
        
        def initeditor(self):
-               r = (self.leftmargin, 0), (self.rightmargin, self.bottom)
+               r = (self.leftmargin, self.top), (self.rightmargin, self.bottom)
                self.editor = self.win.textcreate(r)
                self.editor.settext(self.contents)
        
        def closeeditor(self):
                self.editor.close()
        
-       def reopen(self):
-               self.closeeditor()
-               basewin.BaseWindow.reopen(self)
-               self.initeditor()
+#      def reopen(self):
+#              self.closeeditor()
+#              basewin.BaseWindow.reopen(self)
+#              self.initeditor()
        
-       def close(self):
-               self.closeeditor()
-               basewin.BaseWindow.close(self)
+       # Override the following two methods to format line numbers differently
        
-       # Override this method to format line numbers differently
        def getmark(self, lineno):
                return `lineno`
        
+       def getmargin(self):
+               return stdwin.textwidth(`self.linecount + 1` + ' ')
+       
+       # Event dispatcher, called from mainloop.mainloop()
+       
        def dispatch(self, event):
                if event[0] == WE_NULL: return # Dummy tested by mainloop
                if event[0] == WE_DRAW or not self.editor.event(event):
                        basewin.BaseWindow.dispatch(self, event)
        
+       # Event handlers
+       
+       def close(self):
+               self.closeeditor()
+               basewin.BaseWindow.close(self)
+       
        def draw(self, detail):
                dummy = self.editor.draw(detail)
                # Draw line numbers
@@ -75,7 +79,9 @@ class SourceWindow(basewin.BaseWindow):
                finally:
                        d.close()
        
-       def changemark(self, lineno):
+       # Calls from outside
+       
+       def changemark(self, lineno): # redraw the mark for a line
                left = 0
                top = (lineno-1) * self.lineheight
                right = self.leftmargin
@@ -87,7 +93,7 @@ class SourceWindow(basewin.BaseWindow):
                finally:
                        d.close()
 
-       def showline(self, lineno):
+       def showline(self, lineno): # scroll to make a line visible
                left = 0
                top = (lineno-1) * self.lineheight
                right = self.leftmargin
@@ -95,6 +101,27 @@ class SourceWindow(basewin.BaseWindow):
                self.win.show((left, top), (right, bottom))
 
 
+# Subroutine to count the number of lines in a string
+
+def countlines(text):
+       n = 0
+       for c in text:
+               if c == '\n': n = n+1
+       if text and text[-1] != '\n': n = n+1 # Partial last line
+       return n
+
+
+class SourceWindow(TextWindow):
+
+       def init(self, filename):
+               self.filename = filename
+               f = open(self.filename, 'r')
+               contents = f.read()
+               f.close()
+               return TextWindow.init(self, self.filename, contents)
+
+# ------------------------------ testing ------------------------------
+
 TESTFILE = 'srcwin.py'
 
 def test():
index 3f323bad53a427b181648405dd8bf6e29e00ce0d..a71c568ace9031b4030fa8e912fd7921ef095eb4 100755 (executable)
@@ -7,58 +7,62 @@ import basewin
 WIDTH = 40
 MAXHEIGHT = 24
 
-class SourceWindow(basewin.BaseWindow):
+
+class TextWindow(basewin.BaseWindow):
        
-       def init(self, filename):
-               self.filename = filename
-               #
-               f = open(self.filename, 'r') # raise exception if not found
-               self.contents = f.read()
-               f.seek(0)
-               self.linecount = len(f.readlines())
-               f.close()
+       def init(self, title, contents):
+               self.contents = contents
+               self.linecount = countlines(self.contents)
                #
                self.lineheight = lh = stdwin.lineheight()
-               self.leftmargin = stdwin.textwidth('00000000')
+               self.leftmargin = self.getmargin()
+               self.top = 0
                self.rightmargin = 30000 # Infinity
                self.bottom = lh * self.linecount
                #
-               stdwin.setdefwinpos(0, 0)
                width = WIDTH*stdwin.textwidth('0')
                height = lh*min(MAXHEIGHT, self.linecount)
                stdwin.setdefwinsize(width, height)
-               self = basewin.BaseWindow.init(self, filename)
+               self = basewin.BaseWindow.init(self, title)
                #
-               self.win.setdocsize(0, self.bottom + lh)
+               self.win.setdocsize(0, self.bottom)
                self.initeditor()
                return self
        
        def initeditor(self):
-               r = (self.leftmargin, 0), (self.rightmargin, self.bottom)
+               r = (self.leftmargin, self.top), (self.rightmargin, self.bottom)
                self.editor = self.win.textcreate(r)
                self.editor.settext(self.contents)
        
        def closeeditor(self):
                self.editor.close()
        
-       def reopen(self):
-               self.closeeditor()
-               basewin.BaseWindow.reopen(self)
-               self.initeditor()
+#      def reopen(self):
+#              self.closeeditor()
+#              basewin.BaseWindow.reopen(self)
+#              self.initeditor()
        
-       def close(self):
-               self.closeeditor()
-               basewin.BaseWindow.close(self)
+       # Override the following two methods to format line numbers differently
        
-       # Override this method to format line numbers differently
        def getmark(self, lineno):
                return `lineno`
        
+       def getmargin(self):
+               return stdwin.textwidth(`self.linecount + 1` + ' ')
+       
+       # Event dispatcher, called from mainloop.mainloop()
+       
        def dispatch(self, event):
                if event[0] == WE_NULL: return # Dummy tested by mainloop
                if event[0] == WE_DRAW or not self.editor.event(event):
                        basewin.BaseWindow.dispatch(self, event)
        
+       # Event handlers
+       
+       def close(self):
+               self.closeeditor()
+               basewin.BaseWindow.close(self)
+       
        def draw(self, detail):
                dummy = self.editor.draw(detail)
                # Draw line numbers
@@ -75,7 +79,9 @@ class SourceWindow(basewin.BaseWindow):
                finally:
                        d.close()
        
-       def changemark(self, lineno):
+       # Calls from outside
+       
+       def changemark(self, lineno): # redraw the mark for a line
                left = 0
                top = (lineno-1) * self.lineheight
                right = self.leftmargin
@@ -87,7 +93,7 @@ class SourceWindow(basewin.BaseWindow):
                finally:
                        d.close()
 
-       def showline(self, lineno):
+       def showline(self, lineno): # scroll to make a line visible
                left = 0
                top = (lineno-1) * self.lineheight
                right = self.leftmargin
@@ -95,6 +101,27 @@ class SourceWindow(basewin.BaseWindow):
                self.win.show((left, top), (right, bottom))
 
 
+# Subroutine to count the number of lines in a string
+
+def countlines(text):
+       n = 0
+       for c in text:
+               if c == '\n': n = n+1
+       if text and text[-1] != '\n': n = n+1 # Partial last line
+       return n
+
+
+class SourceWindow(TextWindow):
+
+       def init(self, filename):
+               self.filename = filename
+               f = open(self.filename, 'r')
+               contents = f.read()
+               f.close()
+               return TextWindow.init(self, self.filename, contents)
+
+# ------------------------------ testing ------------------------------
+
 TESTFILE = 'srcwin.py'
 
 def test():