home *** CD-ROM | disk | FTP | other *** search
- ;EASE$$$ READ ONLY COPY of file ╥rdocproc.a╙
- ; 1.0 CCH 11/16/1988 Added to EASE.
- ; END EASE MODIFICATION HISTORY
- ;
- ;File RDocProc.A
- ;-------------------------------------------------------
- ;
- ; Rounded Corner Window Definition Routine "RDocProc"
- ;
- ; written by Andy Hertzfeld Aug 4, 1982
- ;
- ; (c) 1982-1986 by Apple Computer, Inc. All rights reserved.
- ;
- ; This file contains the window definition procedure
- ; "RDocProc", a standard Mac window type similar to the
- ; "DocumentProc" included in the ROM. It is indentical if
- ; the refCon is zero, otherwise the roundness of the corners
- ; is specified using the high 2 bytes of the window
- ; refCon. It is intended to be linked with applications or
- ; desk ornaments.
- ;
- ; Modification History:
- ;
- ; 16-OCt-82 AJH Converted to QuickDraw Trap Interface
- ; 15-Nov-82 AJH Added GoAway button, made content rectangular
- ; 02-Jan-83 AJH Made it a "WDEF" resource
- ; 07-Mar-83 AJH Made it dispose the title region (bug fix)
- ; 17-Mar-83 AJH Fixed D4 trash bug
- ; 27-Apr-83 AJH only plot, hit-test goAway if window is active
- ; 20-Aug-83 AJH made it get roundness from selector instead of refCon
- ; 18-Oct-83 AJH made it ignore unwanted messages; new hiliting
- ; 11-Jan-85 JTC convert to MDS
- ; 31-Jan-85 EHB made hit-testing of GoAway box accurate
- ; 14-Feb-85 JTC named rsrc.
- ; 29-Jul-85 EHB converted back to porkshop
- ;v4 7-Aug-85 EHB did variable system font height version
- ; 23 Jul 86 DLD Converted source to MPW.
- ; 22 Aug 86 DLD Recoded draw goaway before DoHilite to fix Mac Plus system.
- ;
- ;----Reno World!----------------------------------------
- ;
- ; <C59/30Jun86> DAF added color support for nuMac
- ; <C60/22Aug86> DLD Recoded draw goaway before DoHilite to fix Mac Plus system.
- ; <Cxxx/06Oct86> DAF updated color support to use RGB calls on Beck's. Fixed
- ; goaway mask to center mask for everyone.
- ; <C407/13Oct86> DAF changed textmode from srcBIC to srcCopy
- ; <C424/18Nov86> DAF Added portToMap to correct problems in cWindows.
- ; <C491/08Dec86> DAF Locked title string before drawing it (OLD BUG!)
- ; <C700/26Jan87> DAF Universal defproc (version 10)
- ;
-
- BLANKS ON
- STRING ASIS
-
- PRINT OFF
- LOAD 'inc.sum.d'
- LOAD 'nEqu.d'
- INCLUDE 'colorequ.a'
- PRINT ON
-
- WDEF1 FUNC EXPORT
-
-
- ; Stack Frame Definitions
-
- WindowID EQU 14 ;
- message EQU 12 ;
-
- WFrameSize EQU -30 ;
- IsColor EQU -30 ; do we have colorQD and toolbox? [boolean]
- Align EQU -29 ; a dead byte for IsColor
- SavFgCol EQU -28
- SavBkCol EQU -22
- WCTabHndl EQU -16 ;
- WCTabPtr EQU -12 ;
- WInfoRec EQU -8 ; <7Aug85>
- WAscent EQU -8 ; <7Aug85>
- WDescent EQU -6 ; <7Aug85>
- WHeight EQU -4 ; <7Aug85>
- WBoxDelta EQU -2 ; <7Aug85>
-
- ;
- ; FUNCTION RDocProc( selector: INTEGER
- ; window: WindowPtr,
- ; message: INTEGER;
- ; parameter: LongInt): LongInt
- ;
- BRA.S @0
-
- ; standard header
-
- DC.W 0 ; flags word
- DC.B 'WDEF' ; type
- DC.W 1 ; ID
- DC.W 10 ; version
-
- @0
- LINK A6,#WFrameSize ; set up a stack frame to address parameters
- MOVEM.L D3-D5/A3-A4,-(SP) ; save work registers
-
- ; test if the message is in range
-
- CMP.W #wCalcRgnMsg,message(A6) ; compare to highest value (this is highest for rdocs)<C700/26Jan87> DAF
- BGT OORange ; skip it, it's too high <C700/26Jan87> DAF
- CMP.W #wDrawMsg,message(A6) ; compare to lowest value, too <C700/26Jan87> DAF
- BMI OORange ; <C700/26Jan87> DAF
-
- MOVE.L grafGlobals(A5),A0 ; get pointer to quickDraw globals <7Aug85>
- MOVE.L thePort(A0),-(SP) ; save current port on stack <7Aug85>
-
- ; Determine type of system. We need to know if we have color QuickDraw and a color
- ; window manager port.
-
- CMP.W #$3FFF,ROM85 ; do we have color QD?
- SLS IsColor(A6) ; set boolean depending on color or B&W system
- BHI.S @BWSys ; no, this system has B&W QD
-
- ; when using the wmgrCPort, it is the defproc's responsibility to reconcile
- ; the wmgrPort and the wmgrCPort.
-
- BSR UpdateCPort ; compare and update wmgrPorts, also set WMgrCPort
-
- ; save off the current port fore- & backcolors on color systems.
-
- PEA SavFgCol(A6) ; push a pointer to save area
- _GetForeColor ; get the current color
- PEA SavBkCol(A6) ;
- _GetBackColor ;
-
- ; also, find the auxWinRec and lock it down
-
- CLR.L -(SP) ; here's a space for the var handle
- CLR.W -(SP) ; function return here
- MOVE.L 14(A6),-(SP) ; push window ptr
- PEA 6(SP) ; a pointer to the space above
- _GetAuxWin ; find the auxrec
- ADDQ #2,SP ; pitch the boolean (it doesn't matter)
- MOVE.L (SP)+,A0 ; get the auxRecHandle
- MOVE.L (A0),A0 ; handle -> ptr
- MOVE.L winCTable(A0),A0 ; get the colortable handle
- MOVE.L A0,WCTabHndl(A6) ; save this handle
- _HLock ; lock the table down in memory
- MOVE.L (A0),WCTabPtr(A6) ; and get a pointer too!
- BRA.S @CommonSys ;
-
- @BWSys ; END OF A COLOR-ONLY SECTION
- MOVE.L WMgrPort,-(SP) ; and set port to window manager port
- _SetPort ;
- @CommonSys
-
- ; rdocprocs have asymmetric titles that are 19 high. Figure it so that fonts smaller
- ; or equal to chicago get mapped to 19, and all others are made odd for good centering.
-
- LEA WInfoRec(A6),A3 ; point to our info rec <7Aug85>
- @1 MOVE.L A3,-(SP) ; push a pointer <7Aug85>
- _GetFontInfo ; and get the font's info <7Aug85>
- MOVE.W (A3)+,D0 ; get ascent+2 <5Aug85>
- ADD.W (A3)+,D0 ; add descent <5Aug85>
- ADDQ.W #4,D0 ; get the height <5Aug85>
- BSET #0,D0 ; make height odd for symmetry <7Aug85>
- MOVEQ #19,D1 ; get 19 <26Aug85>
- CMP.W D1,D0 ; force height to 19 min <26Aug85>
- BGE.S @3 ; => not a tiny font <5Aug85>
- SUB.W D0,D1 ; how much less than 19 is it? <26Aug85>
- LSR.W #1,D1 ; used for centering tiny fonts <26Aug85>
- ADD.W D1,WAscent(A6) ; make the ascent "bigger" <26Aug85>
- MOVEQ #19,D0 ; <7Aug85>
- @3 MOVE.W D0,(A3)+ ; WHeight = ascent+descent+4 <7Aug85>
- SUB.W #13,D0 ; subtract height of box <7Aug85>
- LSR.W #1,D0 ; divide by 2 <7Aug85>
- MOVE.W D0,(A3) ; save delta to goAway box <7Aug85>
-
- ; fetch the parameters into registers
-
- LEA 8(A6),A0 ; get ptr to first parameter
- MOVE.L (A0)+,D3 ; get param in D3
- MOVE.W (A0)+,D0 ; get message
- MOVE.L (A0)+,A3 ; get the window pointer
- MOVE.W (A0)+,D5 ; get the selector
- LSR #1,D5 ; only use 8 alternatives
- ASL #2,D5 ; quadruple for long index
- CLR.L (A0) ; clear out function result
- ;
- ; case out on the message number
- ;
- CMP #3,D0 ; is it one we deal with?
- BGE.S @4 ; if not, skip
-
- ASL #2,D0 ; quadruple for long index
- JSR GODOCPROC(D0) ; dispatch to appropriate routine
- ;
- ; we're done -- restore port and registers and return to caller
- ;
-
- @4
- TST.B IsColor(A6) ; are we on a color system?
- BEQ.S @NoColor2 ; if on B&W, then skip
-
- PEA SavFgCol(A6) ;
- _RGBForeColor ;
- PEA SavBkCol(A6) ;
- _RGBBackColor ;
- MOVE.L WCTabHndl(A6),A0 ; unlock the colortable
- _HUnlock ;
- @NoColor2 ; END OF A COLOR-ONLY SECTION
-
- _SetPort ; restore the port <7Aug85>
- OORange ; 'Out Of Range, of course' <C700/26Jan87> DAF
- MOVEM.L (SP)+,D3-D5/A3-A4 ; restore work registers
- UNLK A6 ; unlink stack frame
- MOVE.L (SP)+,A0
- ADD #12,SP ; strip parameters
- JMP (A0) ; return to caller
- ;
- ; DocumentProc dispatch table -- entries must be long branches!
- ;
- GODOCPROC
- BRA DRAWDOC ; draw is message 0
- BRA HITDOC ; hit test is message 1
- BRA CALCDOC ; calc test is message 2
-
- DoneDoc RTS ; nor does it need dispose call
-
-
- ; utility UpdateCPort
- ; This utility compares the pertinent fields of the wmgrPort and the wmgrCPort,
- ; updating the wmgrCPort as necessary to match the wmgrPort.
-
- UpdateCPort ; <C700/26Jan87> DAF
- MOVE.L WmgrCPort,-(SP) ; make the wmgrCPort the current port
- _SetPort ; set it
-
- MOVE.L WmgrPort,A0 ; get the wmgrPort addr
- MOVE.L WmgrCPort,A1 ; and the wmgrCPort too
-
- PEA bkPat(A0) ; push pointers to pattern for later
- PEA pnPat(A0) ;
-
- ; copy all fields from pnLoc to end of grafPort, excluding pnPixPat and fillPixPat
-
- LEA pnLoc(A0),A0 ; point at source
- LEA pnLoc(A1),A1 ; point at dest
- MOVE.L (A0)+,(A1)+ ; copy pnLoc
- MOVE.L (A0)+,(A1)+ ; copy pnSize
- MOVE.W (A0)+,(A1)+ ; copy pnMode
- ADDQ #8,A0 ; skip pnPat (aka, pnPixPat,fillPixPat)
- ADDQ #8,A1 ;
- MOVE.W #((portRec-pnVis)/2)-1,D0 ; set up a counter (long sized)
- @1
- MOVE.W (A0)+,(A1)+ ; copy it
- DBRA D0,@1 ; loop
-
- ; now set up the patterns in the wmgrCPort (which is thePort)
- ; the parameters were pushed before the copying loop above
-
- _PenPat
- _BackPat
-
- RTS ; <C700/26Jan87> DAF
-
-
- ; SetUpColor takes a window part identifier in D0, finds the corresponding
- ; part in the AuxWinTable (the part code is in the .value field) and returns
- ; a pointer to its RGB on the stack. If the requested part is not found,
- ; the first color table element is used (I'd use frameColor, but that might
- ; not be there!). Trashes A0/D0.
-
- SetUpColor
- MOVE.L D1,-(SP) ; save a register
- MOVE.L WCTabPtr(A6),A0 ; get the color table pointer
- MOVE.W CTSize(A0),D1 ; get the color table size
- MULU #8,D1 ; convert to color table index
- LegalIndex
- CMP.W CTTable+value(A0,D1),D0 ; is this the one?
- BEQ.S FoundIt ; if equal, then done
- SUB.W #8,D1 ; try the previous one
- BGE.S LegalIndex ; loop while index positive
- MOVEQ #0,D1 ; OK, use the first one
- FoundIt
- LEA CTTable+rgb(A0,D1),A0 ; get the address of the color to use
- MOVE.L A0,D0 ; we'll need A0 in a second
- MOVE.L (SP)+,D1 ; restore the register
- MOVE.L (SP)+,A0 ; get the return address
- MOVE.L D0,-(SP) ; push the rgb addr on the stack
- JMP (A0) ; return to caller
-
-
- PORTTOMAP ; <C424/18Nov86> DAF
- ;----------------------------------------------------------
- ;
- ; Given a window pointer in A0, return the bitmap/pixmap pointer in A0
-
- ADDQ #PORTBITS,A0 ;POINT TO BITMAP/PIXMAP HANDLE
- TST ROWBYTES(A0) ;BITMAP OR PIXMAP HANDLE?
- BPL.S GOTBITMAP ;=>JUST A BITMAP
- MOVE.L BASEADDR(A0),A0 ;ELSE GET PORT'S PIXMAP HANDLE
- MOVE.L (A0),A0 ;GET PIXMAP POINTER
- GOTBITMAP RTS
-
- ;
- ; DrawDoc -- draw the document window. The windowPtr is in A3
- ;
- DrawDoc
- TST.B WVISIBLE(A3) ; is it visible?
- BEQ.S DoneDoc ; if not, don't do anything
- ;
- ; see if its a EORGoAway call and special case it
- ;
- CMP #wInGoAway,D3 ; is it a goAway call?
- BEQ EorGoAway ; if so, go handle it
-
- ;
- ; derive the titleBar rectangle from the structRgn and keep it in TempRect
- ;
- LEA TEMPRECT,A0 ; get pointer to tempRect
- MOVE.L STRUCTRGN(A3),A1 ; get structure region handle
- MOVE.L (A1),A1 ; get strucRgn pointer
- ADDQ #RGNBBOX,A1 ; point A1 at the bounding box
- MOVE.L (A1)+,(A0)+ ; copy bounding box into tempRect
- MOVE.L (A1),(A0)
- ;
- ; make bottom := top + height
- ;
- MOVE -4(A0),D0 ; get top
- ADD.W WHeight(A6),D0 ; compute top + height <EHB 7Aug85>
- MOVE D0,(A0) ; update bottom
- ;
- ; handle the case of non-rectangular titleBar -- we must allocate a region
- ;
- CLR.L -(SP) ; make space for function result
- _NewRgn ; allocate a region
-
- MOVE.L (SP),A4 ; keep it in A4 -- and don't pop it off
- PEA TEMPRECT ; tempRect defines the bounding rect
- BSR GetRadPoint ; get the radius point in D0
- MOVE.L D0,-(SP) ; push the radius factor
- ST -(SP) ; topRound is true
- CLR -(SP) ; botRound is false
- BSR MakeRoundRegion ; make the region
-
- ; set the frame color first
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor3 ; no, so skip this
-
- MOVE.W #wframeColor,D0 ; get element index
- BSR.S SetUpColor ; get it on the stack
- _RGBForeColor ; and set it
-
- ; and do a PenNormal so that pattern and mode are OK (mostly for PaintRgn coming up) <C254/22Oct86> DAF
-
- _PenNormal ; <C254/22Oct86> DAF
-
- @NoColor3 ; END OF A COLOR-ONLY SECTION
-
- ; draw the titlebar outline
-
- MOVE.L A4,-(SP) ; push the region
- _FrameRgn ; frame it
-
- ; determine the highlight state and set colors accordingly <26Apr86>
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor4 ; no, so skip this
-
- TST.B WHILITED(A3) ; is it hilited?
- BNE.S @8 ; ¡ is highlighted, = is not highlighted
- MOVEQ #wTitleBarColor,D0 ; not hilited, so paint the titlebar in this color
- BSR.S SetUpColor ;
- _RGBForeColor
- MOVEQ #wFrameColor,D0 ; in this state, text is in frame color
- BSR.S SetUpColor ;
- BRA.S @9
- @8 MOVEQ #wTitleBarColor,D0 ; hilited, so paint the text in this color
- BSR.S SetUpColor ; (foreColor is already frameColor!)
- @9 _RGBBackColor
-
- @NoColor4 ; END OF A COLOR-ONLY SECTION
-
- ; now, go on and draw the rest of the titlebar
-
- MOVE.L A4,-(SP) ; push it again
- MOVE.L OneOne,-(SP) ; inset by 1
- _InsetRgn ; inset it
- MOVE.L A4,-(SP) ; push for erase (now paint)
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor5 ; no, so erase
- _PaintRgn ; paint it
- BRA.S @Common5 ; and continue
- @NoColor5 _EraseRgn ; erase it
- @Common5
-
- ;
- ; hilite the title bar by filling it with specified pattern
- ;
- DrawTheTitle
- BSR DoTitleString ; draw the centered Title
- ;
- ; plot the goAway button, if necessary
- ;
- TST.B WHilited(A3) ; if hilited window <08/22/86 DLD>
- BEQ.S DisposIt ; if not, don't plot goAway <08/22/86 DLD>
-
- TST.B WGoAway(A3) ; is there a goaway button? <08/22/86 DLD>
- BEQ.S DoHilite ; if not, skip <08/22/86 DLD>
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor6 ;
- MOVEQ #notSrcCopy,D1 ; plot in notsrcCopy mode <08/22/86 DLD>
- BRA.S @Common6 ; continue
- @NoColor6 MOVEQ #srcCopy,D1 ; default to srcCopy mode <08/22/86 DLD>
- @Common6 ; since we will invert <08/22/86 DLD>
- LEA GoAwaySymbol,A1 ; get the goAway symbol <08/22/86 DLD>
- BSR.S PlotGoAway ; draw goAway <08/22/86 DLD>
-
- DoHilite
- TST.B IsColor(A6) ; is it B&W?
- BNE.S @BW1 ;
-
- SUBQ #1,TempRect+Bottom ; adjust bottom
- PEA TEMPRECT ; push the title rect
- _InverRect
- @BW1 ; END OF A B&W-ONLY SECTION
-
- DisposIt
- MOVE.L A4,-(SP) ; push the region handle
- _DisposRgn ; deallocate it
- ;
- ; frame the body of the window
- ;
- DrawFrame
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor8 ;
-
- MOVEQ #wFrameColor,D0 ; get the framecolor in Fore
- BSR SetUpColor ;
- _RGBForeColor
- @NoColor8 ; END OF A COLOR-ONLY SECTION
- MOVE.L STRUCTRGN(A3),-(SP) ; push the structure
- _FrameRgn ; frame the body
- RTS
-
- ;
- ; BuildTBarRect builds a rectangle enclosing the titleBar in TempRect
- ;
- BuildTBarRect
- LEA TEMPRECT,A0 ; get pointer to tempRect
- MOVE.L STRUCTRGN(A3),A1 ; get structure region handle
- MOVE.L (A1),A1 ; get strucRgn pointer
- ADDQ #RGNBBOX,A1 ; point A1 at the bounding box
- MOVE.L (A1)+,(A0) ; copy bounding box into tempRect
- MOVE.L (A1),4(A0)
- ;
- ; make bottom := top + height
- ;
- MOVE Top(A0),D0 ; get top
- ADD.W WHeight(A6),D0 ; add in height <EHB 7Aug85>
- MOVE D0,Bottom(A0) ; update bottom
- SUBQ #1,Right(A0) ; inset right
- RTS ; return to caller
- ;
- ; EORGoAway hilites/unhilites the goAway button. It falls through into PlotGoAway
- ;
- EorGoAway
- BSR.S BuildTBarRect ; build the bounding rect
- LEA GoAwaySymbol,A1 ; get the bitMap
- ADD.W #32,A1 ; bump to the EOR Mask
- MOVEQ #SrcXOR,D1 ; set EOR as the plot mode
- ;
- ; PlotGoAway plots the goAway button. A1 holds the symbol, D1 the plotting mode
- ;
- PlotGoAway
- LEA TempRect,A0 ; point to temprect <7Aug85>
- MOVE.W WBoxDelta(A6),D0 ; get offset from top to GABox <7Aug85>
- ADD.W D0,(A0) ; add offset to top <7Aug85>
- SUBQ.W #1,(A0) ; align bitmap <7Aug85>
- ADDQ.W #8,2(A0) ; add margin to left <7Aug85>
- MOVE.L (A0)+,(A0) ; bottom/right = top/left <7Aug85>
- MOVEQ #16,D0 ; get a constant <7Aug85>
- ADD.W D0,(A0)+ ; Bottom = top + 16 <7Aug85>
- ADD.W D0,(A0) ; Right = Left + 16 <7Aug85>
-
- MOVE D1,D0 ; set plotting mode
- MOVE.L #$00100010,D1
- BSR.S PlotSymbol ; plot it in tempRect
- BSR.S BuildTBarRect ; rebuild tempRect
- RTS
-
- ;
- ; PlotSymbol -- plot the little 16 by 16 symbol bitmap pointed to by A1 into the rectangle
- ; pointed held in TempRect. D0 holds the mode.
- ;
- PlotSymbol
- LEA IconBitMap,A0 ; get pointer to source bitmap
- MOVE.L A1,(A0) ; update base address of bitMap
- MOVE #2,4(A0) ; update rowBytes
- MOVE.L #$00100010,10(A0) ; adjust boundsRect
- ;
- ; push parameters for CopyBits call to transfer arrow bitMap
- ;
- MOVE.L A0,-(SP) ; push pointer source bitmap
- MOVE.L GrafGlobals(A5),A1 ; get lisaGraf global baseaddress
- MOVE.L THEPORT(A1),A1 ; get thePort
- PEA PORTBITS(A1) ; that's the destination bitmap
- ;
- PEA BOUNDS(A0) ; boundsRect of bitmap is source
- PEA TempRect ; tempRect is the destination
- MOVE.W D0,-(SP) ; theMode is in D0
- CLR.L -(SP) ; no mask region
- ;
- ; transfer the bitMap (stretching as necessary...)
- ;
- _CopyBits ; let Bill stretch those bits
- RTS ; return to caller
- ;
- ; DoTitleString is the common code that draws the title centered in tempRect
- ;
- DoTitleString ; on entry, temprect is title rect inset by one
-
- BSR BuildTBarRect ; calculate title bar rect
-
- ; compute indent factor based on GoAwayButton state
-
- @1 MOVE.W TempRect+Right,D3 ; get right
- SUB.W TempRect+Left,D3 ; compute width
-
- SUB.W WTITLEWIDTH(A3),D3 ; compute extra x
- ASR.W #1,D3 ; divide by 2
- ;
- ; if there's a goAway button, make sure the margin is at least 28 pixels
- ;
- TST.B WGoAway(A3) ; is there a go away button
- BEQ.S @2 ; skip if there's not
-
- TST D3 ; is it negative?
- BMI.S @3 ; if so, pin at 28
- CMP.W #28,D3 ; if goAway button, must have some margin
- BGT.S @2
- @3 MOVEQ #28,D3
-
- @2 ADD TempRect+Left,D3 ; compute x position
- MOVE.W D3,-(SP) ; and push for MoveTo
-
- MOVE.W TempRect+Top,D0 ; get top <7Aug85>
- ADD.W WAscent(A6),D0 ; move down to baseline <7Aug85>
- ADDQ.W #2,D0 ; add a little white space <7Aug85>
- MOVE.W D0,-(SP) ; push baseline <7Aug85>
- _MoveTo
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor9 ; no, so skip
-
- MOVE.W txMode(A3),-(SP) ; save the xfer mode
- MOVE.W #notsrcCopy,-(SP) ; set the text mode <C407/13Nov86> DAF
- _TextMode
- @NoColor9 ; END OF A COLOR-ONLY SECTION
-
- ; draw the string
-
- MOVE.L WTITLEHANDLE(A3),A0 ; get titleHandle
- _HLock ; lock that puppy <C491/08Dec86> DAF
- MOVE.L (A0),-(SP) ; push title pointer
- _DrawString ; draw it
- MOVE.L WTITLEHANDLE(A3),A0 ; get titleHandle again <C491/08Dec86> DAF
- _HUnlock ; unlock it <C491/08Dec86> DAF
-
- TST.B IsColor(A6) ; is it color?
- BEQ.S @NoColor10 ; no, so skip
- _TextMode ; and restore textMode <26Apr86>
- @NoColor10 ; END OF A COLOR-ONLY SECTION
-
- DoneDString
- RTS ; all done drawing title...
-
- ;
- ; GetRadPoint returns the radius in D0 of the round rect parameter defined
- ; by the selector parameter
- ;
- GetRadPoint
- MOVE.L RadiusTable(D5),D0
- RTS
-
- RadiusTable
- DC.L $00100010 ; (16,16)
- DC.L $00040004 ; (4,4)
- DC.L $00060006 ; (6,6)
- DC.L $00080008 ; (8,8)
- DC.L $000A000A ; (10,10)
- DC.L $000C000C ; (12,12)
- DC.L $00140014 ; (20,20)
- DC.L $00180018 ; (24,24)
- ;
- ; MakeRoundRegion -- makes a round region given a bounding rectangle and a radius
- ; value. Also, half round regions (top round, bottom square) are supported
- ; by the topRound,botRound booleans
- ;
- ; MakeRoundRegion( theRgn:RegionHandle
- ; theRect: Rect
- ; xRad,yRad: INTEGER
- ; topRound,botRound: BOOLEAN)
- ;
- MakeRoundRegion ; ???? was ...Rgn
- LINK A6,#0 ; set up stack frame
- MOVE.L A3,-(SP) ; save work registers
- TST.L 8(A6) ; are flags both false?
- BEQ.S PlainRect ; if so, its just a rectangle
- TST.L 12(A6) ; is radius factor 0?
- BNE.S ComplexRect ; if not, its a round one
- ;
- ; optimize for the rectangular case
- ;
- PlainRect
- MOVE.L 20(A6),-(SP) ; push region handle
- MOVE.L 16(A6),-(SP) ; push rectangle pointer
- _RectRgn ; make a rectangular region
- BRA.S MMRDone ; all done!
- ;
- ; make a region with top and bottom corners rounded
- ;
- ComplexRect
- _HidePen ; hide the pen
- _OpenRgn ; start recording the region
- ;
- MOVE.L 16(A6),-(SP) ; push the rectangle pointer
- MOVE.L 12(A6),-(SP) ; push the radius point
- _FrameRoundRect ; define the region
- MOVE.L 20(A6),-(SP) ; push region handle
- _CloseRgn ; assign roundRect region
- ;
- _ShowPen ; enable drawing again
- ;
- ; now square up either the top or bottom of the region (or neither)
- ;
- MOVE.L 16(A6),A0 ; get rectangle pointer
- TST.W 8(A6) ; examine 'botRound' flag
- BNE.S CheckTRound ; if true, see if top needs squaring
- MOVE BOTTOM(A0),D1 ; get bottom y coordinate
- MOVE D1,D0
- SUBQ #8,D0 ; compute top
- BRA.S SquareIt
- ;
- CheckTRound
- TST.W 10(A6) ; examine 'topRound' flag
- BNE.S MMRDone ; if that true, we're done
- MOVE Top(A0),D0 ; get top y coordinate
- MOVE D0,D1
- ADDQ #8,D1 ; get bottom
- ;
- ; here we build a rect in ToolScratch that has the same X as tempRect, but centered
- ; around the top or bottom
- ;
- SquareIt
- LEA ToolScratch,A1 ; get pointer to dest Rect
- MOVE D0,(A1)+ ; update top
- MOVE Left(A0),(A1)+ ; copy left
- MOVE D1,(A1)+ ; update bottom
- MOVE Right(A0),(A1) ; copy right
- ;
- ; now make a region out of that rectangle
- ;
- CLR.L -(SP) ; make space for result
- _NewRgn ; allocate a new region
- MOVE.L (SP),A3 ; keep a copy in A3
- PEA ToolScratch ; push the rectangle pointer
- _RectRgn ; make the rectangular region
- ;
- ; now union with the parameter region to square up the edges
- ;
- MOVE.L 20(A6),-(SP) ; push destination region
- MOVE.L A3,-(SP) ; push square region
- MOVE.L 20(A6),-(SP) ; dest gets the result
- _UnionRgn
- ;
- ; all done -- deallocate the temporary region
- ;
- MOVE.L A3,-(SP)
- _DisposRgn
- ;
- MMRDone
- MOVE.L (SP)+,A3 ; restore work reg
- UNLK A6 ; unlink stack frame
- MOVE.L (SP)+,A0 ; get return address
- ADD #16,SP ; strip parameters
- JMP (A0) ; all done!
-
- ; HitDoc -- perform a hit test on the document. On entry, D3 contains the mousePoint
- ; in global coordinates while A3 holds the window pointer
- ;
- HitDoc
- MOVEQ #16,D4 ; keep 16 in a register to save code
- CLR.W -(SP) ; make room for function result
- MOVE.L D3,-(SP) ; push the mouse point
- MOVE.L CONTRGN(A3),-(SP) ; push content region handle
- _PtInRgn ; is the point in the content region?
- TST.B (SP)+ ; well, is it?
- BEQ.S NotInContent ; if not, go check out drag region
-
- ; the point is in the content region so return a '1'
-
- justContent
- MOVEQ #wInContent,D0 ; return in content
- BRA.S DoneHitDoc ; go store function result and return
-
- ; its not in the content -- see if its in the dragRgn (content extended by titleBar)
-
- NotInContent
-
- CLR.W -(SP)
- MOVE.L D3,-(SP)
- MOVE.L StructRgn(A3),-(SP)
- _PtInRgn
- TST.B (SP)+
- BEQ.S DoneHit1
-
- CLR.W -(SP) ; make room for function result
- MOVE.L D3,-(SP) ; push the mouse point
- MOVE.L ContRgn(A3),A4 ; get content region handle
- MOVE.L (A4),A4 ; get region ptr
- ADDQ #RgnBBox,A4 ; get bounding box ptr
- MOVE.W WHeight(A6),D0 ; get height of title bar <7Aug85>
- SUB.W D0,Top(A4) ; decrease by height of title bar <7Aug85>
- MOVE.L A4,-(SP) ; push the rect
- _PtInRect ; is the point in the title bar?
- MOVE.W WHeight(A6),D0 ; get height of title bar <7Aug85>
- ADD.W D0,Top(A4) ; and fix the bounding box up <7Aug85>
-
- TST.B (SP)+ ; examine result
- BEQ.S DoneHit1 ; if not, return 0 (do nothing)
-
- ; see if its in leftmost 16 of drag, which is the goAway button
-
- TST.B WGoAway(A3) ; is there a goAway button?
- BEQ.S ItsInDrag ; if not, skip
- TST.B WHilited(A3) ; only draw it for the active one
- BEQ.S ItsInDrag
-
- MOVE D3,D0 ; get mousePt
- MOVE.L A3,A0 ; copy the windowPtr for PortToMap <C424/18Nov86> DAF
- BSR PortToMap ; convert it <C424/18Nov86> DAF
- ADD Bounds+Left(A0),D0 ; convert to local <C424/18Nov86> DAF
- SUB PortRect+Left(A3),D0 ; compensate for origin
- CMP #18,D0 ; is it too far right?
- BGT.S ItsInDrag ; if so, its in drag
- SUBQ #8,D0 ; it must be at least 8
- BMI.S ItsInDrag
-
- MOVE.L D3,D0 ;; now check vertical
- SWAP D0 ;; which is high word of D3
- ADD.W Bounds+Top(A0),D0 ;; convert to local (A0 is still valid) <C424/18Nov86> DAF
- SUB.W PortRect+Top(A3),D0 ;; compensate for origin
-
- ; D0 is aligned with 0 as the bottom of the title bar.
-
- ADD.W WBoxDelta(A6),D0 ; below box? <7Aug85>
- BPL.S ItsInDrag ; => yes <7Aug85>
- ADD.W #11,D0 ; in box? <7Aug85>
- BMI.S ItsInDrag ; => no <7Aug85>
-
- ; its in the goAway button so signal it
-
- MOVEQ #wInGoAway,D0
- BRA.S DoneHitDoc
-
- ItsInDrag
- MOVEQ #wInDrag,D0 ; flag in drag region
- DoneHitDoc
- MOVE.L D0,20(A6) ; update function result
- DoneHit1 RTS
-
-
- ; CalcDoc -- calculate the structure and content regions for the window pointed
- ; to by A3.
-
- CalcDoc
- LEA TEMPRECT,A0 ; get a pointer to the work rectangle
- MOVE.L A0,-(SP) ; push for later offset
- MOVE.L PORTRECT(A3),(A0)+ ; copy topLeft of portRect
- MOVE.L PORTRECT+4(A3),(A0) ; copy botLeft of portRect
-
- ; offset it to global coordinates
-
- MOVE.L A3,A0 ; copy window pointer <C424/18Nov86> DAF
- BSR PortToMap ; convert pointer, if necessary <C424/18Nov86> DAF
- MOVE.L BOUNDS(A0),-(SP) ; push topLeft of port.portBits.bounds <C424/18Nov86> DAF
- NEG 2(SP) ; negate offset
- NEG (SP)
- _OffsetRect ; offset tempRect to global coordinates
-
- ; make the content region square for fast updating
-
- MOVE.L CONTRGN(A3),A0 ; A0 holds the content region
- CLR D1 ; topround is false
- BSR.S GOMAKERGN ; go make the region into content region
-
- ; now do the structure region. First correct the bounding rectangle (tempRect) for
- ; structure instead of content
-
- PEA TEMPRECT ; push a pointer to the rect
- MOVE.L MinusOne,-(SP) ; make 1 pixel bigger, all around
- _InsetRect ; make it bigger
-
- MOVE.W WHeight(A6),D0 ; move up to top of window <7Aug85>
- SUBQ.W #1,D0 ; tweak it <7Aug85>
- SUB.W D0,TempRect+Top ; and set top of struct region <7Aug85>
-
- MOVEQ #1,D1 ; topRound is true
- MOVE.L STRUCTRGN(A3),A0 ; A0 holds the structRgn pointer
-
- GoMakeRgn
- MOVE.L A0,-(SP) ; push the region handle
- PEA TEMPRECT ; push bounding rectangle pointer
- BSR GETRADPOINT ; get the radius factor
- MOVE.L D0,-(SP) ; push it
- MOVE.W D1,-(SP) ; topRound is in D1
- ST -(SP) ; so is botRound
- BSR MakeRoundRegion ; go make the region
-
- ; all done with CalcDocRgns
-
- RTS
-
- ;
- ; BitMap for default GoAway button
-
- GoAwaySymbol
- DC.W $0000,$0000,$7FF0,$4010
- DC.W $4010,$4010,$4010,$4010
- DC.W $4010,$4010,$4010,$4010
- DC.W $7FF0,$0000,$0000,$0000
-
- ; brand-new, centered mask <Cxxx/06Oct86> DAF
-
- DC.W $0000,$0000,$7FF0,$4210
- DC.W $5250,$4A90,$4010,$5DD0
- DC.W $4010,$4A90,$5250,$4210
- DC.W $7FF0,$0000,$0000,$0000
-
- END
- ;
-
-