annotate Demo/stdwin/microedit.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 73758db2f464
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4573
73758db2f464 /usr/local/bin/python -> /usr/bin/env python
Guido van Rossum <guido@python.org>
parents: 1120
diff changeset
1 #! /usr/bin/env python
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # A minimal single-window text editor using STDWIN's text objects.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # Usage: microedit file
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # This is not intended as a real application but as an introduction
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # to STDWIN programming in Python, especially text objects.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # Once you understand microedit.py, study miniedit.py to learn
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # about multiple windows and menus, cut and paste, etc.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 import sys
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 import stdwin
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 from stdwinevents import *
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 # Main program
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 def main():
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Get the filename argument and read its contents as one very
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # large string.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 # An exception will terminate the program if there is no argument
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # or if the file could not be read...
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 filename = sys.argv[1]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 fp = open(filename, 'r')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 contents = fp.read()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 del fp # Close the file
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 # Create the window, using the filename as window title
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 window = stdwin.open(filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 # Add a simple File menu to the window with two items
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 filemenu = window.menucreate('File')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 filemenu.additem('Save', 'S') # Item 0 (shortcut Meta-S)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 filemenu.additem('Save As...') # Item 1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 # Create a text object occupying the entire window
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 # and fill it with the file's contents
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 corner = window.getwinsize() # (width, height)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 area = (0, 0), corner # Rectangle as large as the window
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 text = window.textcreate(area)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 text.settext(contents)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 del contents # Get rid of contents object
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 fix_textsize(window, text) # Set document size accordingly
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 # Main event loop -- stop if a close request comes in.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 # STDWIN applications should regularly call stdwin.getevent()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 # otherwise the windows won't function as expected.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 while 1:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # Get the next event
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 type, w, detail = e = stdwin.getevent()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 # Event decoding switch
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if type == WE_CLOSE:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 break # Stop (no check for saved file!)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 elif type == WE_SIZE:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 # The window was resized --
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 # let the text object recompute the line breaks
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 # and change the document size accordingly,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 # so scroll bars will work
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 fix_textsize(window, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 elif type == WE_MENU:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 # Execute a file menu request (our only menu)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 menu, item = detail
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 if item == 0:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 # "Save": save to the current filename
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 dummy = save_file(window, text, filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 elif item == 1:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 # "Save As": ask a new filename, save to it,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 # and make it the current filename
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 # NB: askfile raises KeyboardInterrupt
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 # if the user cancels the dialog, hence
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 # the try statement
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 newfile = stdwin.askfile( \
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 'Save as:', filename, 1)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 except KeyboardInterrupt:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 newfile = ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 if newfile:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 if save_file(window, text, newfile):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 filename = newfile
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 window.settitle(filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 elif text.event(e):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 # The text object has handled the event.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 # Fix the document size if necessary.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 # Note: this sometimes fixes the size
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 # unnecessarily, e.g., for arrow keys.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 if type in (WE_CHAR, WE_COMMAND):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 fix_docsize(window, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 # Save the window's contents to the filename.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 # If the open() fails, put up a warning message and return 0;
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 # if the save succeeds, return 1.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 def save_file(window, text, filename):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 # Open the file for writing, handling exceptions
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 fp = open(filename, 'w')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 except RuntimeError:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 stdwin.message('Cannot create ' + filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 return 0
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 # Get the contents of the text object as one very long string
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 contents = text.gettext()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 # Write the contents to the file
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 fp.write(contents)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 # The file is automatically closed when this routine returns
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 return 1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 # Change the size of the text object to fit in the window,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 # and then fix the window's document size to fit around the text object.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 def fix_textsize(window, text):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 # Compute a rectangle as large as the window
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 corner = window.getwinsize() # (width, height)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 area = (0, 0), (corner)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 # Move the text object to this rectangle.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 # Note: text.move() ignores the bottom coordinate!
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 text.move(area)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 # Now fix the document size accordingly
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 fix_docsize(window, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 # Fix the document size, after the text has changed
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 def fix_docsize(window, text):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 # Get the actual rectangle occupied by the text object.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 # This has the same left, top and right, but a different bottom.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 area = text.getrect()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 # Compute the true height of the text object
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 origin, corner = area
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 width, height = corner
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 # Set the document height to the text object's height.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 # The width is zero since we don't want a horizontal scroll bar.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 window.setdocsize(0, height)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 # Once all functions are defined, call main()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 main()