1"""browsepict - Display all "cicn" resources found""" 2 3import FrameWork 4import EasyDialogs 5from Carbon import Res 6from Carbon import Qd 7from Carbon import Win 8from Carbon import Controls 9from Carbon import List 10from Carbon import Icn 11import macresource 12 13# 14# Resource definitions 15ID_MAIN=512 16MAIN_LIST=1 17MAIN_SHOW=2 18 19# Where is the picture window? 20LEFT=200 21TOP=64 22MINWIDTH=32 23MINHEIGHT=32 24MAXWIDTH=320 25MAXHEIGHT=320 26 27def main(): 28 macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc") 29 CIconbrowse() 30 31class CIconbrowse(FrameWork.Application): 32 def __init__(self): 33 # First init menus, etc. 34 FrameWork.Application.__init__(self) 35 # Next create our dialog 36 self.main_dialog = MyDialog(self) 37 # Now open the dialog 38 contents = self.findcicnresources() 39 self.main_dialog.open(ID_MAIN, contents) 40 # Finally, go into the event loop 41 self.mainloop() 42 43 def makeusermenus(self): 44 self.filemenu = m = FrameWork.Menu(self.menubar, "File") 45 self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit) 46 47 def quit(self, *args): 48 self._quit() 49 50 def showCIcon(self, resid): 51 w = CIconwindow(self) 52 w.open(resid) 53 #EasyDialogs.Message('Show cicn %r' % (resid,)) 54 55 def findcicnresources(self): 56 num = Res.CountResources('cicn') 57 rv = [] 58 for i in range(1, num+1): 59 Res.SetResLoad(0) 60 try: 61 r = Res.GetIndResource('cicn', i) 62 finally: 63 Res.SetResLoad(1) 64 id, type, name = r.GetResInfo() 65 rv.append((id, name)) 66 return rv 67 68class CIconwindow(FrameWork.Window): 69 def open(self, (resid, resname)): 70 if not resname: 71 resname = '#%r' % (resid,) 72 self.resid = resid 73 self.picture = Icn.GetCIcon(self.resid) 74 l, t, r, b = 0, 0, 32, 32 75 self.pictrect = (l, t, r, b) 76 width = r-l 77 height = b-t 78 if width < MINWIDTH: width = MINWIDTH 79 elif width > MAXWIDTH: width = MAXWIDTH 80 if height < MINHEIGHT: height = MINHEIGHT 81 elif height > MAXHEIGHT: height = MAXHEIGHT 82 bounds = (LEFT, TOP, LEFT+width, TOP+height) 83 84 self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) 85 self.do_postopen() 86 87 def do_update(self, *args): 88 currect = self.fitrect() 89 Icn.PlotCIcon(currect, self.picture) 90 91 def fitrect(self): 92 """Return self.pictrect scaled to fit in window""" 93 graf = self.wid.GetWindowPort() 94 screenrect = graf.GetPortBounds() 95 picwidth = self.pictrect[2] - self.pictrect[0] 96 picheight = self.pictrect[3] - self.pictrect[1] 97 if picwidth > screenrect[2] - screenrect[0]: 98 factor = float(picwidth) / float(screenrect[2]-screenrect[0]) 99 picwidth = picwidth / factor 100 picheight = picheight / factor 101 if picheight > screenrect[3] - screenrect[1]: 102 factor = float(picheight) / float(screenrect[3]-screenrect[1]) 103 picwidth = picwidth / factor 104 picheight = picheight / factor 105 return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth), 106 screenrect[1]+int(picheight)) 107 108class MyDialog(FrameWork.DialogWindow): 109 "Main dialog window for cicnbrowse" 110 111 def open(self, id, contents): 112 self.id = id 113 FrameWork.DialogWindow.open(self, ID_MAIN) 114 self.dlg.SetDialogDefaultItem(MAIN_SHOW) 115 self.contents = contents 116 self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST) 117 h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart, 118 Controls.kControlListBoxListHandleTag) 119 self.list = List.as_List(h) 120 self.setlist() 121 122 def setlist(self): 123 self.list.LDelRow(0, 0) 124 self.list.LSetDrawingMode(0) 125 if self.contents: 126 self.list.LAddRow(len(self.contents), 0) 127 for i in range(len(self.contents)): 128 v = repr(self.contents[i][0]) 129 if self.contents[i][1]: 130 v = v + '"' + self.contents[i][1] + '"' 131 self.list.LSetCell(v, (0, i)) 132 self.list.LSetDrawingMode(1) 133 self.list.LUpdate(self.wid.GetWindowPort().visRgn) 134 135 def getselection(self): 136 items = [] 137 point = (0,0) 138 while 1: 139 ok, point = self.list.LGetSelect(1, point) 140 if not ok: 141 break 142 items.append(point[1]) 143 point = point[0], point[1]+1 144 values = [] 145 for i in items: 146 values.append(self.contents[i]) 147 return values 148 149 def do_show(self, *args): 150 selection = self.getselection() 151 for resid in selection: 152 self.parent.showCIcon(resid) 153 154 def do_close(self): 155 self.close() 156 157 def do_itemhit(self, item, event): 158 if item == MAIN_SHOW: 159 self.do_show() 160 161main() 162