summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/PyBrowser.py
diff options
context:
space:
mode:
Diffstat (limited to 'Mac/Tools/IDE/PyBrowser.py')
-rw-r--r--Mac/Tools/IDE/PyBrowser.py1113
1 files changed, 556 insertions, 557 deletions
diff --git a/Mac/Tools/IDE/PyBrowser.py b/Mac/Tools/IDE/PyBrowser.py
index 397347e..0ad3a9a 100644
--- a/Mac/Tools/IDE/PyBrowser.py
+++ b/Mac/Tools/IDE/PyBrowser.py
@@ -18,600 +18,599 @@ arrows = (nullid, closedid, openid, closedsolidid, opensolidid)
has_ctlcharsRE = re.compile(r'[\000-\037\177-\377]')
def ctlcharsREsearch(str):
- if has_ctlcharsRE.search(str) is None:
- return -1
- return 1
-
-def double_repr(key, value, truncvalue = 0,
- type = type, StringType = types.StringType,
- has_ctlchars = ctlcharsREsearch, _repr = repr, str = str):
- if type(key) == StringType and has_ctlchars(key) < 0:
- key = str(key)
- else:
- key = _repr(key)
- if key == '__builtins__':
- value = "<" + type(value).__name__ + " '__builtin__'>"
- elif key == '__return__':
- # bleh, when returning from a class codeblock we get infinite recursion in repr.
- # Use safe repr instead.
- import repr
- value = repr.repr(value)
- else:
- try:
- value = _repr(value)
- '' + value # test to see if it is a string, in case a __repr__ method is buggy
- except:
- value = '\xa5\xa5\xa5 exception in repr()'
- if truncvalue:
- return key + '\t' + value[:255]
- return key + '\t' + value
+ if has_ctlcharsRE.search(str) is None:
+ return -1
+ return 1
+
+def double_repr(key, value, truncvalue = 0,
+ type = type, StringType = types.StringType,
+ has_ctlchars = ctlcharsREsearch, _repr = repr, str = str):
+ if type(key) == StringType and has_ctlchars(key) < 0:
+ key = str(key)
+ else:
+ key = _repr(key)
+ if key == '__builtins__':
+ value = "<" + type(value).__name__ + " '__builtin__'>"
+ elif key == '__return__':
+ # bleh, when returning from a class codeblock we get infinite recursion in repr.
+ # Use safe repr instead.
+ import repr
+ value = repr.repr(value)
+ else:
+ try:
+ value = _repr(value)
+ '' + value # test to see if it is a string, in case a __repr__ method is buggy
+ except:
+ value = '\xa5\xa5\xa5 exception in repr()'
+ if truncvalue:
+ return key + '\t' + value[:255]
+ return key + '\t' + value
def truncString(s, maxwid):
- if maxwid < 1:
- return 1, ""
- strlen = len(s)
- strwid = Qd.TextWidth(s, 0, strlen);
- if strwid <= maxwid:
- return 0, s
-
- Qd.TextFace(QuickDraw.condense)
- strwid = Qd.TextWidth(s, 0, strlen)
- ellipsis = Qd.StringWidth('\xc9')
-
- if strwid <= maxwid:
- Qd.TextFace(0)
- return 1, s
- if strwid < 1:
- Qd.TextFace(0)
- return 1, ""
-
- mid = int(strlen * maxwid / strwid)
- while 1:
- if mid <= 0:
- mid = 0
- break
- strwid = Qd.TextWidth(s, 0, mid) + ellipsis
- strwid2 = Qd.TextWidth(s, 0, mid + 1) + ellipsis
- if strwid <= maxwid and maxwid <= strwid2:
- if maxwid == strwid2:
- mid += 1
- break
- if strwid > maxwid:
- mid -= 1
- if mid <= 0:
- mid = 0
- break
- elif strwid2 < maxwid:
- mid += 1
- Qd.TextFace(0)
- return 1, s[:mid] + '\xc9'
+ if maxwid < 1:
+ return 1, ""
+ strlen = len(s)
+ strwid = Qd.TextWidth(s, 0, strlen);
+ if strwid <= maxwid:
+ return 0, s
+
+ Qd.TextFace(QuickDraw.condense)
+ strwid = Qd.TextWidth(s, 0, strlen)
+ ellipsis = Qd.StringWidth('\xc9')
+
+ if strwid <= maxwid:
+ Qd.TextFace(0)
+ return 1, s
+ if strwid < 1:
+ Qd.TextFace(0)
+ return 1, ""
+
+ mid = int(strlen * maxwid / strwid)
+ while 1:
+ if mid <= 0:
+ mid = 0
+ break
+ strwid = Qd.TextWidth(s, 0, mid) + ellipsis
+ strwid2 = Qd.TextWidth(s, 0, mid + 1) + ellipsis
+ if strwid <= maxwid and maxwid <= strwid2:
+ if maxwid == strwid2:
+ mid += 1
+ break
+ if strwid > maxwid:
+ mid -= 1
+ if mid <= 0:
+ mid = 0
+ break
+ elif strwid2 < maxwid:
+ mid += 1
+ Qd.TextFace(0)
+ return 1, s[:mid] + '\xc9'
def drawTextCell(text, cellRect, ascent, theList):
- l, t, r, b = cellRect
- cellwidth = r - l
- Qd.MoveTo(int(l + 2), int(t + ascent))
- condense, text = truncString(text, cellwidth - 3)
- if condense:
- Qd.TextFace(QuickDraw.condense)
- Qd.DrawText(text, 0, len(text))
- Qd.TextFace(0)
+ l, t, r, b = cellRect
+ cellwidth = r - l
+ Qd.MoveTo(int(l + 2), int(t + ascent))
+ condense, text = truncString(text, cellwidth - 3)
+ if condense:
+ Qd.TextFace(QuickDraw.condense)
+ Qd.DrawText(text, 0, len(text))
+ Qd.TextFace(0)
PICTWIDTH = 16
class BrowserWidget(W.CustomList):
-
- def __init__(self, possize, object = None, col = 100, closechildren = 0):
- W.List.__init__(self, possize, callback = self.listhit)
- self.object = (None,)
- self.indent = 16
- self.lastmaxindent = 0
- self.closechildren = closechildren
- self.children = []
- self.mincol = 64
- self.setcolumn(col)
- self.bind('return', self.openselection)
- self.bind('enter', self.openselection)
- if object is not None:
- self.set(object)
-
- def set(self, object):
- if self.object[0] is not object:
- self.object = object,
- self[:] = self.unpack(object, 0)
- elif self._parentwindow is not None and self._parentwindow.wid:
- self.update()
-
- def unpack(self, object, indent):
- return unpack_object(object, indent)
-
- def update(self):
- # for now...
- W.SetCursor('watch')
- self.setdrawingmode(0)
- sel = self.getselectedobjects()
- fold = self.getunfoldedobjects()
- topcell = self.gettopcell()
- self[:] = self.unpack(self.object[0], 0)
- self.unfoldobjects(fold)
- self.setselectedobjects(sel)
- self.settopcell(topcell)
- self.setdrawingmode(1)
-
- def setcolumn(self, col):
- self.col = col
- self.colstr = struct.pack('h', col)
- if self._list:
- sel = self.getselection()
- self.setitems(self.items)
- self.setselection(sel)
-
- def key(self, char, event):
- if char in (Wkeys.leftarrowkey, Wkeys.rightarrowkey):
- sel = self.getselection()
- sel.reverse()
- self.setdrawingmode(0)
- for index in sel:
- self.fold(index, char == Wkeys.rightarrowkey)
- self.setdrawingmode(1)
- else:
- W.List.key(self, char, event)
-
- def rollover(self, (x, y), onoff):
- if onoff:
- if self.incolumn((x, y)):
- W.SetCursor('hmover')
- else:
- W.SetCursor('arrow')
-
- def inarrow(self, (x, y)):
- cl, ct, cr, cb = self._list.LRect((0, 0))
- l, t, r, b = self._bounds
- if (x - cl) < 16:
- cellheight = cb - ct
- index = (y - ct) / cellheight
- if index < len(self.items):
- return 1, index
- return None, None
-
- def incolumn(self, (x, y)):
- l, t, r, b = self._list.LRect((0, 0))
- abscol = l + self.col
- return abs(abscol - x) < 3
-
- def trackcolumn(self, (x, y)):
- from Carbon import Qd, QuickDraw, Evt
- self.SetPort()
- l, t, r, b = self._bounds
- bounds = l, t, r, b = l + 1, t + 1, r - 16, b - 1
- abscol = l + self.col
- mincol = l + self.mincol
- maxcol = r - 10
- diff = abscol - x
- Qd.PenPat('\000\377\000\377\000\377\000\377')
- Qd.PenMode(QuickDraw.srcXor)
- rect = abscol - 1, t, abscol, b
- Qd.PaintRect(rect)
- lastpoint = (x, y)
- newcol = -1
- #W.SetCursor('fist')
- while Evt.Button():
- Evt.WaitNextEvent(0, 1, None) # needed for OSX
- (x, y) = Evt.GetMouse()
- if (x, y) <> lastpoint:
- newcol = x + diff
- newcol = max(newcol, mincol)
- newcol = min(newcol, maxcol)
- Qd.PaintRect(rect)
- rect = newcol - 1, t, newcol, b
- Qd.PaintRect(rect)
- lastpoint = (x, y)
- Qd.PaintRect(rect)
- Qd.PenPat(Qd.GetQDGlobalsBlack())
- Qd.PenNormal()
- if newcol > 0 and newcol <> abscol:
- self.setcolumn(newcol - l)
-
- def click(self, point, modifiers):
- if point == (-1, -1): # gross.
- W.List.click(self, point ,modifiers)
- return
- hit, index = self.inarrow(point)
- if hit:
- (key, value, arrow, indent) = self.items[index]
- self.fold(index, arrow == 1)
- elif self.incolumn(point):
- self.trackcolumn(point)
- else:
- W.List.click(self, point, modifiers)
-
- # for W.List.key
- def findmatch(self, tag):
- lower = string.lower
- items = self.items
- taglen = len(tag)
- match = '\377' * 100
- match_i = -1
- for i in range(len(items)):
- item = lower(str(items[i][0]))
- if tag <= item < match:
- match = item
- match_i = i
- if match_i >= 0:
- return match_i
- else:
- return len(items) - 1
-
- def close(self):
- if self.closechildren:
- for window in self.children:
- window.close()
- self.children = []
- W.List.close(self)
-
- def fold(self, index, onoff):
- (key, value, arrow, indent) = self.items[index]
- if arrow == 0 or (onoff and arrow == 2) or (not onoff and arrow == 1):
- return
- W.SetCursor('watch')
- topcell = self.gettopcell()
- if onoff:
- self[index] = (key, value, 4, indent)
- self.setdrawingmode(0)
- self[index+1:index+1] = self.unpack(value, indent + 1)
- self[index] = (key, value, 2, indent)
- else:
- self[index] = (key, value, 3, indent)
- self.setdrawingmode(0)
- count = 0
- for i in range(index + 1, len(self.items)):
- (dummy, dummy, dummy, subindent) = self.items[i]
- if subindent <= indent:
- break
- count = count + 1
- self[index+1:index+1+count] = []
- self[index] = (key, value, 1, indent)
- maxindent = self.getmaxindent()
- if maxindent <> self.lastmaxindent:
- newabsindent = self.col + (maxindent - self.lastmaxindent) * self.indent
- if newabsindent >= self.mincol:
- self.setcolumn(newabsindent)
- self.lastmaxindent = maxindent
- self.settopcell(topcell)
- self.setdrawingmode(1)
-
- def unfoldobjects(self, objects):
- for obj in objects:
- try:
- index = self.items.index(obj)
- except ValueError:
- pass
- else:
- self.fold(index, 1)
-
- def getunfoldedobjects(self):
- curindent = 0
- objects = []
- for index in range(len(self.items)):
- (key, value, arrow, indent) = self.items[index]
- if indent > curindent:
- (k, v, a, i) = self.items[index - 1]
- objects.append((k, v, 1, i))
- curindent = indent
- elif indent < curindent:
- curindent = indent
- return objects
-
- def listhit(self, isdbl):
- if isdbl:
- self.openselection()
-
- def openselection(self):
- import os
- sel = self.getselection()
- for index in sel:
- (key, value, arrow, indent) = self[index]
- if arrow:
- self.children.append(Browser(value))
- elif type(value) == types.StringType and '\0' not in value:
- editor = self._parentwindow.parent.getscript(value)
- if editor:
- editor.select()
- return
- elif os.path.exists(value) and os.path.isfile(value):
- if MacOS.GetCreatorAndType(value)[1] in ('TEXT', '\0\0\0\0'):
- W.getapplication().openscript(value)
-
- def itemrepr(self, (key, value, arrow, indent), str = str, double_repr = double_repr,
- arrows = arrows, pack = struct.pack):
- arrow = arrows[arrow]
- return arrow + pack('h', self.indent * indent) + self.colstr + \
- double_repr(key, value, 1)
-
- def getmaxindent(self, max = max):
- maxindent = 0
- for item in self.items:
- maxindent = max(maxindent, item[3])
- return maxindent
-
- def domenu_copy(self, *args):
- sel = self.getselectedobjects()
- selitems = []
- for key, value, dummy, dummy in sel:
- selitems.append(double_repr(key, value))
- text = string.join(selitems, '\r')
- if text:
- from Carbon import Scrap
- if hasattr(Scrap, 'PutScrap'):
- Scrap.ZeroScrap()
- Scrap.PutScrap('TEXT', text)
- else:
- Scrap.ClearCurrentScrap()
- sc = Scrap.GetCurrentScrap()
- sc.PutScrapFlavor('TEXT', 0, text)
-
- def listDefDraw(self, selected, cellRect, theCell,
- dataOffset, dataLen, theList):
- self.myDrawCell(0, selected, cellRect, theCell,
- dataOffset, dataLen, theList)
-
- def listDefHighlight(self, selected, cellRect, theCell,
- dataOffset, dataLen, theList):
- self.myDrawCell(1, selected, cellRect, theCell,
- dataOffset, dataLen, theList)
-
- def myDrawCell(self, onlyHilite, selected, cellRect, theCell,
- dataOffset, dataLen, theList):
- savedPort = Qd.GetPort()
- Qd.SetPort(theList.GetListPort())
- savedClip = Qd.NewRgn()
- Qd.GetClip(savedClip)
- Qd.ClipRect(cellRect)
- savedPenState = Qd.GetPenState()
- Qd.PenNormal()
-
- l, t, r, b = cellRect
-
- if not onlyHilite:
- Qd.EraseRect(cellRect)
-
- ascent, descent, leading, size, hm = Fm.FontMetrics()
- linefeed = ascent + descent + leading
-
- if dataLen >= 6:
- data = theList.LGetCell(dataLen, theCell)
- iconId, indent, tab = struct.unpack("hhh", data[:6])
- try:
- key, value = data[6:].split("\t", 1)
- except ValueError:
- # bogus data, at least don't crash.
- indent = 0
- tab = 0
- iconId = 0
- key = ""
- value = data[6:]
-
- if iconId:
- try:
- theIcon = Icn.GetCIcon(iconId)
- except Icn.Error:
- pass
- else:
- rect = (0, 0, 16, 16)
- rect = Qd.OffsetRect(rect, l, t)
- rect = Qd.OffsetRect(rect, 0, (theList.cellSize[1] - (rect[3] - rect[1])) / 2)
- Icn.PlotCIcon(rect, theIcon)
-
- if len(key) >= 0:
- cl, ct, cr, cb = cellRect
- vl, vt, vr, vb = self._viewbounds
- cl = vl + PICTWIDTH + indent
- cr = vl + tab
- if cr > vr:
- cr = vr
- if cl < cr:
- drawTextCell(key, (cl, ct, cr, cb), ascent, theList)
- cl = vl + tab
- cr = vr
- if cl < cr:
- drawTextCell(value, (cl, ct, cr, cb), ascent, theList)
- #elif dataLen != 0:
- # drawTextCell("???", 3, cellRect, ascent, theList)
- else:
- return # we have bogus data
-
- # draw nice dotted line
- l, t, r, b = cellRect
- l = self._viewbounds[0] + tab
- r = l + 1;
- if not (theList.cellSize[1] & 0x01) or (t & 0x01):
- myPat = "\xff\x00\xff\x00\xff\x00\xff\x00"
- else:
- myPat = "\x00\xff\x00\xff\x00\xff\x00\xff"
- Qd.PenPat(myPat)
- Qd.PenMode(QuickDraw.srcCopy)
- Qd.PaintRect((l, t, r, b))
- Qd.PenNormal()
-
- if selected or onlyHilite:
- l, t, r, b = cellRect
- l = self._viewbounds[0] + PICTWIDTH
- r = self._viewbounds[2]
- Qd.PenMode(hilitetransfermode)
- Qd.PaintRect((l, t, r, b))
-
- # restore graphics environment
- Qd.SetPort(savedPort)
- Qd.SetClip(savedClip)
- Qd.DisposeRgn(savedClip)
- Qd.SetPenState(savedPenState)
+
+ def __init__(self, possize, object = None, col = 100, closechildren = 0):
+ W.List.__init__(self, possize, callback = self.listhit)
+ self.object = (None,)
+ self.indent = 16
+ self.lastmaxindent = 0
+ self.closechildren = closechildren
+ self.children = []
+ self.mincol = 64
+ self.setcolumn(col)
+ self.bind('return', self.openselection)
+ self.bind('enter', self.openselection)
+ if object is not None:
+ self.set(object)
+
+ def set(self, object):
+ if self.object[0] is not object:
+ self.object = object,
+ self[:] = self.unpack(object, 0)
+ elif self._parentwindow is not None and self._parentwindow.wid:
+ self.update()
+
+ def unpack(self, object, indent):
+ return unpack_object(object, indent)
+
+ def update(self):
+ # for now...
+ W.SetCursor('watch')
+ self.setdrawingmode(0)
+ sel = self.getselectedobjects()
+ fold = self.getunfoldedobjects()
+ topcell = self.gettopcell()
+ self[:] = self.unpack(self.object[0], 0)
+ self.unfoldobjects(fold)
+ self.setselectedobjects(sel)
+ self.settopcell(topcell)
+ self.setdrawingmode(1)
+
+ def setcolumn(self, col):
+ self.col = col
+ self.colstr = struct.pack('h', col)
+ if self._list:
+ sel = self.getselection()
+ self.setitems(self.items)
+ self.setselection(sel)
+
+ def key(self, char, event):
+ if char in (Wkeys.leftarrowkey, Wkeys.rightarrowkey):
+ sel = self.getselection()
+ sel.reverse()
+ self.setdrawingmode(0)
+ for index in sel:
+ self.fold(index, char == Wkeys.rightarrowkey)
+ self.setdrawingmode(1)
+ else:
+ W.List.key(self, char, event)
+
+ def rollover(self, (x, y), onoff):
+ if onoff:
+ if self.incolumn((x, y)):
+ W.SetCursor('hmover')
+ else:
+ W.SetCursor('arrow')
+
+ def inarrow(self, (x, y)):
+ cl, ct, cr, cb = self._list.LRect((0, 0))
+ l, t, r, b = self._bounds
+ if (x - cl) < 16:
+ cellheight = cb - ct
+ index = (y - ct) / cellheight
+ if index < len(self.items):
+ return 1, index
+ return None, None
+
+ def incolumn(self, (x, y)):
+ l, t, r, b = self._list.LRect((0, 0))
+ abscol = l + self.col
+ return abs(abscol - x) < 3
+
+ def trackcolumn(self, (x, y)):
+ from Carbon import Qd, QuickDraw, Evt
+ self.SetPort()
+ l, t, r, b = self._bounds
+ bounds = l, t, r, b = l + 1, t + 1, r - 16, b - 1
+ abscol = l + self.col
+ mincol = l + self.mincol
+ maxcol = r - 10
+ diff = abscol - x
+ Qd.PenPat('\000\377\000\377\000\377\000\377')
+ Qd.PenMode(QuickDraw.srcXor)
+ rect = abscol - 1, t, abscol, b
+ Qd.PaintRect(rect)
+ lastpoint = (x, y)
+ newcol = -1
+ #W.SetCursor('fist')
+ while Evt.Button():
+ Evt.WaitNextEvent(0, 1, None) # needed for OSX
+ (x, y) = Evt.GetMouse()
+ if (x, y) <> lastpoint:
+ newcol = x + diff
+ newcol = max(newcol, mincol)
+ newcol = min(newcol, maxcol)
+ Qd.PaintRect(rect)
+ rect = newcol - 1, t, newcol, b
+ Qd.PaintRect(rect)
+ lastpoint = (x, y)
+ Qd.PaintRect(rect)
+ Qd.PenPat(Qd.GetQDGlobalsBlack())
+ Qd.PenNormal()
+ if newcol > 0 and newcol <> abscol:
+ self.setcolumn(newcol - l)
+
+ def click(self, point, modifiers):
+ if point == (-1, -1): # gross.
+ W.List.click(self, point ,modifiers)
+ return
+ hit, index = self.inarrow(point)
+ if hit:
+ (key, value, arrow, indent) = self.items[index]
+ self.fold(index, arrow == 1)
+ elif self.incolumn(point):
+ self.trackcolumn(point)
+ else:
+ W.List.click(self, point, modifiers)
+
+ # for W.List.key
+ def findmatch(self, tag):
+ lower = string.lower
+ items = self.items
+ taglen = len(tag)
+ match = '\377' * 100
+ match_i = -1
+ for i in range(len(items)):
+ item = lower(str(items[i][0]))
+ if tag <= item < match:
+ match = item
+ match_i = i
+ if match_i >= 0:
+ return match_i
+ else:
+ return len(items) - 1
+
+ def close(self):
+ if self.closechildren:
+ for window in self.children:
+ window.close()
+ self.children = []
+ W.List.close(self)
+
+ def fold(self, index, onoff):
+ (key, value, arrow, indent) = self.items[index]
+ if arrow == 0 or (onoff and arrow == 2) or (not onoff and arrow == 1):
+ return
+ W.SetCursor('watch')
+ topcell = self.gettopcell()
+ if onoff:
+ self[index] = (key, value, 4, indent)
+ self.setdrawingmode(0)
+ self[index+1:index+1] = self.unpack(value, indent + 1)
+ self[index] = (key, value, 2, indent)
+ else:
+ self[index] = (key, value, 3, indent)
+ self.setdrawingmode(0)
+ count = 0
+ for i in range(index + 1, len(self.items)):
+ (dummy, dummy, dummy, subindent) = self.items[i]
+ if subindent <= indent:
+ break
+ count = count + 1
+ self[index+1:index+1+count] = []
+ self[index] = (key, value, 1, indent)
+ maxindent = self.getmaxindent()
+ if maxindent <> self.lastmaxindent:
+ newabsindent = self.col + (maxindent - self.lastmaxindent) * self.indent
+ if newabsindent >= self.mincol:
+ self.setcolumn(newabsindent)
+ self.lastmaxindent = maxindent
+ self.settopcell(topcell)
+ self.setdrawingmode(1)
+
+ def unfoldobjects(self, objects):
+ for obj in objects:
+ try:
+ index = self.items.index(obj)
+ except ValueError:
+ pass
+ else:
+ self.fold(index, 1)
+
+ def getunfoldedobjects(self):
+ curindent = 0
+ objects = []
+ for index in range(len(self.items)):
+ (key, value, arrow, indent) = self.items[index]
+ if indent > curindent:
+ (k, v, a, i) = self.items[index - 1]
+ objects.append((k, v, 1, i))
+ curindent = indent
+ elif indent < curindent:
+ curindent = indent
+ return objects
+
+ def listhit(self, isdbl):
+ if isdbl:
+ self.openselection()
+
+ def openselection(self):
+ import os
+ sel = self.getselection()
+ for index in sel:
+ (key, value, arrow, indent) = self[index]
+ if arrow:
+ self.children.append(Browser(value))
+ elif type(value) == types.StringType and '\0' not in value:
+ editor = self._parentwindow.parent.getscript(value)
+ if editor:
+ editor.select()
+ return
+ elif os.path.exists(value) and os.path.isfile(value):
+ if MacOS.GetCreatorAndType(value)[1] in ('TEXT', '\0\0\0\0'):
+ W.getapplication().openscript(value)
+
+ def itemrepr(self, (key, value, arrow, indent), str = str, double_repr = double_repr,
+ arrows = arrows, pack = struct.pack):
+ arrow = arrows[arrow]
+ return arrow + pack('h', self.indent * indent) + self.colstr + \
+ double_repr(key, value, 1)
+
+ def getmaxindent(self, max = max):
+ maxindent = 0
+ for item in self.items:
+ maxindent = max(maxindent, item[3])
+ return maxindent
+
+ def domenu_copy(self, *args):
+ sel = self.getselectedobjects()
+ selitems = []
+ for key, value, dummy, dummy in sel:
+ selitems.append(double_repr(key, value))
+ text = string.join(selitems, '\r')
+ if text:
+ from Carbon import Scrap
+ if hasattr(Scrap, 'PutScrap'):
+ Scrap.ZeroScrap()
+ Scrap.PutScrap('TEXT', text)
+ else:
+ Scrap.ClearCurrentScrap()
+ sc = Scrap.GetCurrentScrap()
+ sc.PutScrapFlavor('TEXT', 0, text)
+
+ def listDefDraw(self, selected, cellRect, theCell,
+ dataOffset, dataLen, theList):
+ self.myDrawCell(0, selected, cellRect, theCell,
+ dataOffset, dataLen, theList)
+
+ def listDefHighlight(self, selected, cellRect, theCell,
+ dataOffset, dataLen, theList):
+ self.myDrawCell(1, selected, cellRect, theCell,
+ dataOffset, dataLen, theList)
+
+ def myDrawCell(self, onlyHilite, selected, cellRect, theCell,
+ dataOffset, dataLen, theList):
+ savedPort = Qd.GetPort()
+ Qd.SetPort(theList.GetListPort())
+ savedClip = Qd.NewRgn()
+ Qd.GetClip(savedClip)
+ Qd.ClipRect(cellRect)
+ savedPenState = Qd.GetPenState()
+ Qd.PenNormal()
+
+ l, t, r, b = cellRect
+
+ if not onlyHilite:
+ Qd.EraseRect(cellRect)
+
+ ascent, descent, leading, size, hm = Fm.FontMetrics()
+ linefeed = ascent + descent + leading
+
+ if dataLen >= 6:
+ data = theList.LGetCell(dataLen, theCell)
+ iconId, indent, tab = struct.unpack("hhh", data[:6])
+ try:
+ key, value = data[6:].split("\t", 1)
+ except ValueError:
+ # bogus data, at least don't crash.
+ indent = 0
+ tab = 0
+ iconId = 0
+ key = ""
+ value = data[6:]
+
+ if iconId:
+ try:
+ theIcon = Icn.GetCIcon(iconId)
+ except Icn.Error:
+ pass
+ else:
+ rect = (0, 0, 16, 16)
+ rect = Qd.OffsetRect(rect, l, t)
+ rect = Qd.OffsetRect(rect, 0, (theList.cellSize[1] - (rect[3] - rect[1])) / 2)
+ Icn.PlotCIcon(rect, theIcon)
+
+ if len(key) >= 0:
+ cl, ct, cr, cb = cellRect
+ vl, vt, vr, vb = self._viewbounds
+ cl = vl + PICTWIDTH + indent
+ cr = vl + tab
+ if cr > vr:
+ cr = vr
+ if cl < cr:
+ drawTextCell(key, (cl, ct, cr, cb), ascent, theList)
+ cl = vl + tab
+ cr = vr
+ if cl < cr:
+ drawTextCell(value, (cl, ct, cr, cb), ascent, theList)
+ #elif dataLen != 0:
+ # drawTextCell("???", 3, cellRect, ascent, theList)
+ else:
+ return # we have bogus data
+
+ # draw nice dotted line
+ l, t, r, b = cellRect
+ l = self._viewbounds[0] + tab
+ r = l + 1;
+ if not (theList.cellSize[1] & 0x01) or (t & 0x01):
+ myPat = "\xff\x00\xff\x00\xff\x00\xff\x00"
+ else:
+ myPat = "\x00\xff\x00\xff\x00\xff\x00\xff"
+ Qd.PenPat(myPat)
+ Qd.PenMode(QuickDraw.srcCopy)
+ Qd.PaintRect((l, t, r, b))
+ Qd.PenNormal()
+
+ if selected or onlyHilite:
+ l, t, r, b = cellRect
+ l = self._viewbounds[0] + PICTWIDTH
+ r = self._viewbounds[2]
+ Qd.PenMode(hilitetransfermode)
+ Qd.PaintRect((l, t, r, b))
+
+ # restore graphics environment
+ Qd.SetPort(savedPort)
+ Qd.SetClip(savedClip)
+ Qd.DisposeRgn(savedClip)
+ Qd.SetPenState(savedPenState)
class Browser:
-
- def __init__(self, object = None, title = None, closechildren = 0):
- if hasattr(object, '__name__'):
- name = object.__name__
- else:
- name = ''
- if title is None:
- title = 'Object browser'
- if name:
- title = title + ': ' + name
- self.w = w = W.Window((300, 400), title, minsize = (100, 100))
- w.info = W.TextBox((18, 8, -70, 15))
- w.updatebutton = W.BevelButton((-64, 4, 50, 16), 'Update', self.update)
- w.browser = BrowserWidget((-1, 24, 1, -14), None)
- w.bind('cmdu', w.updatebutton.push)
- w.open()
- self.set(object, name)
-
- def close(self):
- if self.w.wid:
- self.w.close()
-
- def set(self, object, name = ''):
- W.SetCursor('watch')
- tp = type(object).__name__
- try:
- length = len(object)
- except:
- length = -1
- if not name and hasattr(object, '__name__'):
- name = object.__name__
- if name:
- info = name + ': ' + tp
- else:
- info = tp
- if length >= 0:
- if length == 1:
- info = info + ' (%d element)' % length
- else:
- info = info + ' (%d elements)' % length
- self.w.info.set(info)
- self.w.browser.set(object)
-
- def update(self):
- self.w.browser.update()
+
+ def __init__(self, object = None, title = None, closechildren = 0):
+ if hasattr(object, '__name__'):
+ name = object.__name__
+ else:
+ name = ''
+ if title is None:
+ title = 'Object browser'
+ if name:
+ title = title + ': ' + name
+ self.w = w = W.Window((300, 400), title, minsize = (100, 100))
+ w.info = W.TextBox((18, 8, -70, 15))
+ w.updatebutton = W.BevelButton((-64, 4, 50, 16), 'Update', self.update)
+ w.browser = BrowserWidget((-1, 24, 1, -14), None)
+ w.bind('cmdu', w.updatebutton.push)
+ w.open()
+ self.set(object, name)
+
+ def close(self):
+ if self.w.wid:
+ self.w.close()
+
+ def set(self, object, name = ''):
+ W.SetCursor('watch')
+ tp = type(object).__name__
+ try:
+ length = len(object)
+ except:
+ length = -1
+ if not name and hasattr(object, '__name__'):
+ name = object.__name__
+ if name:
+ info = name + ': ' + tp
+ else:
+ info = tp
+ if length >= 0:
+ if length == 1:
+ info = info + ' (%d element)' % length
+ else:
+ info = info + ' (%d elements)' % length
+ self.w.info.set(info)
+ self.w.browser.set(object)
+
+ def update(self):
+ self.w.browser.update()
SIMPLE_TYPES = (
- type(None),
- int,
- long,
- float,
- complex,
- str,
- unicode,
+ type(None),
+ int,
+ long,
+ float,
+ complex,
+ str,
+ unicode,
)
def get_ivars(obj):
- """Return a list the names of all (potential) instance variables."""
- # __mro__ recipe from Guido
- slots = {}
- # old-style C objects
- if hasattr(obj, "__members__"):
- for name in obj.__members__:
- slots[name] = None
- if hasattr(obj, "__methods__"):
- for name in obj.__methods__:
- slots[name] = None
- # generic type
- if hasattr(obj, "__dict__"):
- slots.update(obj.__dict__)
- cls = type(obj)
- if hasattr(cls, "__mro__"):
- # new-style class, use descriptors
- for base in cls.__mro__:
- for name, value in base.__dict__.items():
- # XXX using callable() is a heuristic which isn't 100%
- # foolproof.
- if hasattr(value, "__get__") and not callable(value):
- slots[name] = None
- if "__dict__" in slots:
- del slots["__dict__"]
- slots = slots.keys()
- slots.sort()
- return slots
+ """Return a list the names of all (potential) instance variables."""
+ # __mro__ recipe from Guido
+ slots = {}
+ # old-style C objects
+ if hasattr(obj, "__members__"):
+ for name in obj.__members__:
+ slots[name] = None
+ if hasattr(obj, "__methods__"):
+ for name in obj.__methods__:
+ slots[name] = None
+ # generic type
+ if hasattr(obj, "__dict__"):
+ slots.update(obj.__dict__)
+ cls = type(obj)
+ if hasattr(cls, "__mro__"):
+ # new-style class, use descriptors
+ for base in cls.__mro__:
+ for name, value in base.__dict__.items():
+ # XXX using callable() is a heuristic which isn't 100%
+ # foolproof.
+ if hasattr(value, "__get__") and not callable(value):
+ slots[name] = None
+ if "__dict__" in slots:
+ del slots["__dict__"]
+ slots = slots.keys()
+ slots.sort()
+ return slots
def unpack_object(object, indent = 0):
- tp = type(object)
- if isinstance(object, SIMPLE_TYPES) and object is not None:
- raise TypeError, "can't browse simple type: %s" % tp.__name__
- elif isinstance(object, dict):
- return unpack_dict(object, indent)
- elif isinstance(object, (tuple, list)):
- return unpack_sequence(object, indent)
- elif isinstance(object, types.ModuleType):
- return unpack_dict(object.__dict__, indent)
- else:
- return unpack_other(object, indent)
+ tp = type(object)
+ if isinstance(object, SIMPLE_TYPES) and object is not None:
+ raise TypeError, "can't browse simple type: %s" % tp.__name__
+ elif isinstance(object, dict):
+ return unpack_dict(object, indent)
+ elif isinstance(object, (tuple, list)):
+ return unpack_sequence(object, indent)
+ elif isinstance(object, types.ModuleType):
+ return unpack_dict(object.__dict__, indent)
+ else:
+ return unpack_other(object, indent)
def unpack_sequence(seq, indent = 0):
- return [(i, v, not isinstance(v, SIMPLE_TYPES), indent)
- for i, v in enumerate(seq)]
+ return [(i, v, not isinstance(v, SIMPLE_TYPES), indent)
+ for i, v in enumerate(seq)]
def unpack_dict(dict, indent = 0):
- items = dict.items()
- return pack_items(items, indent)
+ items = dict.items()
+ return pack_items(items, indent)
def unpack_instance(inst, indent = 0):
- if hasattr(inst, '__pybrowse_unpack__'):
- return unpack_object(inst.__pybrowse_unpack__(), indent)
- else:
- items = [('__class__', inst.__class__)] + inst.__dict__.items()
- return pack_items(items, indent)
+ if hasattr(inst, '__pybrowse_unpack__'):
+ return unpack_object(inst.__pybrowse_unpack__(), indent)
+ else:
+ items = [('__class__', inst.__class__)] + inst.__dict__.items()
+ return pack_items(items, indent)
def unpack_class(clss, indent = 0):
- items = [('__bases__', clss.__bases__), ('__name__', clss.__name__)] + clss.__dict__.items()
- return pack_items(items, indent)
+ items = [('__bases__', clss.__bases__), ('__name__', clss.__name__)] + clss.__dict__.items()
+ return pack_items(items, indent)
def unpack_other(object, indent = 0):
- attrs = get_ivars(object)
- items = []
- for attr in attrs:
- try:
- value = getattr(object, attr)
- except:
- pass
- else:
- items.append((attr, value))
- return pack_items(items, indent)
+ attrs = get_ivars(object)
+ items = []
+ for attr in attrs:
+ try:
+ value = getattr(object, attr)
+ except:
+ pass
+ else:
+ items.append((attr, value))
+ return pack_items(items, indent)
def pack_items(items, indent = 0):
- items = [(k, v, not isinstance(v, SIMPLE_TYPES), indent)
- for k, v in items]
- return tuple_caselesssort(items)
+ items = [(k, v, not isinstance(v, SIMPLE_TYPES), indent)
+ for k, v in items]
+ return tuple_caselesssort(items)
def caselesssort(alist):
- """Return a sorted copy of a list. If there are only strings in the list,
- it will not consider case"""
-
- try:
- # turn ['FOO', 'aaBc', 'ABcD'] into [('foo', 'FOO'), ('aabc', 'aaBc'), ('abcd', 'ABcD')], if possible
- tupledlist = map(lambda item, lower = string.lower: (lower(item), item), alist)
- except TypeError:
- # at least one element in alist is not a string, proceed the normal way...
- alist = alist[:]
- alist.sort()
- return alist
- else:
- tupledlist.sort()
- # turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into ['aaBc', 'ABcD', 'FOO']
- return map(lambda x: x[1], tupledlist)
+ """Return a sorted copy of a list. If there are only strings in the list,
+ it will not consider case"""
-def tuple_caselesssort(items):
- try:
- tupledlist = map(lambda tuple, lower = string.lower: (lower(tuple[0]), tuple), items)
- except (AttributeError, TypeError):
- items = items[:]
- items.sort()
- return items
- else:
- tupledlist.sort()
- return map(lambda (low, tuple): tuple, tupledlist)
+ try:
+ # turn ['FOO', 'aaBc', 'ABcD'] into [('foo', 'FOO'), ('aabc', 'aaBc'), ('abcd', 'ABcD')], if possible
+ tupledlist = map(lambda item, lower = string.lower: (lower(item), item), alist)
+ except TypeError:
+ # at least one element in alist is not a string, proceed the normal way...
+ alist = alist[:]
+ alist.sort()
+ return alist
+ else:
+ tupledlist.sort()
+ # turn [('aabc', 'aaBc'), ('abcd', 'ABcD'), ('foo', 'FOO')] into ['aaBc', 'ABcD', 'FOO']
+ return map(lambda x: x[1], tupledlist)
+def tuple_caselesssort(items):
+ try:
+ tupledlist = map(lambda tuple, lower = string.lower: (lower(tuple[0]), tuple), items)
+ except (AttributeError, TypeError):
+ items = items[:]
+ items.sort()
+ return items
+ else:
+ tupledlist.sort()
+ return map(lambda (low, tuple): tuple, tupledlist)