mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2024-12-27 10:29:32 +00:00
4325cdcc78
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
380 lines
9.8 KiB
Plaintext
380 lines
9.8 KiB
Plaintext
;
|
||
; 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):
|
||
;
|
||
; <SM3> 11/5/92 SWC Changed PackMacs.a->Packages.a.
|
||
; <SM2> 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
|
||
|