; ; File: IconLDEF.a ; ; Contains: A List Manager procedure definition which ; creates a scrollable list of icons. ; ; Written by: Steve Horowitz & Francis Stanbach ; ; Copyright: © 1986-1992 by Apple Computer, Inc. All rights reserved. ; ; Change History (most recent first): ; ; 11/5/92 SWC Changed PackMacs.a->Packages.a. ; 11/3/92 SWC Replaced INCLUDEs with a LOAD of StandardEqu.d. ; <4> 1/8/91 JDR (dba) Private icon utilities are now in IconUtilsPriv.a ; <3> 9/25/90 fjs add icon suite stuff for people who pass ICN#s to the list ; (Network & Startup Panels) ; <2> 6/22/90 fjs add support for icon suites and do international truncation ; 6/21/90 fjs add icon suite support, and truncstring ; 20jun86 sad preserve txFont, txFace, txSize and txMode ; _LoadResource if ICON handle seems to have been purged ; changed a couple lsr's into asr's ; reorganize to calc rects and truncate text just once per call ; handle cells w/o strings correctly ; handle ICONs w/o masks ; 8jun87 sad set HiliteMode bit for color text hilighting ; 7nov89 fjs looks for Asyms in the Objects Folder ; BLANKS ON STRING ASIS LOAD 'StandardEqu.d' INCLUDE 'Packages.a' include 'IconUtilsPriv.a' ; Cell Format ;cell RECORD ;cHand ds.l 1 ; Icon Handle ;cFont ds.w 1 ; font number? ;cFace ds.w 1 ; font style in low-order byte ;cSize ds.w 1 ; font size ;cName ds.b 256 ; Str255 ; ENDR cMin equ 4 ; if cell length ≠ cMin it has text ; Variables stack RECORD {a6link},decr lsMessage ds.w 1 ; What to do? filler ds.b 1 lsSelect ds.b 1 ; boolean lsRectp ds.l 1 ; ptr to Rectangle lsCell ds.l 1 ; point lsDataOffset ds.w 1 ; offset to desired data lsDataLen ds.w 1 ; data length lsHandle ds.l 1 ; listHandle return ds.l 1 a6link ds.l 1 fontinfo ds.w 4 ; font info for text font lsWidth ds.w 1 ; width of lsRect iconRect ds.l 2 ; Rect to draw icon in textRect ds.l 2 ; Rect to draw text in bitMap ds.b bitMapRec ; BitMap to draw icon with ; --- copy of cell data text ds.b 256 textSize ds.w 1 textFace ds.w 1 textFont ds.w 1 iconHndl ds.l 1 cellCopy equ * localsize equ * ENDR ; IconLDEF ; d5.w - cell width ; d6.b - true iff there is text in this cell ; a3.l - ptr to copy of text (gets truncated) ; a4.l - Icon Handle IconLDEF main export with stack link a6,#localsize movem.l a3-a4/d3-d6,-(sp) ; preserve registers cmp.w #lDrawMsg,lsMessage(a6) ; is it a draw message? beq.s DrawIcon ; if so then draw icon cmp.w #lHiliteMsg,lsMessage(a6) ; is it a hilite message? beq.s DrawIcon ; if so then invert icon state IconExit movem.l (sp)+,a3-a4/d3-d6 ; restore registers unlk a6 move.l (sp)+,a0 lea stack-8(sp),sp jmp (a0) ; Exit DrawIcon cmp.w #lDrawMsg,lsMessage(a6) ; erase the cell if it is bne.s @1 ; a draw message move.l lsRectp(a6),-(sp) ; push cell rectangle _EraseRect ; erase it @1 tst.w lsDataLen(a6) ; is there any data? bz.s IconExit ; if not, leave ; save cell width move.l lsRectp(a6),a0 move.w right(a0),d5 sub.w left(a0),d5 ; copy the cell data into our stack frame (aligning it) move.l lsHandle(a6),a0 ; get handle to List move.l (a0),a0 ; handle -> ptr move.l cells(a0),a0 ; get dataHandle into a0 move.l (a0),a0 ; handle -> ptr add.w lsDataOffset(a6),a0 ; put start of data in a0 lea cellCopy(a6),a1 ; a1 points to destination move.l #0,d0 ; clear high word move.w lsDataLen(a6),d0 ; number of bytes to move _BlockMove ; calculate iconRect and textRect vertical lea text(a6),a3 ; get ptr to copy of text moveq #32,d4 ; vertical size of Icon ; is there text? cmp #cMin,lsDataLen(a6) sne d6 ; true iff there is text beq.s @2 ; skip this if no text ; set up text Font, Face, Size and Mode move.l GrafGlobals(a5),a0 ; get quickDraw globals ptr move.l thePort(a0),a0 ; get thePort move.l txFont(a0),-(sp) ; save txFace, txFont move.l txMode(a0),-(sp) ; save txSize, txMode move.l textFont(a6),-(sp) ; push cell text Face, Font _TextFont _TextFace move.w #srcOr,-(sp) ; text transfer mode _TextMode move.w textSize(a6),-(sp) ; push cell text Size _TextSize pea fontinfo(a6) ; push ptr to fontInfo _GetFontInfo add.w fontinfo+leading(a6),d4 add.w fontinfo+ascent(a6),d4 ; add up height of text add.w fontinfo+descent(a6),d4 @2 move.l lsRectp(a6),a0 ; a0 points to Rect move.w bottom(a0),d1 ; calculates height of Rect sub.w top(a0),d1 ; rect height in d0 sub.w d4,d1 ; subtract icon height from rect asr.w #1,d1 ; divide d0 by 2 add.w top(a0),d1 ; add original top move.w d1,iconRect+top(a6) ; assign rectTop add.w #32,d1 move.w d1,iconRect+bottom(a6) ; assign rectBottom ; calculate icon Rect width move.w d5,d0 ; get cell width sub.w #32,d0 ; subtract icon width asr.w #1,d0 ; divide d1 by 2 add.w left(a0),d0 ; add original left move.w d0,iconRect+left(a6) ; assign rectLeft add.w #32,d0 move.w d0,iconRect+right(a6) ; assign rectRight tst.b d6 ; is there text? bz.s @6 ; no, skip move.w d1,textRect+top(a6) add.w fontinfo+leading(a6),d1 add.w fontinfo+ascent(a6),d1 ; add text height add.w fontinfo+descent(a6),d1 move.w d1,textRect+bottom(a6) ; setup bottom of text rect ; truncate text move.w d5,d4 ; get cell width sub.w #2,d4 ; don’t let text touch sides of cell moveq #0,d3 ; clear d3 move.b (a3),d3 ; get length of string add.b #1,d3 ; initial conditions sub.l #2,sp ; room for result of _StringWidths @3 move.l a3,-(sp) ; push string _StringWidth cmp.w (sp),d4 ; is string too long? (no pop!) bgt.s @4 ; no, continue ; if the string is too long then truncate it subq #2,sp ; returns whether string truncated move.w d4,-(sp) ; width move.l a3,-(sp) ; StringPtr move.w #smTruncMiddle,-(sp) ; truncate in the middle _TruncString addq #2,sp ; ignore result move.l a3,-(sp) ; push string _StringWidth @4 move.w (sp)+,d3 ; pop string width into d3 ; calculate textRect left and right move.w d5,d0 ; get cell width sub.w d3,d0 ; subtract text width asr.w #1,d0 ; divide d0 by 2 move.l lsRectp(a6),a0 ; a0 points to listRect add.w left(a0),d0 ; add original left move.w d0,textRect+left(a6) ; setup left of text rect add.w d0,d3 ; setup right of text rect add.w #1,d3 move.w d3,textRect+right(a6) @6 ; set up bitmap for _CopyBits move.l #0,bitmap+bounds+topLeft(a6) ; (0,0) move.l #$00200020,bitmap+bounds+botRight(a6) ; (32,32) move.w #4,bitmap+rowBytes(a6) ; set up rowBytes field move.l iconHndl(a6),a4 ; get icon handle ; check to see if this is an icon suite move.l a4,a0 _GetHandleSize cmp #128,d0 ; if it less than 64, it is an icon suite blt DoSuite ; ••• start subq #4,sp ; make space for suite handle move.l sp,a0 ; pointer to space in a0 tst.l (a4) ; is it purged? bnz.s @5 move.l a4,-(sp) _LoadResource ; preserves all regs ; create the suite @5 subq #2,sp ; make room for error move.l a0,-(sp) ; place for suite _NewIconSuite ; create a suite move.w (sp)+,d0 ; error in d0 move.l (sp)+,a0 ; suite in a0 bnz.s @error ; IconExit ; add the icon subq #2,sp ; room for error move.l a4,-(sp) ; push the icon move.l a0,-(sp) ; push the suite move.l #'ICN#',-(sp) ; its a B & W Icon move.l a0,a4 ; save the suite before the trap is called _AddIconToSuite move.w (sp)+,d0 ; ignore error bsr SDrawIt ; draw the suite ; dispose the suite subq #2,sp ; room for result move.l a4,-(sp) ; icon suite move.b #0,-(sp) ; do not kill ICN# _DisposeIconSuite addq #2,sp ; ignore @error bra AfterSDrawit ; jump back in InvertText tst.b d6 ; is there text? bz IconExit ; no, split bclr #7,HiliteMode ; now in color! <8Jun87 sad> pea textRect(a6) ; push enclosing rectangle _InverRect ; invert text TextExit ; restore text Mode, Size, Font and Face and leave _TextMode _TextSize _TextFont _TextFace bra IconExit ; draw the text if it exists DrawTheText tst.b d6 ; is there text? bz.s @1 ; no move.w textRect+left(a6),d0 add.w #1,d0 ; don’t touch left side of textRect move.w d0,-(sp) ; horiz move.w textRect+top(a6),d0 add.w fontinfo+leading(a6),d0 add.w fontinfo+ascent(a6),d0 move.w d0,-(sp) ; vert _MoveTo move.l a3,-(sp) ; push ptr to string _DrawString ; draw it @1 rts ;------------------------------ DoSuite move.l a4,d0 ; is it there? bz IconExit bsr.s SDrawIt ; always draw the icon AfterSDrawIt cmp.w #lDrawMsg,lsMessage(a6) ; is it a draw message? bne InvertText ; no, its a hilite message SDoDrawMsg bsr.s DrawTheText tst.b lsSelect(a6) ; is it selected? bnz InvertText ; yes tst.b d6 ; is there text? bz IconExit ; no, split bra TextExit ; else, split with fonts SDrawIt ; draw the icon with the proper transform move.w #ttNone,d0 ; assume no transform tst.b lsSelect(a6) ; is it selected? bz.s @plotSuite move.w #ttSelected,d0 ; use selected transform @plotSuite subq #2,sp ; return error pea iconRect(a6) ; push the rect move.w #0,-(sp) ; no alignment move.w d0,-(sp) ; transform move.l a4,-(sp) ; push the suite _PlotIconSuite ; thanks DC move.w (sp)+,d0 ; get and ignore the error rts endwith end