diff options
Diffstat (limited to 'Mac/Tools/IDE/Wlists.py')
-rw-r--r-- | Mac/Tools/IDE/Wlists.py | 581 |
1 files changed, 0 insertions, 581 deletions
diff --git a/Mac/Tools/IDE/Wlists.py b/Mac/Tools/IDE/Wlists.py deleted file mode 100644 index 9aeb7c4..0000000 --- a/Mac/Tools/IDE/Wlists.py +++ /dev/null @@ -1,581 +0,0 @@ -import Wbase -import Wkeys -import string -from Carbon import Evt, Events, Fm, Lists, Qd, Scrap, Win -from Carbon.List import LNew, CreateCustomList -from Carbon.Lists import kListDefUserProcType, lInitMsg, lDrawMsg, lHiliteMsg, lCloseMsg -from Carbon.QuickDraw import hilitetransfermode -from Carbon import App -from Carbon.Appearance import kThemeStateActive, kThemeStateInactive, kThemeStatePressed - - -class List(Wbase.SelectableWidget): - - """Standard list widget.""" - - LDEF_ID = 0 - - def __init__(self, possize, items = None, callback = None, flags = 0, cols = 1, typingcasesens=0): - if items is None: - items = [] - self.items = items - Wbase.SelectableWidget.__init__(self, possize) - self._selected = 0 - self._enabled = 1 - self._list = None - self._cols = cols - self._callback = callback - self._flags = flags - self.typingcasesens = typingcasesens - self.lasttyping = "" - self.lasttime = Evt.TickCount() - self.timelimit = 30 - self.setitems(items) - self.drawingmode = 0 - - def open(self): - self.setdrawingmode(0) - self.createlist() - self.setdrawingmode(1) - - def createlist(self): - self._calcbounds() - self.SetPort() - rect = self._bounds - rect = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1 - self._viewbounds = rect - self._list = LNew(rect, (0, 0, self._cols, 0), (0, 0), self.LDEF_ID, self._parentwindow.wid, - 0, 1, 0, 1) - if self.drawingmode: - self._list.LSetDrawingMode(0) - self._list.selFlags = self._flags - self.setitems(self.items) - if hasattr(self, "_sel"): - self.setselection(self._sel) - del self._sel - - def adjust(self, oldbounds): - self.SetPort() - # Appearance frames are drawn outside the specified bounds, - # so we always need to outset the invalidated area. - self.GetWindow().InvalWindowRect(Qd.InsetRect(oldbounds, -3, -3)) - self.GetWindow().InvalWindowRect(Qd.InsetRect(self._bounds, -3, -3)) - - if oldbounds[:2] == self._bounds[:2]: - # set visRgn to empty, to prevent nasty drawing side effect of LSize() - Qd.RectRgn(self._parentwindow.wid.GetWindowPort().visRgn, (0, 0, 0, 0)) - # list still has the same upper/left coordinates, use LSize - l, t, r, b = self._bounds - width = r - l - 17 - height = b - t - 2 - vl, vt, vr, vb = self._viewbounds - self._viewbounds = vl, vt, vl + width, vt + height - self._list.LSize(width, height) - # now *why* doesn't the list manager recalc the cellrect??? - l, t, r, b = self._list.LRect((0,0)) - cellheight = b - t - self._list.LCellSize((width/self._cols, cellheight)) - # reset visRgn - self._parentwindow.wid.CalcVis() - else: - # oh well, since the list manager doesn't have a LMove call, - # we have to make the list all over again... - sel = self.getselection() - topcell = self.gettopcell() - self._list = None - self.setdrawingmode(0) - self.createlist() - self.setselection(sel) - self.settopcell(topcell) - self.setdrawingmode(1) - - def close(self): - self._list = None - self._callback = None - self.items = [] - Wbase.SelectableWidget.close(self) - - def set(self, items): - self.setitems(items) - - def setitems(self, items): - self.items = items - the_list = self._list - if not self._parent or not self._list: - return - self.setdrawingmode(0) - topcell = self.gettopcell() - the_list.LDelRow(0, 1) - the_list.LAddRow(len(self.items), 0) - self_itemrepr = self.itemrepr - set_cell = the_list.LSetCell - for i in range(len(items)): - set_cell(self_itemrepr(items[i]), (0, i)) - self.settopcell(topcell) - self.setdrawingmode(1) - - def click(self, point, modifiers): - if not self._enabled: - return - isdoubleclick = self._list.LClick(point, modifiers) - if self._callback: - Wbase.CallbackCall(self._callback, 0, isdoubleclick) - return 1 - - def key(self, char, event): - (what, message, when, where, modifiers) = event - sel = self.getselection() - newselection = [] - if char == Wkeys.uparrowkey: - if len(sel) >= 1 and min(sel) > 0: - newselection = [min(sel) - 1] - else: - newselection = [0] - elif char == Wkeys.downarrowkey: - if len(sel) >= 1 and max(sel) < (len(self.items) - 1): - newselection = [max(sel) + 1] - else: - newselection = [len(self.items) - 1] - else: - modifiers = 0 - if (self.lasttime + self.timelimit) < Evt.TickCount(): - self.lasttyping = "" - if self.typingcasesens: - self.lasttyping = self.lasttyping + char - else: - self.lasttyping = self.lasttyping + string.lower(char) - self.lasttime = Evt.TickCount() - i = self.findmatch(self.lasttyping) - newselection = [i] - if modifiers & Events.shiftKey and not self._list.selFlags & Lists.lOnlyOne: - newselection = newselection + sel - self.setselection(newselection) - self._list.LAutoScroll() - self.click((-1, -1), 0) - - def findmatch(self, tag): - lower = string.lower - items = self.items - typingcasesens = self.typingcasesens - taglen = len(tag) - match = '\377' * 100 - match_i = -1 - for i in range(len(items)): - item = str(items[i]) - if not typingcasesens: - item = lower(item) - if tag <= item < match: - match = item - match_i = i - if match_i >= 0: - return match_i - else: - return len(items) - 1 - - def domenu_copy(self, *args): - sel = self.getselection() - selitems = [] - for i in sel: - selitems.append(str(self.items[i])) - text = string.join(selitems, '\r') - if text: - if hasattr(Scrap, 'PutScrap'): - Scrap.ZeroScrap() - Scrap.PutScrap('TEXT', text) - else: - Scrap.ClearCurrentScrap() - sc = Scrap.GetCurrentScrap() - sc.PutScrapFlavor('TEXT', 0, text) - - def can_copy(self, *args): - return len(self.getselection()) <> 0 - - def domenu_selectall(self, *args): - self.selectall() - - def can_selectall(self, *args): - return not self._list.selFlags & Lists.lOnlyOne - - def selectall(self): - if not self._list.selFlags & Lists.lOnlyOne: - self.setselection(range(len(self.items))) - self._list.LAutoScroll() - self.click((-1, -1), 0) - - def getselection(self): - if not self._parent or not self._list: - if hasattr(self, "_sel"): - return self._sel - return [] - items = [] - point = (0,0) - while 1: - ok, point = self._list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - return items - - def setselection(self, selection): - if not self._parent or not self._list: - self._sel = selection - return - set_sel = self._list.LSetSelect - for i in range(len(self.items)): - if i in selection: - set_sel(1, (0, i)) - else: - set_sel(0, (0, i)) - self._list.LAutoScroll() - - def getselectedobjects(self): - sel = self.getselection() - objects = [] - for i in sel: - objects.append(self.items[i]) - return objects - - def setselectedobjects(self, objects): - sel = [] - for o in objects: - try: - sel.append(self.items.index(o)) - except: - pass - self.setselection(sel) - - def gettopcell(self): - l, t, r, b = self._bounds - t = t + 1 - cl, ct, cr, cb = self._list.LRect((0, 0)) - cellheight = cb - ct - return (t - ct) / cellheight - - def settopcell(self, topcell): - top = self.gettopcell() - diff = topcell - top - self._list.LScroll(0, diff) - - def draw(self, visRgn = None): - if self._visible: - if not visRgn: - visRgn = self._parentwindow.wid.GetWindowPort().visRgn - self._list.LUpdate(visRgn) - state = [kThemeStateActive, kThemeStateInactive][not self._activated] - App.DrawThemeListBoxFrame(Qd.InsetRect(self._bounds, 1, 1), state) - if self._selected and self._activated: - self.drawselframe(1) - - def select(self, onoff, isclick = 0): - if Wbase.SelectableWidget.select(self, onoff): - return - self.SetPort() - self.drawselframe(onoff) - - def activate(self, onoff): - self._activated = onoff - if self._visible: - self._list.LActivate(onoff) - #state = [kThemeStateActive, kThemeStateInactive][not onoff] - #App.DrawThemeListBoxFrame(Qd.InsetRect(self._bounds, 1, 1), state) - if self._selected: - self.drawselframe(onoff) - - def get(self): - return self.items - - def itemrepr(self, item): - return str(item)[:255] - - def __getitem__(self, index): - return self.items[index] - - def __setitem__(self, index, item): - if self._parent and self._list: - self._list.LSetCell(self.itemrepr(item), (0, index)) - self.items[index] = item - - def __delitem__(self, index): - if self._parent and self._list: - self._list.LDelRow(1, index) - del self.items[index] - - def __getslice__(self, a, b): - return self.items[a:b] - - def __delslice__(self, a, b): - if b-a: - if self._parent and self._list: - self._list.LDelRow(b-a, a) - del self.items[a:b] - - def __setslice__(self, a, b, items): - if self._parent and self._list: - l = len(items) - the_list = self._list - self.setdrawingmode(0) - if b-a: - if b > len(self.items): - # fix for new 1.5 "feature" where b is sys.maxint instead of len(self)... - # LDelRow doesn't like maxint. - b = len(self.items) - the_list.LDelRow(b-a, a) - the_list.LAddRow(l, a) - self_itemrepr = self.itemrepr - set_cell = the_list.LSetCell - for i in range(len(items)): - set_cell(self_itemrepr(items[i]), (0, i + a)) - self.items[a:b] = items - self.setdrawingmode(1) - else: - self.items[a:b] = items - - def __len__(self): - return len(self.items) - - def append(self, item): - if self._parent and self._list: - index = len(self.items) - self._list.LAddRow(1, index) - self._list.LSetCell(self.itemrepr(item), (0, index)) - self.items.append(item) - - def remove(self, item): - index = self.items.index(item) - self.__delitem__(index) - - def index(self, item): - return self.items.index(item) - - def insert(self, index, item): - if index < 0: - index = 0 - if self._parent and self._list: - self._list.LAddRow(1, index) - self._list.LSetCell(self.itemrepr(item), (0, index)) - self.items.insert(index, item) - - def setdrawingmode(self, onoff): - if onoff: - self.drawingmode = self.drawingmode - 1 - if self.drawingmode == 0 and self._list is not None: - self._list.LSetDrawingMode(1) - if self._visible: - bounds = l, t, r, b = Qd.InsetRect(self._bounds, 1, 1) - cl, ct, cr, cb = self._list.LRect((0, len(self.items)-1)) - if cb < b: - self.SetPort() - Qd.EraseRect((l, cb, cr, b)) - self._list.LUpdate(self._parentwindow.wid.GetWindowPort().visRgn) - self.GetWindow().ValidWindowRect(bounds) - else: - if self.drawingmode == 0 and self._list is not None: - self._list.LSetDrawingMode(0) - self.drawingmode = self.drawingmode + 1 - - -class CustomList(List): - - """Base class for writing custom list definitions.""" - - _cellHeight = 0 - - def createlist(self): - self._calcbounds() - self.SetPort() - rect = self._bounds - rect = rect[0]+1, rect[1]+1, rect[2]-16, rect[3]-1 - self._viewbounds = rect - self._list = CreateCustomList( - rect, - (0, 0, 1, 0), - (0, self._cellHeight), - (kListDefUserProcType, self.listDefinitionFunc), - self._parentwindow.wid, - 0, 1, 0, 1) - if self.drawingmode: - self._list.LSetDrawingMode(0) - self._list.selFlags = self._flags - self.setitems(self.items) - if hasattr(self, "_sel"): - self.setselection(self._sel) - del self._sel - - def listDefinitionFunc(self, message, selected, cellRect, theCell, - dataOffset, dataLen, theList): - """The LDEF message dispatcher routine, no need to override.""" - if message == lInitMsg: - self.listDefInit(theList) - elif message == lDrawMsg: - self.listDefDraw(selected, cellRect, theCell, - dataOffset, dataLen, theList) - elif message == lHiliteMsg: - self.listDefHighlight(selected, cellRect, theCell, - dataOffset, dataLen, theList) - elif message == lCloseMsg: - self.listDefClose(theList) - - def listDefInit(self, theList): - pass - def listDefClose(self, theList): - pass - def listDefDraw(self, selected, cellRect, theCell, - dataOffset, dataLen, theList): - pass - def listDefHighlight(self, selected, cellRect, theCell, - dataOffset, dataLen, theList): - pass - - -class TwoLineList(CustomList): - - _cellHeight = 28 - - def listDefDraw(self, 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() - Qd.EraseRect(cellRect) - - #draw the cell if it contains data - ascent, descent, leading, size, hm = Fm.FontMetrics() - linefeed = ascent + descent + leading - - if dataLen: - left, top, right, bottom = cellRect - data = theList.LGetCell(dataLen, theCell) - lines = data.split("\r") - line1 = lines[0] - if len(lines) > 1: - line2 = lines[1] - else: - line2 = "" - Qd.MoveTo(int(left + 4), int(top + ascent)) - Qd.DrawText(line1, 0, len(line1)) - if line2: - Qd.MoveTo(int(left + 4), int(top + ascent + linefeed)) - Qd.DrawText(line2, 0, len(line2)) - Qd.PenPat("\x11\x11\x11\x11\x11\x11\x11\x11") - bottom = top + theList.cellSize[1] - Qd.MoveTo(left, bottom - 1) - Qd.LineTo(right, bottom - 1) - if selected: - self.listDefHighlight(selected, cellRect, theCell, - dataOffset, dataLen, theList) - #restore graphics environment - Qd.SetPort(savedPort) - Qd.SetClip(savedClip) - Qd.DisposeRgn(savedClip) - Qd.SetPenState(savedPenState) - - def listDefHighlight(self, 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() - Qd.PenMode(hilitetransfermode) - Qd.PaintRect(cellRect) - - #restore graphics environment - Qd.SetPort(savedPort) - Qd.SetClip(savedClip) - Qd.DisposeRgn(savedClip) - Qd.SetPenState(savedPenState) - - -class ResultsWindow: - - """Simple results window. The user cannot make this window go away completely: - closing it will just hide it. It will remain in the windows list. The owner of this window - should call the done() method to indicate it's done with it. - """ - - def __init__(self, possize=None, title="Results", callback=None): - import W - if possize is None: - possize = (500, 200) - self.w = W.Window(possize, title, minsize=(200, 100)) - self.w.results = W.TwoLineList((-1, -1, 1, -14), callback=None) - self.w.bind("<close>", self.hide) - self.w.open() - self._done = 0 - - def done(self): - self._done = 1 - if not self.w.isvisible(): - self.w.close() - - def hide(self): - if not self._done: - self.w.show(0) - return -1 - - def append(self, msg): - if not self.w.isvisible(): - self.w.show(1) - self.w.select() - msg = string.replace(msg, '\n', '\r') - self.w.results.append(msg) - self.w.results.setselection([len(self.w.results)-1]) - - def __getattr__(self, attr): - return getattr(self.w.results, attr) - - -class MultiList(List): - - """XXX Experimantal!!!""" - - def setitems(self, items): - self.items = items - if not self._parent or not self._list: - return - self._list.LDelRow(0, 1) - self.setdrawingmode(0) - self._list.LAddRow(len(self.items), 0) - self_itemrepr = self.itemrepr - set_cell = self._list.LSetCell - for i in range(len(items)): - row = items[i] - for j in range(len(row)): - item = row[j] - set_cell(self_itemrepr(item), (j, i)) - self.setdrawingmode(1) - - def getselection(self): - if not self._parent or not self._list: - if hasattr(self, "_sel"): - return self._sel - return [] - items = [] - point = (0,0) - while 1: - ok, point = self._list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - return items - - def setselection(self, selection): - if not self._parent or not self._list: - self._sel = selection - return - set_sel = self._list.LSetSelect - for i in range(len(self.items)): - for j in range(len(self.items[i])): - if i in selection: - set_sel(1, (j, i)) - else: - set_sel(0, (j, i)) - #self._list.LAutoScroll() |