Mercurial > cpython-lru_cache-weakref
annotate Mac/Tools/IDE/PyBrowser.py @ 27998:e27f58a50737 legacy-trunk
SF bug #690377: Dud footnote reference in distutils docs
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Fri, 21 Feb 2003 02:47:09 +0000 |
| parents | 50173ea1fd44 |
| children | c3a096bfbd6b |
| rev | line source |
|---|---|
| 10047 | 1 import W |
| 2 import Wkeys | |
| 3 import struct | |
| 4 import string | |
| 5 import types | |
|
16725
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
6 import re |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
7 from Carbon import Qd, Icn, Fm, QuickDraw |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
8 from Carbon.QuickDraw import hilitetransfermode |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
9 |
| 10047 | 10 |
| 11 nullid = '\0\0' | |
| 12 closedid = struct.pack('h', 468) | |
| 13 openid = struct.pack('h', 469) | |
| 14 closedsolidid = struct.pack('h', 470) | |
| 15 opensolidid = struct.pack('h', 471) | |
| 16 | |
| 17 arrows = (nullid, closedid, openid, closedsolidid, opensolidid) | |
| 18 | |
|
18453
e78a51268c81
- fixed some re usage, partly so it'll still work when re uses pre instead
Just van Rossum <just@letterror.com>
parents:
18167
diff
changeset
|
19 has_ctlcharsRE = re.compile(r'[\000-\037\177-\377]') |
|
16725
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
20 def ctlcharsREsearch(str): |
|
16918
6d59817cf792
Silly typo which caused the stack browser to crash.
Jack Jansen <jack.jansen@cwi.nl>
parents:
16725
diff
changeset
|
21 if has_ctlcharsRE.search(str) is None: |
|
16725
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
22 return -1 |
|
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
23 return 1 |
|
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
24 |
| 10047 | 25 def double_repr(key, value, truncvalue = 0, |
| 26 type = type, StringType = types.StringType, | |
|
16725
d170c1e772c5
Use re in stead of regex, so we get rid of the annoying warning during startup.
Jack Jansen <jack.jansen@cwi.nl>
parents:
15282
diff
changeset
|
27 has_ctlchars = ctlcharsREsearch, _repr = repr, str = str): |
| 10047 | 28 if type(key) == StringType and has_ctlchars(key) < 0: |
| 29 key = str(key) | |
| 30 else: | |
| 31 key = _repr(key) | |
|
11422
7fb8b0f13da0
String values will now always be shown with quotes, so one can see the difference between the value 2 and the value '2'. -- jvr
Just van Rossum <just@lettererror.com>
parents:
10087
diff
changeset
|
32 if key == '__builtins__': |
| 10047 | 33 value = "<" + type(value).__name__ + " '__builtin__'>" |
| 34 elif key == '__return__': | |
| 35 # bleh, when returning from a class codeblock we get infinite recursion in repr. | |
| 36 # Use safe repr instead. | |
| 37 import repr | |
| 38 value = repr.repr(value) | |
| 39 else: | |
| 40 try: | |
| 41 value = _repr(value) | |
| 42 '' + value # test to see if it is a string, in case a __repr__ method is buggy | |
| 43 except: | |
|
18167
c5ac6f055c62
Some long overdue maintainance. Made all IDE sources 7-bit-clean, to avoid any further encoding conversion troubles.
Just van Rossum <just@letterror.com>
parents:
17845
diff
changeset
|
44 value = '\xa5\xa5\xa5 exception in repr()' |
| 10047 | 45 if truncvalue: |
| 46 return key + '\t' + value[:255] | |
| 47 return key + '\t' + value | |
| 48 | |
| 49 | |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
50 def truncString(s, maxwid): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
51 if maxwid < 1: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
52 return 1, "" |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
53 strlen = len(s) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
54 strwid = Qd.TextWidth(s, 0, strlen); |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
55 if strwid <= maxwid: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
56 return 0, s |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
57 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
58 Qd.TextFace(QuickDraw.condense) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
59 strwid = Qd.TextWidth(s, 0, strlen) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
60 ellipsis = Qd.StringWidth('\xc9') |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
61 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
62 if strwid <= maxwid: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
63 Qd.TextFace(0) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
64 return 1, s |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
65 if strwid < 1: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
66 Qd.TextFace(0) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
67 return 1, "" |
| 10047 | 68 |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
69 mid = int(strlen * maxwid / strwid) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
70 while 1: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
71 if mid <= 0: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
72 mid = 0 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
73 break |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
74 strwid = Qd.TextWidth(s, 0, mid) + ellipsis |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
75 strwid2 = Qd.TextWidth(s, 0, mid + 1) + ellipsis |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
76 if strwid <= maxwid and maxwid <= strwid2: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
77 if maxwid == strwid2: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
78 mid += 1 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
79 break |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
80 if strwid > maxwid: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
81 mid -= 1 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
82 if mid <= 0: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
83 mid = 0 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
84 break |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
85 elif strwid2 < maxwid: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
86 mid += 1 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
87 Qd.TextFace(0) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
88 return 1, s[:mid] + '\xc9' |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
89 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
90 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
91 def drawTextCell(text, cellRect, ascent, theList): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
92 l, t, r, b = cellRect |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
93 cellwidth = r - l |
|
27839
50173ea1fd44
More int() around float arguments.
Jack Jansen <jack.jansen@cwi.nl>
parents:
27737
diff
changeset
|
94 Qd.MoveTo(int(l + 2), int(t + ascent)) |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
95 condense, text = truncString(text, cellwidth - 3) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
96 if condense: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
97 Qd.TextFace(QuickDraw.condense) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
98 Qd.DrawText(text, 0, len(text)) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
99 Qd.TextFace(0) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
100 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
101 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
102 PICTWIDTH = 16 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
103 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
104 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
105 class BrowserWidget(W.CustomList): |
| 10047 | 106 |
| 107 def __init__(self, possize, object = None, col = 100, closechildren = 0): | |
| 108 W.List.__init__(self, possize, callback = self.listhit) | |
| 109 self.object = (None,) | |
| 110 self.indent = 16 | |
| 111 self.lastmaxindent = 0 | |
| 112 self.closechildren = closechildren | |
| 113 self.children = [] | |
| 114 self.mincol = 64 | |
| 115 self.setcolumn(col) | |
| 116 self.bind('return', self.openselection) | |
| 117 self.bind('enter', self.openselection) | |
| 118 if object is not None: | |
| 119 self.set(object) | |
| 120 | |
| 121 def set(self, object): | |
| 122 if self.object[0] is not object: | |
| 123 self.object = object, | |
| 124 self[:] = self.unpack(object, 0) | |
| 125 elif self._parentwindow is not None and self._parentwindow.wid: | |
| 126 self.update() | |
| 127 | |
| 128 def unpack(self, object, indent): | |
| 129 return unpack_object(object, indent) | |
| 130 | |
| 131 def update(self): | |
| 132 # for now... | |
| 133 W.SetCursor('watch') | |
| 134 self.setdrawingmode(0) | |
| 135 sel = self.getselectedobjects() | |
| 136 fold = self.getunfoldedobjects() | |
| 137 topcell = self.gettopcell() | |
| 138 self[:] = self.unpack(self.object[0], 0) | |
| 139 self.unfoldobjects(fold) | |
| 140 self.setselectedobjects(sel) | |
| 141 self.settopcell(topcell) | |
| 142 self.setdrawingmode(1) | |
| 143 | |
| 144 def setcolumn(self, col): | |
| 145 self.col = col | |
| 146 self.colstr = struct.pack('h', col) | |
| 147 if self._list: | |
| 148 sel = self.getselection() | |
| 149 self.setitems(self.items) | |
| 150 self.setselection(sel) | |
| 151 | |
| 152 def key(self, char, event): | |
| 153 if char in (Wkeys.leftarrowkey, Wkeys.rightarrowkey): | |
| 154 sel = self.getselection() | |
| 155 sel.reverse() | |
| 156 self.setdrawingmode(0) | |
| 157 for index in sel: | |
| 158 self.fold(index, char == Wkeys.rightarrowkey) | |
| 159 self.setdrawingmode(1) | |
| 160 else: | |
| 161 W.List.key(self, char, event) | |
| 162 | |
| 163 def rollover(self, (x, y), onoff): | |
| 164 if onoff: | |
| 165 if self.incolumn((x, y)): | |
| 166 W.SetCursor('hmover') | |
| 167 else: | |
| 168 W.SetCursor('arrow') | |
| 169 | |
| 170 def inarrow(self, (x, y)): | |
| 171 cl, ct, cr, cb = self._list.LRect((0, 0)) | |
| 172 l, t, r, b = self._bounds | |
| 173 if (x - cl) < 16: | |
| 174 cellheight = cb - ct | |
| 175 index = (y - ct) / cellheight | |
| 176 if index < len(self.items): | |
| 177 return 1, index | |
| 178 return None, None | |
| 179 | |
| 180 def incolumn(self, (x, y)): | |
| 181 l, t, r, b = self._list.LRect((0, 0)) | |
| 182 abscol = l + self.col | |
| 183 return abs(abscol - x) < 3 | |
| 184 | |
| 185 def trackcolumn(self, (x, y)): | |
|
19488
42b2f1936254
Import the MacOS toolbox modules from the Carbon package.
Jack Jansen <jack.jansen@cwi.nl>
parents:
18453
diff
changeset
|
186 from Carbon import Qd, QuickDraw, Evt |
| 10047 | 187 self.SetPort() |
| 188 l, t, r, b = self._bounds | |
| 189 bounds = l, t, r, b = l + 1, t + 1, r - 16, b - 1 | |
| 190 abscol = l + self.col | |
| 191 mincol = l + self.mincol | |
| 192 maxcol = r - 10 | |
| 193 diff = abscol - x | |
| 194 Qd.PenPat('\000\377\000\377\000\377\000\377') | |
| 195 Qd.PenMode(QuickDraw.srcXor) | |
| 196 rect = abscol - 1, t, abscol, b | |
| 197 Qd.PaintRect(rect) | |
| 198 lastpoint = (x, y) | |
| 199 newcol = -1 | |
| 200 #W.SetCursor('fist') | |
| 201 while Evt.Button(): | |
|
21013
41b8d66730d6
a whole bunch of OSX tweaks
Just van Rossum <just@letterror.com>
parents:
20833
diff
changeset
|
202 Evt.WaitNextEvent(0, 1, None) # needed for OSX |
| 10047 | 203 (x, y) = Evt.GetMouse() |
| 204 if (x, y) <> lastpoint: | |
| 205 newcol = x + diff | |
| 206 newcol = max(newcol, mincol) | |
| 207 newcol = min(newcol, maxcol) | |
| 208 Qd.PaintRect(rect) | |
| 209 rect = newcol - 1, t, newcol, b | |
| 210 Qd.PaintRect(rect) | |
| 211 lastpoint = (x, y) | |
| 212 Qd.PaintRect(rect) | |
|
26466
418a7ec92599
Lots of minor tweaks for the pep252 checkins, mainly because Qd
Jack Jansen <jack.jansen@cwi.nl>
parents:
25293
diff
changeset
|
213 Qd.PenPat(Qd.GetQDGlobalsBlack()) |
| 10047 | 214 Qd.PenNormal() |
| 215 if newcol > 0 and newcol <> abscol: | |
| 216 self.setcolumn(newcol - l) | |
| 217 | |
| 218 def click(self, point, modifiers): | |
| 219 if point == (-1, -1): # gross. | |
| 220 W.List.click(self, point ,modifiers) | |
| 221 return | |
| 222 hit, index = self.inarrow(point) | |
| 223 if hit: | |
| 224 (key, value, arrow, indent) = self.items[index] | |
| 225 self.fold(index, arrow == 1) | |
| 226 elif self.incolumn(point): | |
| 227 self.trackcolumn(point) | |
| 228 else: | |
| 229 W.List.click(self, point, modifiers) | |
| 230 | |
| 231 # for W.List.key | |
| 232 def findmatch(self, tag): | |
| 233 lower = string.lower | |
| 234 items = self.items | |
| 235 taglen = len(tag) | |
| 236 match = '\377' * 100 | |
| 237 match_i = -1 | |
| 238 for i in range(len(items)): | |
| 239 item = lower(str(items[i][0])) | |
| 240 if tag <= item < match: | |
| 241 match = item | |
| 242 match_i = i | |
| 243 if match_i >= 0: | |
| 244 return match_i | |
| 245 else: | |
| 246 return len(items) - 1 | |
| 247 | |
| 248 def close(self): | |
| 249 if self.closechildren: | |
| 250 for window in self.children: | |
| 251 window.close() | |
| 252 self.children = [] | |
| 253 W.List.close(self) | |
| 254 | |
| 255 def fold(self, index, onoff): | |
| 256 (key, value, arrow, indent) = self.items[index] | |
| 257 if arrow == 0 or (onoff and arrow == 2) or (not onoff and arrow == 1): | |
| 258 return | |
| 259 W.SetCursor('watch') | |
| 260 topcell = self.gettopcell() | |
| 261 if onoff: | |
| 262 self[index] = (key, value, 4, indent) | |
| 263 self.setdrawingmode(0) | |
| 264 self[index+1:index+1] = self.unpack(value, indent + 1) | |
| 265 self[index] = (key, value, 2, indent) | |
| 266 else: | |
| 267 self[index] = (key, value, 3, indent) | |
| 268 self.setdrawingmode(0) | |
| 269 count = 0 | |
| 270 for i in range(index + 1, len(self.items)): | |
| 271 (dummy, dummy, dummy, subindent) = self.items[i] | |
| 272 if subindent <= indent: | |
| 273 break | |
| 274 count = count + 1 | |
| 275 self[index+1:index+1+count] = [] | |
| 276 self[index] = (key, value, 1, indent) | |
| 277 maxindent = self.getmaxindent() | |
| 278 if maxindent <> self.lastmaxindent: | |
| 279 newabsindent = self.col + (maxindent - self.lastmaxindent) * self.indent | |
| 280 if newabsindent >= self.mincol: | |
| 281 self.setcolumn(newabsindent) | |
| 282 self.lastmaxindent = maxindent | |
| 283 self.settopcell(topcell) | |
| 284 self.setdrawingmode(1) | |
| 285 | |
| 286 def unfoldobjects(self, objects): | |
| 287 for obj in objects: | |
| 288 try: | |
| 289 index = self.items.index(obj) | |
| 290 except ValueError: | |
| 291 pass | |
| 292 else: | |
| 293 self.fold(index, 1) | |
| 294 | |
| 295 def getunfoldedobjects(self): | |
| 296 curindent = 0 | |
| 297 objects = [] | |
| 298 for index in range(len(self.items)): | |
| 299 (key, value, arrow, indent) = self.items[index] | |
| 300 if indent > curindent: | |
| 301 (k, v, a, i) = self.items[index - 1] | |
| 302 objects.append((k, v, 1, i)) | |
| 303 curindent = indent | |
| 304 elif indent < curindent: | |
| 305 curindent = indent | |
| 306 return objects | |
| 307 | |
| 308 def listhit(self, isdbl): | |
| 309 if isdbl: | |
| 310 self.openselection() | |
| 311 | |
| 312 def openselection(self): | |
| 313 import os | |
| 314 sel = self.getselection() | |
| 315 for index in sel: | |
| 316 (key, value, arrow, indent) = self[index] | |
| 317 if arrow: | |
| 318 self.children.append(Browser(value)) | |
| 319 elif type(value) == types.StringType and '\0' not in value: | |
| 320 editor = self._parentwindow.parent.getscript(value) | |
| 321 if editor: | |
| 322 editor.select() | |
| 323 return | |
| 324 elif os.path.exists(value) and os.path.isfile(value): | |
|
27737
4367f805db09
Got rid of macfs and FSSpecs in general (pathnames or FSRefs are now
Jack Jansen <jack.jansen@cwi.nl>
parents:
26639
diff
changeset
|
325 if MacOS.GetCreatorAndType(value)[1] in ('TEXT', '\0\0\0\0'): |
| 10047 | 326 W.getapplication().openscript(value) |
| 327 | |
| 328 def itemrepr(self, (key, value, arrow, indent), str = str, double_repr = double_repr, | |
| 329 arrows = arrows, pack = struct.pack): | |
| 330 arrow = arrows[arrow] | |
| 331 return arrow + pack('h', self.indent * indent) + self.colstr + \ | |
| 332 double_repr(key, value, 1) | |
| 333 | |
| 334 def getmaxindent(self, max = max): | |
| 335 maxindent = 0 | |
| 336 for item in self.items: | |
| 337 maxindent = max(maxindent, item[3]) | |
| 338 return maxindent | |
| 339 | |
| 340 def domenu_copy(self, *args): | |
| 341 sel = self.getselectedobjects() | |
| 342 selitems = [] | |
| 343 for key, value, dummy, dummy in sel: | |
| 344 selitems.append(double_repr(key, value)) | |
| 345 text = string.join(selitems, '\r') | |
| 346 if text: | |
|
20833
860472877dda
fixed a non-Carbon Carbon import
Just van Rossum <just@letterror.com>
parents:
19488
diff
changeset
|
347 from Carbon import Scrap |
|
21605
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
348 if hasattr(Scrap, 'PutScrap'): |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
349 Scrap.ZeroScrap() |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
350 Scrap.PutScrap('TEXT', text) |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
351 else: |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
352 Scrap.ClearCurrentScrap() |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
353 sc = Scrap.GetCurrentScrap() |
|
035d9c96aaec
Use the Carbon scrap manager interface if the old interface isn't available.
Jack Jansen <jack.jansen@cwi.nl>
parents:
21599
diff
changeset
|
354 sc.PutScrapFlavor('TEXT', 0, text) |
| 10047 | 355 |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
356 def listDefDraw(self, selected, cellRect, theCell, |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
357 dataOffset, dataLen, theList): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
358 self.myDrawCell(0, selected, cellRect, theCell, |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
359 dataOffset, dataLen, theList) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
360 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
361 def listDefHighlight(self, selected, cellRect, theCell, |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
362 dataOffset, dataLen, theList): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
363 self.myDrawCell(1, selected, cellRect, theCell, |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
364 dataOffset, dataLen, theList) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
365 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
366 def myDrawCell(self, onlyHilite, selected, cellRect, theCell, |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
367 dataOffset, dataLen, theList): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
368 savedPort = Qd.GetPort() |
|
26466
418a7ec92599
Lots of minor tweaks for the pep252 checkins, mainly because Qd
Jack Jansen <jack.jansen@cwi.nl>
parents:
25293
diff
changeset
|
369 Qd.SetPort(theList.GetListPort()) |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
370 savedClip = Qd.NewRgn() |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
371 Qd.GetClip(savedClip) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
372 Qd.ClipRect(cellRect) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
373 savedPenState = Qd.GetPenState() |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
374 Qd.PenNormal() |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
375 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
376 l, t, r, b = cellRect |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
377 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
378 if not onlyHilite: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
379 Qd.EraseRect(cellRect) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
380 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
381 ascent, descent, leading, size, hm = Fm.FontMetrics() |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
382 linefeed = ascent + descent + leading |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
383 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
384 if dataLen >= 6: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
385 data = theList.LGetCell(dataLen, theCell) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
386 iconId, indent, tab = struct.unpack("hhh", data[:6]) |
|
25293
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
387 try: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
388 key, value = data[6:].split("\t", 1) |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
389 except ValueError: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
390 # bogus data, at least don't crash. |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
391 indent = 0 |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
392 tab = 0 |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
393 iconId = 0 |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
394 key = "" |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
395 value = data[6:] |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
396 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
397 if iconId: |
|
25293
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
398 try: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
399 theIcon = Icn.GetCIcon(iconId) |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
400 except Icn.Error: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
401 pass |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
402 else: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
403 rect = (0, 0, 16, 16) |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
404 rect = Qd.OffsetRect(rect, l, t) |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
405 rect = Qd.OffsetRect(rect, 0, (theList.cellSize[1] - (rect[3] - rect[1])) / 2) |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
406 Icn.PlotCIcon(rect, theIcon) |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
407 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
408 if len(key) >= 0: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
409 cl, ct, cr, cb = cellRect |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
410 vl, vt, vr, vb = self._viewbounds |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
411 cl = vl + PICTWIDTH + indent |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
412 cr = vl + tab |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
413 if cr > vr: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
414 cr = vr |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
415 if cl < cr: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
416 drawTextCell(key, (cl, ct, cr, cb), ascent, theList) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
417 cl = vl + tab |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
418 cr = vr |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
419 if cl < cr: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
420 drawTextCell(value, (cl, ct, cr, cb), ascent, theList) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
421 #elif dataLen != 0: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
422 # drawTextCell("???", 3, cellRect, ascent, theList) |
|
25293
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
423 else: |
|
61c2506ec2e8
make sure the object browser can't crash because when the list data gets bigger than 32kB
Just van Rossum <just@letterror.com>
parents:
22575
diff
changeset
|
424 return # we have bogus data |
|
22575
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
425 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
426 # draw nice dotted line |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
427 l, t, r, b = cellRect |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
428 l = self._viewbounds[0] + tab |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
429 r = l + 1; |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
430 if not (theList.cellSize[1] & 0x01) or (t & 0x01): |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
431 myPat = "\xff\x00\xff\x00\xff\x00\xff\x00" |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
432 else: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
433 myPat = "\x00\xff\x00\xff\x00\xff\x00\xff" |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
434 Qd.PenPat(myPat) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
435 Qd.PenMode(QuickDraw.srcCopy) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
436 Qd.PaintRect((l, t, r, b)) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
437 Qd.PenNormal() |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
438 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
439 if selected or onlyHilite: |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
440 l, t, r, b = cellRect |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
441 l = self._viewbounds[0] + PICTWIDTH |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
442 r = self._viewbounds[2] |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
443 Qd.PenMode(hilitetransfermode) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
444 Qd.PaintRect((l, t, r, b)) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
445 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
446 # restore graphics environment |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
447 Qd.SetPort(savedPort) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
448 Qd.SetClip(savedClip) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
449 Qd.DisposeRgn(savedClip) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
450 Qd.SetPenState(savedPenState) |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
451 |
|
bc20baaae3ee
Make object browser work in OSX (by rewriting the old browser
Just van Rossum <just@letterror.com>
parents:
21605
diff
changeset
|
452 |
| 10047 | 453 |
| 454 class Browser: | |
| 455 | |
| 456 def __init__(self, object = None, title = None, closechildren = 0): | |
| 457 if hasattr(object, '__name__'): | |
| 458 name = object.__name__ | |
| 459 else: | |
| 460 name = '' | |
| 461 if title is None: | |
| 462 title = 'Object browser' | |
| 463 if name: | |
| 464 title = title + ': ' + name | |
| 465 self.w = w = W.Window((300, 400), title, minsize = (100, 100)) | |
| 466 w.info = W.TextBox((18, 8, -70, 15)) | |
|
21013
41b8d66730d6
a whole bunch of OSX tweaks
Just van Rossum <just@letterror.com>
parents:
20833
diff
changeset
|
467 w.updatebutton = W.BevelButton((-64, 4, 50, 16), 'Update', self.update) |
| 10047 | 468 w.browser = BrowserWidget((-1, 24, 1, -14), None) |
| 469 w.bind('cmdu', w.updatebutton.push) | |
| 470 w.open() | |
| 471 self.set(object, name) | |
| 472 | |
| 473 def close(self): | |
| 474 if self.w.wid: | |
| 475 self.w.close() | |
| 476 | |
| 477 def set(self, object, name = ''): | |
| 478 W.SetCursor('watch') | |
| 479 tp = type(object).__name__ | |
| 480 try: | |
| 481 length = len(object) | |
| 482 except: | |
| 483 length = -1 | |
| 484 if not name and hasattr(object, '__name__'): | |
| 485 name = object.__name__ | |
| 486 if name: | |
| 487 info = name + ': ' + tp | |
| 488 else: | |
| 489 info = tp | |
| 490 if length >= 0: | |
| 491 if length == 1: | |
| 492 info = info + ' (%d element)' % length | |
| 493 else: | |
| 494 info = info + ' (%d elements)' % length | |
| 495 self.w.info.set(info) | |
| 496 self.w.browser.set(object) | |
| 497 | |
| 498 def update(self): | |
| 499 self.w.browser.update() | |
| 500 | |
| 501 | |
| 502 SIMPLE_TYPES = ( | |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
503 type(None), |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
504 int, |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
505 long, |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
506 float, |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
507 complex, |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
508 str, |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
509 unicode, |
| 10047 | 510 ) |
| 511 | |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
512 def get_ivars(obj): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
513 """Return a list the names of all (potential) instance variables.""" |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
514 # __mro__ recipe from Guido |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
515 slots = {} |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
516 # old-style C objects |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
517 if hasattr(obj, "__members__"): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
518 for name in obj.__members__: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
519 slots[name] = None |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
520 if hasattr(obj, "__methods__"): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
521 for name in obj.__methods__: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
522 slots[name] = None |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
523 # generic type |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
524 if hasattr(obj, "__dict__"): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
525 slots.update(obj.__dict__) |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
526 cls = type(obj) |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
527 if hasattr(cls, "__mro__"): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
528 # new-style class, use descriptors |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
529 for base in cls.__mro__: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
530 for name, value in base.__dict__.items(): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
531 # XXX using callable() is a heuristic which isn't 100% |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
532 # foolproof. |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
533 if hasattr(value, "__get__") and not callable(value): |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
534 slots[name] = None |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
535 if "__dict__" in slots: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
536 del slots["__dict__"] |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
537 slots = slots.keys() |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
538 slots.sort() |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
539 return slots |
| 10047 | 540 |
| 541 def unpack_object(object, indent = 0): | |
| 542 tp = type(object) | |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
543 if isinstance(object, SIMPLE_TYPES) and object is not None: |
|
18167
c5ac6f055c62
Some long overdue maintainance. Made all IDE sources 7-bit-clean, to avoid any further encoding conversion troubles.
Just van Rossum <just@letterror.com>
parents:
17845
diff
changeset
|
544 raise TypeError, "can't browse simple type: %s" % tp.__name__ |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
545 elif isinstance(object, dict): |
| 10047 | 546 return unpack_dict(object, indent) |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
547 elif isinstance(object, (tuple, list)): |
| 10047 | 548 return unpack_sequence(object, indent) |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
549 elif isinstance(object, types.ModuleType): |
| 10047 | 550 return unpack_dict(object.__dict__, indent) |
| 551 else: | |
| 552 return unpack_other(object, indent) | |
| 553 | |
| 554 def unpack_sequence(seq, indent = 0): | |
|
26630
59dd9257bc03
and now the real fix...
Just van Rossum <just@letterror.com>
parents:
26629
diff
changeset
|
555 return [(i, v, not isinstance(v, SIMPLE_TYPES), indent) |
|
59dd9257bc03
and now the real fix...
Just van Rossum <just@letterror.com>
parents:
26629
diff
changeset
|
556 for i, v in enumerate(seq)] |
| 10047 | 557 |
| 558 def unpack_dict(dict, indent = 0): | |
| 559 items = dict.items() | |
| 560 return pack_items(items, indent) | |
| 561 | |
| 562 def unpack_instance(inst, indent = 0): | |
| 563 if hasattr(inst, '__pybrowse_unpack__'): | |
| 564 return unpack_object(inst.__pybrowse_unpack__(), indent) | |
| 565 else: | |
| 566 items = [('__class__', inst.__class__)] + inst.__dict__.items() | |
| 567 return pack_items(items, indent) | |
| 568 | |
| 569 def unpack_class(clss, indent = 0): | |
| 570 items = [('__bases__', clss.__bases__), ('__name__', clss.__name__)] + clss.__dict__.items() | |
| 571 return pack_items(items, indent) | |
| 572 | |
| 573 def unpack_other(object, indent = 0): | |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
574 attrs = get_ivars(object) |
| 10047 | 575 items = [] |
| 576 for attr in attrs: | |
|
26484
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
577 try: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
578 value = getattr(object, attr) |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
579 except: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
580 pass |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
581 else: |
|
0f848b06146f
- reworked the object unpacking code, now supports new-style objects more
Just van Rossum <just@letterror.com>
parents:
26466
diff
changeset
|
582 items.append((attr, value)) |
| 10047 | 583 return pack_items(items, indent) |
| 584 | |
| 585 def pack_items(items, indent = 0): | |
|
26639
0ff47362bb81
another wrong assumption fixed
Just van Rossum <just@letterror.com>
parents:
26630
diff
changeset
|
586 items = [(k, v, not isinstance(v, SIMPLE_TYPES), indent) |
|
0ff47362bb81
another wrong assumption fixed
Just van Rossum <just@letterror.com>
parents:
26630
diff
changeset
|
587 for k, v in items] |
| 10047 | 588 return tuple_caselesssort(items) |
| 589 | |
| 590 def caselesssort(alist): | |
| 591 """Return a sorted copy of a list. If there are only strings in the list, | |
| 592 it will not consider case""" | |
| 593 | |
| 594 try: | |
| 595 # turn ['FOO', 'aaBc', 'ABcD'] into [('foo', 'FOO'), ('aabc', 'aaBc'), ('abcd', 'ABcD')], if possible | |
| 596 tupledlist = map(lambda item, lower = string.lower: (lower(item), item), alist) | |
| 597 except TypeError: | |
| 598 # at least one element in alist is not a string, proceed the normal way... | |
| 599 alist = alist[:] | |
| 600 alist.sort() | |
| 601 return alist | |
| 602 else: | |
| 603 tupledlist.sort() | |
| 604 # turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into ['aaBc', 'ABcD', 'FOO'] | |
| 605 return map(lambda x: x[1], tupledlist) | |
| 606 | |
| 607 def tuple_caselesssort(items): | |
| 608 try: | |
| 609 tupledlist = map(lambda tuple, lower = string.lower: (lower(tuple[0]), tuple), items) | |
|
15282
bf21e417bed2
fixed 2.0 compat bug
Just van Rossum <just@lettererror.com>
parents:
11422
diff
changeset
|
610 except (AttributeError, TypeError): |
| 10047 | 611 items = items[:] |
| 612 items.sort() | |
| 613 return items | |
| 614 else: | |
| 615 tupledlist.sort() | |
| 616 return map(lambda (low, tuple): tuple, tupledlist) | |
| 617 |
