mac-rom/Toolbox/StandardFile/StandardFileLDEF.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
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.
2017-12-26 09:52:23 +08:00

485 lines
17 KiB
Plaintext

;
; File: StandardFileLDEF.a
;
; Contains: an LDEF to draw a small icon and name next to it for Standard File
;
; Copyright: © 1990-1992 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM2> 11/6/92 SWC Changed PackMacs.a->Packages.a.
; <1> 10/1/91 JSM first checked in
; <0> 10/1/91 JSM Created from StandardFile3.LDEF.a.
;
; Modification history from StandardFile3.LDEF.a below:
;
; <14> 12/13/90 ngk <KSM>now gray disabled icons in color window on 1-bit monitor
; <13> 10/29/90 ngk Now gray out icons of disabled items.
; <12> 9/17/90 ngk change _PenMode to _TextMode to sync with changes to gray text
; also have a hack to set TextMode back to srcOr.
; <11> 8/17/90 gbm make grayishTextCopy into grayishTextOr
; <10> 8/11/90 ngk fix bug where it could trash rowBytes of a B&W grafport
; <9> 8/5/90 ngk Use trueGray for drawing dimmed text. repack FileEntry. use rgb
; array instead of pltt for colorized icons.
; <8> 7/2/90 ngk Now use hilite color for selecting items. Added color to icons.
; The userHandle of the listrec is assumed to contain a "palette",
; and each file entry contains the index into the table. It does
; not use the palette manager, just the stucture for holding a
; list of colors.
; <7> 6/6/90 ngk reduced include files
; <6> 5/2/90 ngk include IntlUtilsPriv.a
; <5> 4/11/90 ngk fix plotMini bug if SICN not found
; <4> 3/18/90 ngk Fix 68000 bug of hilite on draw not working.
; <3> 3/5/90 PKE Added smTruncEnd as truncWhere parameter for TruncString call,
; since TruncString interface now matches former NTruncString
; interface.
; <2> 2/25/90 ngk Added ability to put icon of left or right, and justify text
; <1> 2/17/90 ngk Made into real stand-alone LDEF
;
; 1.8 ngk 11/14/1989 Changed FileEntry to be a real record.
; 1.7 ngk 11/08/1989 fixed bug where incorrectly test data len often caused missing items
; 1.6 JRM 10/30/1989 changes because script and style are part of in file
; record
; 1.5 ngk 09/13/1989 fixed bug where you could select a dimmed item
; fixed bug where incorrectly test data len often caused missing items
; 1.4 JRM 08/11/1989 Add back in 604 conditionals that Darin said I could
; take out
; 1.3 JRM 08/08/1989 7.0d10 release
; 1.2 JRM 06/08/1989 sf conditionals for bigbang and 604
; 1.1 JRM 06/05/1989 big bang standard file - see StandardFilePACK.a
; 1.0 CCH 11/16/1988 Added to EASE.
;
; To Do:
; maybe use icon utils to plot icon
;
LOAD 'StandardEqu.d'
INCLUDE 'Packages.a' ; for list manager
INCLUDE 'StandardFilePriv.a' ; for LDEF record structure
Point RECORD 0 ; Point = RECORD CASE INTEGER OF
v DS.W 1 ; 1: (v: INTEGER;
h DS.W 1 ; h: INTEGER);
ORG v
vh DS.W h ; 2: (vh: ARRAY[1..2] OF INTEGER)
ENDR ; END;
Rect RECORD 0 ; Rect = RECORD CASE INTEGER OF
top DS.W 1 ; 1: (top: INTEGER;
left DS.W 1 ; left: INTEGER;
bottom DS.W 1 ; bottom: INTEGER;
right DS.W 1 ; right: INTEGER);
ORG top ;
topLeft DS Point ; 2: (topLeft: Point;
botRight DS Point ; 3: (botRight: Point)
ENDR ; END;
BitMap RECORD 0 ; BitMap = RECORD
baseAddr DS.L 1 ; baseAddr: QDPtr;
rowBytes DS.W 1 ; rowBytes: INTEGER;
bounds DS Rect ; bounds: Rect
ENDR ; END;
LFrame RECORD {A6Link},DECR
LParamSize EQU *-8 ; prameters to remove on return
lMessage DS.W 1 ; selector
lSelect DS.W 1 ; item selected?
lRect DS.L 1 ; ptr to rectangle
lCell DS.L 1 ; ?
lDataOffset DS.W 1 ; offset into data
lDataLen DS.W 1 ; length of data
lHandle DS.L 1 ; which list
ReturnAddr DS.L 1
A6Link DS.L 1
; locals go here
savedFont DS.W 1 ; saved copy of port font number
savedSize DS.W 1 ; saved copy of port font size
savedFace DS.W 1 ; saved copy of port font face
savedForeColor DS.B 6 ; saved copy of fore ground color while plotting icon
theBackColor DS.B 6 ; back ground color while plotting icon
grayForeColor DS.B 6 ; gray fore ground color while plotting dimmed icon
iconForeColor DS.B 6 ; color of icon to plot
tempString DS.B 64 ; copy of string to be truncated
sicnBitMap DS BitMap ; BitMap to hold SICN for copyBits
canUseTrueGray DS.B 1 ; boolean of whether to use true gray or patterned gray
isDimmed DS.B 1 ; boolean of whether to dim the item
colorChanged DS.B 1 ; boolean of whether color needs to be restored after plot
ALIGN
LFrameSize EQU * ; size of link
ENDR
BLANKS ON
STRING ASIS
;-------------------------------------------------------------
;
; LDEF for Standard File
;
;
; PROCEDURE DrawCell(lMessage:INTEGER; lSelect:BOOLEAN; lRect: Rect; lCell: Cell;
; lDataOffset, lDataLen:INTEGER; lHandle:Handle);
LDefEntry MAIN EXPORT
bra.s LDefStart ; bra around std header
DC.W 0 ; flags
DC.L ('LDEF')
DC.W -4000 ; pack id
DC.W 0 ; version
WITH LFrame
LDefStart LINK A6,#LFrameSize ; set up a stack frame
MOVEM.L D2-D7/A2-A4,-(SP) ; save the usual stuff
MOVE.L lHandle(A6),A4 ; get handle to list record
MOVE.L (A4),A3 ; get pointer to (locked) record
MOVE.W lMessage(A6),D0 ; why am I being called?
SUBQ #1,D0 ; draw message?
BEQ.s Draw ; br if so
SUBQ #1,D0 ; hilite message?
BEQ.S Hilite ; br if so
; ignore other messages
LDefExit MOVEM.L (SP)+,D2-D7/A2-A4 ; restore the usual stuff
UNLK A6 ; unlink our frame
MOVE.L (SP)+,A0 ; get return address
ADD.L #LParamSize,SP ; strip off parameters
JMP (A0) ; and return
;---------------
; LHilite -- Here is the code that hilights/unhilights the
; cell. We know that it's drawn, and that we're only called
; if it needs to be de/selected, so inverrect is all we need.
Hilite
move.w lDataOffset(a6),d0 ; offset to cell data
move.l cells(A3),a0 ; get data handle
move.l (a0),a0 ; dereference data handle
tst.b FileEntry.feFile.dimmed(a0,d0) ; dimmed?
bne.s LDefExit ; br if so, skip hiliting
bclr #7,HiliteMode ; now in color!
move.l lRect(A6),-(SP) ; push rect
_InverRect ; and invert it
bra.s LDefExit ; all done
;---------------
; LDraw -- Here is the code that does the drawing
; for the defProc. Sets up most registers and lets DrawIconAndFileName do the work.
Draw
_PenNormal
move.l lRect(A6),-(sp)
_EraseRect ; clear background area
MOVE.L cells(A3),A4 ; A4 = data handle
MOVE.L A4, A0 ; get handle 2mar87
_HGetState ; get lock state 2mar87
MOVE.B d0, -(SP) ; save handle state for exit 2mar87
_HLock ; and lock it 2mar87
; figure if true gray exists
clr.b canUseTrueGray(a6)
cmp.w #$3FFF,ROM85 ; do we have color QD?
bhi.s @usePattern ; no, this system has B&W QD
move.l GrafGlobals(A5),A0 ; <10>
move.l thePort(A0),A0 ; get QuickDraw globals <10>
move.w portVersion(A0),d0 ; <10>
and.w #$C000,d0 ; are we using a color grafport? <10>
beq.s @usePattern ; if not use patterned gray
st canUseTrueGray(a6)
@usePattern
; figure if the item is dimmed
move.l (a4),a0 ; dereference data handle
move.w lDataOffset(a6),d0 ; offset to cell data
tst.b FileEntry.feFile.dimmed(a0,d0.w) ; dimmed?
sne isDimmed(a6)
; draw it !
bsr.s DrawIconAndFileName ; and draw the cell
; see if this needs to be dimmed
tst.b isDimmed(a6)
beq.s @skipDim
tst.b canUseTrueGray(a6) ; is it already dimmed via TrueGray?
bne.s @skipDim ; if so don't pattern over it
; bit clear the rect with gray
move.l (A5),A0 ; get QuickDraw globals
pea Gray(A0) ; push gray
_PenPat ; set pen to it
move.w #PatBIC,-(SP) ; push patBIC penMode
_PenMode ; set penMode
move.l lRect(A6),-(sp)
_PaintRect ; or on the dim pattern
_PenNormal
@skipDim
MOVE.L cells(A3),A0 ; data handle
MOVE.B (SP)+, D0 ; and saved handle state <2mar87>
_HSetState ; restore lock state <2mar87>
@quickInvert
tst.b lSelect(A6) ; selected?
bne.s Hilite
bra LDefExit ; and return
;-----------------------------------------------------------------
;
; a3 = locked list record ptr
;
DrawIconAndFileName
move.l cells(a3),a4
move.l (a4),a4
move.w lDataOffset(a6),d0
lea (a4,d0.w),a4 ; a4 will be pointer to the file entry
sf colorChanged(a6) ; default
; set up the mini icon color
tst.b isDimmed(a6)
beq.s @notDimmed ; if not dimmed, try using colors
tst.b canUseTrueGray(a6)
beq.s @colorSetUp ; if dimmed, but can't truegray, then will be dithered
; get gray color to use
pea theBackColor(a6)
_GetBackColor ; get back color, for GetGray()
pea savedForeColor(a6)
_GetForeColor ; remember fore color, for restoring
pea grayForeColor(a6)
_GetForeColor ; get fore color, for GetGray()
subq #2,sp ; room for GetGray result
subq #4,sp ; room for device handle ### this should be window's device
_GetMainDevice
pea theBackColor(a6) ; in: backColor
pea grayForeColor(a6) ; in: foreColor, out: grayColor (mix of fore and back)
_GetGray
move.b (sp)+,canUseTrueGray(a6) ; returns true if made gray
beq.s @colorSetUp ; if true gray failed, don't set foreground
pea grayForeColor(a6)
bra.s @setFColor ; set foreground to draw in gray
@notDimmed tst.l userHandle(a3)
beq.s @colorSetUp ; NIL means no color info
tst.b lSelect(a6) ; only do color on non-selected lines
bne.s @colorSetUp
pea savedForeColor(a6) ; save current foregrounc color
_GetForeColor
move.w FileEntry.feIconColor(a4),d0 ; no label -> no color
beq.s @colorSetUp
subq.w #1,d0 ; zero based
asl.w #1,d0 ; * SizeOf(RGBColor)
move.w d0,d1
asl.w #1,d1
add.w d1,d0
move.l userHandle(a3),a0 ; get ptr to colors
pea (a0,d0.w)
@setFColor _RGBForeColor ; switch foreground to that color
st colorChanged(a6) ; mark that color was changed
@colorSetUp move.l lRect(a6),a0 ; A0 ^rect
move.l Rect.topLeft(a0),d1 ; get topleft
add.w indent+h(a3),d1 ; add in horizontal indent
tst.b FileEntry.feIconLeft(a4) ; is icon on left?
bne.s @1
move.w Rect.Right(a0),d1 ; get topRight
sub.w #iconWidth,d1 ; need to pass topLeft corner to PlotMini
sub.w indent+h(a3),d1 ; factor in horizontal indent
@1 sub.l #$00010000,d1 ; vertical fudge
move.w FileEntry.feIcon(a4),d0 ; icon selector
bsr PlotMini
tst.b colorChanged(a6)
beq.s @colorRestored
pea savedForeColor(a6)
_RGBForeColor ; restore foreground color
@colorRestored
; make a copy of the string so we don't destroy it
lea tempString(a6),a1 ; destination string
lea FileEntry.feFile.text(a4),a0; get ptr to source string
moveq #0,d0 ; get a long count
move.b (a0),d0 ; get the count
addq.b #1,d0 ; add in the length byte
_BlockMove ; get name to be trunc'd
; save off port font info before changing
move.l port(a3),a1 ; get its grafport
move.w txFont(a1),savedFont(a6) ; save off font state
move.w txFace(a1),savedFace(a6)
move.w txSize(a1),savedSize(a6)
@checkFont move.w FileEntry.feFile.font(a4),d0 ; get font
cmp.w savedFont(a6),d0 ; same as port's font?
beq.s @checkFace ; br if so, skip set
move d0,-(sp)
_TextFont ; set font
@checkFace move.b FileEntry.fefile.style(a4),d0 ; get face
cmp.w savedFace(a6),d0 ; same as port's face?
beq.s @checkSize ; br if so, skip set
move d0,-(sp)
_TextFace ; set face
@checkSize move.w FileEntry.feFile.size(a4),d0 ; get size
cmp.w savedSize(a6),d0 ; same as port's size?
beq.s @checkWidth ; br if so, skip set
move d0,-(sp)
_TextSize ; set size
@checkWidth
move.l lRect(a6),a0
move.w Rect.right(a0),d3
sub.w Rect.left(a0),d3 ; got width of rectangle
sub.w indent+h(a3),d3 ; got width less indent
sub.w #iconWidth+iconPad,d3 ; less icon and its padding
subq #2,SP ; space for result
pea tempString(a6)
_StringWidth
cmp.w (sp)+,d3
bgt.s @truncDone
; text doesn't fit, so let's try using condensed mode
move.b FileEntry.feFile.style(a4),d0 ; get current style
bset #condenseBit,d0 ; add condensed to current style
move.w d0,-(SP) ; and set it
_TextFace
; let _TruncString truncate the string if needed
subq #2,SP ; returns whether string truncated
move.w D3,-(SP) ; width
pea tempString(a6) ; the string
move.w #smTruncEnd,-(SP) ; truncate at end <3>
_TruncString
addq #2,SP ; ignore result
@truncDone
; position the pen to draw the file name
move.l lRect(a6),a0 ; A0 = rect
move.l Rect.topLeft(a0),d1 ; get topleft
add.l indent(a3),d1 ; add in horizontal and vertical indent
tst.b FileEntry.feIconLeft(a4); is icon on left?
beq.s @2 ; if not, don't move over for icon
add.w #iconWidth+iconPad,d1 ; shift over width of icon plus pad on each side
@2 cmp.b #teJustLeft,FileEntry.feJust(a4) ; normal left justification?
beq.s @moveTo ; is so, go on
cmp.b #teJustRight,FileEntry.feJust(a4) ; right justification?
bne.s @moveTo ; if not, can't handle it, go on
; need to move pen over so draw will end on the right border
move.l d1,-(sp) ; save d1
subq #2,SP ; space for result
pea tempString(a6)
_StringWidth
move.w (sp)+,d0 ; d0.w = string width
move.l (sp)+,d1 ; restore d1
move.l lRect(A6),a0
move.w Rect.right(a0),d2
tst.b FileEntry.feIconLeft(a4); is icon on left?
bne.s @3 ; if not, don't move over for icon
sub.w #iconWidth+iconPad+3,d2 ; shift over width of icon plus pad
@3 sub.w d1,d2 ; got width in which to draw
sub.w d0,d2 ; got width of no drawn
add.w d2,d1 ; d1 now shifted over to start draw
@moveTo move.l d1,-(sp)
_MoveTo ; position the pen
tst.b isDimmed(a6) ; is this item dimmed?
beq.s @drawIt
tst.b canUseTrueGray(a6) ; can we true-gray it?
beq.s @drawIt
move.w #grayishTextOr,-(SP) ; yes => set the pen mode to grayishTextOr
_TextMode ; <12 ngk 17Sept90 >
@drawIt
; draw the file name
pea tempString(a6) ; the string
_DrawString
_PenNormal
move.w #srcOr,-(SP) ; force gray off <12 ngk 17Sept90 > is this required?
_TextMode ; <12 ngk 17Sept90 > is this required?
; restore port's font state
move.l port(a3),a1 ; get its grafport
@restoreFont
move.w savedFont(a6),d0 ; get old font
cmp.w txFont(a1),d0 ; was font not changed?
beq.s @restoreFace ; br if so, skip reseting
move.w d0,-(sp)
_TextFont ; reset font
@restoreFace
move.w savedFace(a6),d0 ; get old face
cmp.w txFace(a1),d0 ; was face not changed?
beq.s @restoreSize ; br if so, skip reseting
move.w d0,-(sp)
_TextFace ; reset face
@restoreSize
move.w savedSize(a6),d0 ; get old size
cmp.w txSize(a1),d0 ; was size not changed?
beq.s @restoreDone ; br if so, skip reseting
move.w d0,-(sp)
_TextSize ; reset size
@restoreDone
rts
;---------------------------------------------------
;
; Plot one of the mini icons. d0 = sicn ID
; d1 = topleft for icon
; a3 = locked list record
; Trashes: a0,d1
PlotMini
lea sicnBitMap(a6),a0
move #2,BitMap.rowBytes(a0) ; QD Rowbytes for 16x16
clr.l BitMap.bounds.topLeft(a0) ; boundsrect 0,0,16,16
move.l #$00100010,BitMap.bounds.botRight(a0) ;
subq #4, sp ; space for handle
move.l #'SICN', -(sp) ; get a small icon
move d0, -(sp) ; pass SICN id
_GetResource
move.l (sp)+,d0
beq.s @exit ; br if not, exit
move.l d0,a0
move.l (a0),sicnBitMap+BitMap.baseAddr(a6) ; replace in bitmap
pea sicnBitMap(a6) ; pass local var as source bit map
move.l port(a3),a0 ; get its grafport
pea portBits(a0) ; pass window bitmap as dest bitmap
pea sicnBitMap+BitMap.bounds(a6) ; use bounds as src rect
lea Scratch20,a0 ; use Scratch20 as dst rect
move.l a0,-(sp) ; save the address
move.l d1,(a0)+ ; point to topleft
move.l d1,(a0) ; copy topLeft to botRight
add.w #16,(a0)+ ; bottom = top+size
add.w #16,(a0) ; right = left+size
move #srcCopy,-(sp) ; copy mode
clr.l -(sp) ; NIL MaskRgn
_CopyBits ; finally
@exit
rts
ENDWITH
END