Home | History | Annotate | Download | only in PICTbrowse
      1 """browsepict - Display all "ICON" resources found"""
      2 
      3 import FrameWork
      4 import EasyDialogs
      5 from Carbon import Res
      6 from Carbon import Qd
      7 from Carbon import Win
      8 from Carbon import Controls
      9 from Carbon import List
     10 from Carbon import Icn
     11 import macresource
     12 
     13 #
     14 # Resource definitions
     15 ID_MAIN=512
     16 MAIN_LIST=1
     17 MAIN_SHOW=2
     18 
     19 # Where is the picture window?
     20 LEFT=200
     21 TOP=64
     22 MINWIDTH=32
     23 MINHEIGHT=32
     24 MAXWIDTH=320
     25 MAXHEIGHT=320
     26 
     27 def main():
     28     macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc")
     29     ICONbrowse()
     30 
     31 class ICONbrowse(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.findICONresources()
     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 showICON(self, resid):
     51         w = ICONwindow(self)
     52         w.open(resid)
     53         #EasyDialogs.Message('Show ICON %r' % (resid,))
     54 
     55     def findICONresources(self):
     56         num = Res.CountResources('ICON')
     57         rv = []
     58         for i in range(1, num+1):
     59             Res.SetResLoad(0)
     60             try:
     61                 r = Res.GetIndResource('ICON', i)
     62             finally:
     63                 Res.SetResLoad(1)
     64             id, type, name = r.GetResInfo()
     65             rv.append((id, name))
     66         return rv
     67 
     68 class ICONwindow(FrameWork.Window):
     69     def open(self, (resid, resname)):
     70         if not resname:
     71             resname = '#%r' % (resid,)
     72         self.resid = resid
     73         self.picture = Icn.GetIcon(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.PlotIcon(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 
    108 class MyDialog(FrameWork.DialogWindow):
    109     "Main dialog window for ICONbrowse"
    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.showICON(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 
    161 main()
    162