annotate Lib/lib-stdwin/tablewin.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 913fc9ff43ac
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # Module 'tablewin'
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # Display a table, with per-item actions:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # A1 | A2 | A3 | .... | AN
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 # B1 | B2 | B3 | .... | BN
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # C1 | C2 | C3 | .... | CN
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # .. | .. | .. | .... | ..
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 # Z1 | Z2 | Z3 | .... | ZN
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # Not all columns need to have the same length.
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # The data structure is a list of columns;
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # each column is a list of items.
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # Each item is a pair of a string and an action procedure.
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 # The first item may be a column title.
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 import stdwin
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 import gwin
533
8b4a274e546d Use new stdwinevents.
Guido van Rossum <guido@python.org>
parents: 5
diff changeset
19 from stdwinevents import *
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 def open(title, data): # Public function to open a table window
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # Set geometry parameters (one day, these may be changeable)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 margin = stdwin.textwidth(' ')
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 lineheight = stdwin.lineheight()
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # Geometry calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 colstarts = [0]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 totwidth = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 maxrows = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 for coldata in data:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 # Height calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 rows = len(coldata)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 if rows > maxrows: maxrows = rows
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 # Width calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 width = colwidth(coldata) + margin
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 totwidth = totwidth + width
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 colstarts.append(totwidth)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 # Calculate document and window height
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 docwidth, docheight = totwidth, maxrows*lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 winwidth, winheight = docwidth, docheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 if winwidth > stdwin.textwidth('n')*100: winwidth = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 if winheight > stdwin.lineheight()*30: winheight = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 # Create the window
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 stdwin.setdefwinsize(winwidth, winheight)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 w = gwin.open(title)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 # Set properties and override methods
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 w.data = data
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 w.margin = margin
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 w.lineheight = lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 w.colstarts = colstarts
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 w.totwidth = totwidth
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 w.maxrows = maxrows
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 w.selection = (-1, -1)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 w.lastselection = (-1, -1)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 w.selshown = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 w.setdocsize(docwidth, docheight)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 w.draw = draw
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 w.mup = mup
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 w.arrow = arrow
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 # Return
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 return w
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 def update(w, data): # Change the data
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 # Hide selection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 hidesel(w, w.begindrawing())
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 # Get old geometry parameters
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 margin = w.margin
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 lineheight = w.lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 # Geometry calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 colstarts = [0]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 totwidth = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 maxrows = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 for coldata in data:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 # Height calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 rows = len(coldata)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 if rows > maxrows: maxrows = rows
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 # Width calculations
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 width = colwidth(coldata) + margin
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 totwidth = totwidth + width
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 colstarts.append(totwidth)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 # Calculate document and window height
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 docwidth, docheight = totwidth, maxrows*lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 # Set changed properties and change window size
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 w.data = data
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 w.colstarts = colstarts
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 w.totwidth = totwidth
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 w.maxrows = maxrows
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 w.change((0, 0), (10000, 10000))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 w.setdocsize(docwidth, docheight)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 w.change((0, 0), (docwidth, docheight))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 # Show selection, or forget it if out of range
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 #
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 showsel(w, w.begindrawing())
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 if not w.selshown: w.selection = (-1, -1)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 def colwidth(coldata): # Subroutine to calculate column width
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 maxwidth = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 for string, action in coldata:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 width = stdwin.textwidth(string)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 if width > maxwidth: maxwidth = width
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 return maxwidth
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 def draw(w, ((left, top), (right, bottom))): # Draw method
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 ileft = whichcol(w, left)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 iright = whichcol(w, right-1) + 1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 if iright > len(w.data): iright = len(w.data)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 itop = divmod(top, w.lineheight)[0]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130 if itop < 0: itop = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131 ibottom, remainder = divmod(bottom, w.lineheight)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 if remainder: ibottom = ibottom + 1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 d = w.begindrawing()
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 if ileft <= w.selection[0] < iright:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if itop <= w.selection[1] < ibottom:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 hidesel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 d.erase((left, top), (right, bottom))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 for i in range(ileft, iright):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 col = w.data[i]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140 jbottom = len(col)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141 if ibottom < jbottom: jbottom = ibottom
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 h = w.colstarts[i]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 v = itop * w.lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 for j in range(itop, jbottom):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 string, action = col[j]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 d.text((h, v), string)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 v = v + w.lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 showsel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 def mup(w, detail): # Mouse up method
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 (h, v), nclicks, button, mask = detail
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 icol = whichcol(w, h)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 if 0 <= icol < len(w.data):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 irow = divmod(v, w.lineheight)[0]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 col = w.data[icol]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 if 0 <= irow < len(col):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 string, action = col[irow]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 action(w, string, (icol, irow), detail)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 def whichcol(w, h): # Return column number (may be >= len(w.data))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 for icol in range(0, len(w.data)):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 if h < w.colstarts[icol+1]:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 return icol
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 return len(w.data)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 def arrow(w, type):
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 533
diff changeset
167 if type == WC_LEFT:
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 incr = -1, 0
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 533
diff changeset
169 elif type == WC_UP:
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 incr = 0, -1
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 533
diff changeset
171 elif type == WC_RIGHT:
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 incr = 1, 0
559
683edb0c4463 New == syntax
Guido van Rossum <guido@python.org>
parents: 533
diff changeset
173 elif type == WC_DOWN:
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 incr = 0, 1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 else:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 return
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 icol, irow = w.lastselection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 icol = icol + incr[0]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 if icol < 0: icol = len(w.data)-1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 if icol >= len(w.data): icol = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 if 0 <= icol < len(w.data):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 irow = irow + incr[1]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 if irow < 0: irow = len(w.data[icol]) - 1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184 if irow >= len(w.data[icol]): irow = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 else:
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 irow = 0
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 if 0 <= icol < len(w.data) and 0 <= irow < len(w.data[icol]):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 w.lastselection = icol, irow
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 string, action = w.data[icol][irow]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 detail = (0, 0), 1, 1, 1
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 action(w, string, (icol, irow), detail)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 # Selection management
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 # TO DO: allow multiple selected entries
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 def select(w, selection): # Public function to set the item selection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 d = w.begindrawing()
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 hidesel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 w.selection = selection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 showsel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 if w.selshown: lastselection = selection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 def hidesel(w, d): # Hide the selection, if shown
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 if w.selshown: invertsel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 def showsel(w, d): # Show the selection, if hidden
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 if not w.selshown: invertsel(w, d)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 def invertsel(w, d): # Invert the selection, if valid
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 icol, irow = w.selection
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 if 0 <= icol < len(w.data) and 0 <= irow < len(w.data[icol]):
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 left = w.colstarts[icol]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 right = w.colstarts[icol+1]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 top = irow * w.lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 bottom = (irow+1) * w.lineheight
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 d.invert((left, top), (right, bottom))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 w.selshown = (not w.selshown)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 # Demonstration
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 def demo_action(w, string, (icol, irow), detail): # Action function for demo
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 select(w, (irow, icol))
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 def demo(): # Demonstration
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 da = demo_action # shorthand
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 col0 = [('a1', da), ('bbb1', da), ('c1', da)]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 col1 = [('a2', da), ('bbb2', da)]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 col2 = [('a3', da), ('b3', da), ('c3', da), ('d4', da), ('d5', da)]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 col3 = []
4365
913fc9ff43ac Change to always call list.append with a single argument.
Guido van Rossum <guido@python.org>
parents: 559
diff changeset
232 for i in range(1, 31): col3.append(('xxx' + `i`, da))
5
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 data = [col0, col1, col2, col3]
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 w = open('tablewin.demo', data)
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 gwin.mainloop()
5570dbb1ce55 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 return w