diff options
Diffstat (limited to 'Mac/Tools/IDE/PyBrowser.py')
-rw-r--r-- | Mac/Tools/IDE/PyBrowser.py | 1113 |
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) |