antoine-source/appleworksgs/SS/Src/Draw.aii
2023-03-04 03:45:20 +01:00

1 line
23 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'SS.equ'
INCLUDE 'Driver.equ'
INCLUDE 'Heap.aii.i'
INCLUDE 'Eval.aii.i'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_FastMult
IMPORT D_Set4Pat
IMPORT D_DrawText
IMPORT D_DrawString
IMPORT X_FormatValue
IMPORT S_Cell2Str
IMPORT S_CellWidth
IMPORT S_ClipHandle
IMPORT S_ColLab2Text
IMPORT S_ColLabRect
IMPORT S_CurBRSelect
IMPORT S_CurBRTitle
IMPORT S_CurContHt
IMPORT S_CurContWd
IMPORT S_CurContXpt
IMPORT S_CurContYpt
IMPORT S_CurEditFlag
IMPORT S_CurPrinting
IMPORT S_CurTLCell
IMPORT S_CurTLSelect
IMPORT S_CurTLTitle
IMPORT S_DashMask
IMPORT S_GetCellPtr
IMPORT S_NormalMask
IMPORT S_RowLabRect
IMPORT S_WhereCell
IMPORT S_WhichCell
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY S_BackPat
ENTRY S_DrawRegion
ENTRY S_FindLeftContent
ENTRY S_FindRightContent
;----------------------------------------------------------------------------
; S_DrawBorders (OffRight:w,OffBottom:w,Xpt:w,Ypt:w)
;
S_DrawBorders PROC EXPORT
input OffRight:w,OffBottom:w,Xpt:w,Ypt:w
local Rect:r
BEGIN
lda OffRight
beq chkBottom
Tool _SetPenPat,in=(#S_BackPat:l)
MoveWord #S_EditHeight+2,Rect
MoveWord Xpt,Rect+2
AddWord Ypt,#S_RowHeight,Rect+4
AddWord Xpt,#S_MaxCellWidth,Rect+6
Tool _PaintRect,in=(!Rect:l)
Tool _SetPenPat,in=(#S_NormalPat:l)
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+2:w)
Tool _LineTo,in=(Xpt:w,Ypt:w)
inc Xpt
inc Xpt
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+2:w)
Tool _LineTo,in=(Xpt:w,Ypt:w)
chkBottom
lda OffBottom
beq Exit
Tool _SetPenPat,in=(#S_BackPat:l)
MoveWord Ypt,Rect
MoveWord #0,Rect+2
AddWord Ypt,#S_RowHeight,Rect+4
AddWord Xpt,#S_MaxCellWidth,Rect+6
Tool _PaintRect,in=(!Rect:l)
Tool _SetPenPat,in=(#S_NormalPat:l)
Tool _MoveTo,in=(#0:w,Ypt:w)
Tool _LineTo,in=(Xpt:w,Ypt:w)
inc Ypt
Tool _MoveTo,in=(#0:w,Ypt:w)
Tool _LineTo,in=(Xpt:w,Ypt:w)
Exit RETURN
EXPORT S_BackPat
S_BackPat
DC.W $F3F3,$3F3F,$F3F3,$3F3F
DC.W $F3F3,$3F3F,$F3F3,$3F3F
DC.W $F3F3,$3F3F,$F3F3,$3F3F
DC.W $F3F3,$3F3F,$F3F3,$3F3F
S_NormalPat
DC.W 0,0,0,0
DC.W 0,0,0,0
DC.W 0,0,0,0
DC.W 0,0,0,0
ENDP
;------------------------------------------------------------------------------
; S_DrawCell(Cell:l,Xpt:w,Ypt:w)
;
; This routine will draw the given cell's value at the given x,y
; coordinates, and bounded by the given width. It clips to appropriate
; rectangle.
S_DrawCell PROC EXPORT
;Using S_CurrentData
;Using D_GlobalData
input Cell:l,Xpt:w,Ypt:w
local CellPtr:l,StringPtr:l
local Format:l,Rect:r,ChkPtr:l
local Offset:w,ContCell:l,Color:w
local ClipRight:w,ClipLeft:w,Justify:w
error ErrorFlag
BEGIN
stz ErrorFlag
stz Offset
in Cell:l
out CellPtr:l
XCall S_GetCellPtr
ora CellPtr
jeq Quit
; Cell exists ;
MoveWord #1,ClipRight
sta ClipLeft
MoveLong Cell,ContCell
MoveLong [CellPtr]:#S_CellFormat,Format
lda Format
and #S_CellType
cmp #S_CellTypeEmpty
jeq Quit
Tool _GetTextFace,out=(:w) ; leave on stack for 'Exit'
; Is it an overlap cell ;
lda Format
and #S_CellType
jmi doOverlap
lda Format
and #S_CellBold
beq textFaceSet
lda 1,s
ora #$01 ; set bold bit on
Tool _SetTextFace,in=(a:w)
textFaceSet
lda Format
and #S_CellTypeValue ; either constant or function
bne doNumber
; Cell is of type Text ;
lda S_CurEditFlag
and #S_ViewFormulaBit
beq doText
lda Format
and #S_CellTypeTextForm
bne doFormula
doText
lda Format+2
and #S_CellCircular
jne circularCell
jsr ClrLeft
jsr ClrRight
jsr SetText
jsr DrawString
brl Exit
doFormula
MoveWord #4,Offset
H_GetBlockPtr [CellPtr]:#S_CellContent,StringPtr
in Cell:l,StringPtr:l
out StringPtr:l
XCall E_ExpandFormula
jsr DrawString
brl Exit
doNumber
lda S_CurEditFlag
and #S_ViewFormulaBit
beq doValue
lda Format
and #S_CellTypeTextForm
bne doFormula
doValue
lda Format+2
and #S_CellCircular
beq notCirc2
circularCell
MoveWord #DarkRed,Color
MoveLong #CircStr,StringPtr
PushWord #40
bra drawNumber
notCirc2
SpaceWord ; string length
SpaceLong ; string ptr
SpaceWord ; color
Call S_CellWidth,in=(Cell+2:w),out=(:w)
PushLong Format
AddLong CellPtr,#S_CellValue,s
Call X_FormatValue ;in=(:w,:l,:l),out=(:w,:l,:w)
bcc OKvalue
lda 9,s
and #$FFFE ; turn any bold off.
Tool _SetTextFace,in=(a:w)
OKvalue
PullWord Color
PullLong StringPtr
drawNumber
lda Color
pha
xba
ora 1,s
sta 1,s
asl a
asl a
asl a
asl a
ora 1,s
sta 1,s
Tool _SetForeColor,in=(:w)
Call S_CellWidth,in=(Cell+2:w),out=(a:w)
SubWord a,s,Offset
jsr DrawString
Tool _SetForeColor,in=(#0:w)
brl Exit
doOverlap
cmp #S_CellTypeLeftPad
beq fromRight
in Cell:l
out ContCell:l,Offset:w
XCall S_FindLeftContent
stz ClipLeft
jsr ClrRight
bra overCont
fromRight
in Cell:l
out ContCell:l,Offset:w
XCall S_FindRightContent
stz ClipRight
jsr ClrLeft
overCont
in ContCell:l
out CellPtr:l
XCall S_GetCellPtr
MoveLong [CellPtr]:#S_CellFormat,Format
lda Format
and #S_CellBold
beq textFaceSet2
lda 1,s
ora #$01 ; set bold bit on
Tool _SetTextFace,in=(a:w)
textFaceSet2
jsr SetText
jsr DrawString
Exit
jsr DrawUnder
Tool _SetTextFace,in=(:w)
Quit
RETURN
;----------------------
CircStr
str 'Circ.'
;----------------------
SetText
H_GetBlockPtr [CellPtr]:#S_CellValue,StringPtr
lda Format
and #S_CellJustify
sta Justify
beq LeftJust
; Get String width for right and center justified text ;
Tool _StringWidth,in=(StringPtr:l),out=(:w)
; Calculate relative position to start text from front of cell ;
Call S_CellWidth,in=(ContCell+2:w),out=(a:w)
SubWord a,s,a
; If Right justified, this is all ;
ldx Justify
cpx #S_CellCenterJustify
bne justified
; If Center justified, there's more to do ;
CenterJust
tay
bmi setC
; If current value is positive, zero must be in top bit after
; divide.
clc
bra divide
; If current value is negative, one must be in top bit after
; divide.
setC
sec
divide
; Since we are centering around 1/2 of cell width, and the present
; value is (cell width - string width), dividing by 2 gives us
; (cell width)/2 - (string width)/2, which is what we want.
ror a
bra justified
LeftJust
lda #4
justified
AddWord a,Offset,Offset
rts
;----------------------
ClrRight
lda Cell+2
inc a
tax
cmp #$02BF
bge srDone
in x:w,Cell:w
out ChkPtr:l
XCall S_GetCellPtr
ora ChkPtr
beq srDone
MoveWord [ChkPtr]:#S_CellFormat,a
bpl srDone
and #S_CellType
cmp #S_CellTypeRightPad
bne srDone
clrClipR
stz ClipRight
srDone
rts
;----------------------
ClrLeft
lda Cell+2
inc a
tax
cmp #10000
blt slDone
in x:w,Cell:w
out ChkPtr:l
XCall S_GetCellPtr
ora ChkPtr
beq slDone
MoveWord [ChkPtr]:#S_CellFormat,a
bpl slDone
and #S_CellType
cmp #S_CellTypeLeftPad
bne slDone
clrClipL
stz ClipLeft
slDone
rts
;----------------------
DrawString
lda Ypt
inc a
sta Rect
AddWord a,#S_TextOffset,Rect+4
Moveword Xpt,Rect+2
pha
Call S_CellWidth,in=(Cell+2:w),out=(a:w)
AddWord a,s,a
inc a
inc a
sta Rect+6
lda ClipRight
beq chkClipLeft
dec Rect+6
dec Rect+6
chkClipLeft
lda ClipLeft
beq contDraw
inc Rect+2
inc Rect+2
contDraw
Tool _ClipRect,in=(!Rect:l)
Tool _GetClipHandle,out=(:l)
PushLong S_ClipHandle
PushLong 5:s
Tool _SectRgn,in=(:l,:l,:l)
; LaserWriter hack-around --- GS/OS laserwriter driver doesn't do
; EraseRect correctly.
; Tool _EraseRect,in=(!Rect:l)
Call D_Set4Pat,in=(#White:w)
Tool _PaintRect,in=(!Rect:l)
Call D_Set4Pat,in=(#Black:w)
AddWord Xpt,Offset,s
lda Rect+4
dec a
pha
Tool _MoveTo,in=(:w,:w)
call D_DrawString,in=(StringPtr:l)
rts
;----------------------
DrawUnder
lda Format
and #S_CellULine
beq DidUnder
Tool _SetClip,in=(S_ClipHandle:l)
; AddWord Xpt,#2,s
PushWord Xpt ; this hangs off both ends
AddWord Ypt,#S_RowHeight,s
_MoveTo
Call S_CellWidth,in=(Cell+2:w),out=(:w)
; SubWord 1:s,#2,1:s ; pen is 2 pixels wide
Tool _Line,in=(:w,#0:w)
DidUnder
rts
ENDP
;-----------------------------------------------------------------------------
; S_DrawColLabels(Xpt:w,FCol:w,LCol:w)
;
; This routine draws the column labels in the given range starting at the
; given x coordinate (y = constant).
S_DrawColLabels PROC EXPORT
;Using S_CurrentData
input Xpt:w,FCol:w,LCol:w
local Wcnt:w,Length:w,TextWd:w
local Rect:r
BEGIN
; Calculate the total length of the New labels ;
MoveWord Xpt,Length
MoveWord FCol,Wcnt
bra AddWidth
loop4
inc a
sta Wcnt
AddWidth
Call S_CellWidth,in=(a:w),out=(a:w)
AddWord a,Length,Length
CmpWord Wcnt,LCol
bne loop4
; Paint the background light yellow ;
lengthKnown
Call D_Set4Pat,in=(#LightYellow:w)
MoveWord S_ColLabRect,Rect
MoveWord Xpt,Rect+2
MoveWord S_ColLabRect+4,Rect+4
MoveWord Length,Rect+6
Tool _PaintRect,in=(!Rect:l)
Call D_Set4Pat,in=(#Black:w)
; Frame the New area ;
Tool _MoveTo,in=(Xpt:w,#S_EditHeight+S_ColLabelHeight:w)
Tool _LineTo,in=(Length:w,#S_EditHeight+S_ColLabelHeight:w)
Tool _MoveTo,in=(Length:w,#S_EditHeight:w)
Tool _LineTo,in=(Length:w,#S_EditHeight+S_ColLabelHeight:w)
; Draw the labels centered in the columns, with dividers ;
MoveWord FCol,Wcnt
lda LCol
Call S_ColLab2Text
sta LCol
lda FCol
Call S_ColLab2Text
sta Buffer
loop
Tool _MoveTo,in=(Xpt:w,#S_EditHeight:w)
Tool _LineTo,in=(Xpt:w,#S_EditHeight+S_ColLabelHeight:w)
; Draw label ;
Tool _TextWidth,in=(#Buffer:l,#2:w),out=(TextWd:w)
Call S_CellWidth,in=(Wcnt:w),out=(x:w)
SubWord x,TextWd,a
lsr a
AddWord a,Xpt,s
AddWord x,Xpt,Xpt
Tool _MoveTo,in=(:w,#S_EditHeight+S_TextOffset+1:w)
Call D_DrawText,in=(#Buffer:l,#2:w)
; Increment label by one ;
skip
CmpWord Buffer,LCol
beq done
inc Wcnt
AddWord #$0100,Buffer,Buffer
and #$FF00
cmp #$5B00 ; hex for 'Z' + 1
jlt loop
lda Buffer
and #$001F
ora #$4140 ; keep most sig letter
inc a
sta Buffer
brl loop
done
RETURN
Buffer DS.B 2
ENDP
;-----------------------------------------------------------------------------
; S_DrawGrid(X2:w,Y2:w,X1:w,Y1:w,LCol:w)
;
; This routine will draw the grid in the content area of the spreadsheet
; starting at the x1,y1 cordinates and drawing to the x2,y2
; coordinates.
S_DrawGrid PROC EXPORT
;Using S_CurrentData
;Using S_ConstantData
input X2:w,Y2:w,X1:w,Y1:w,LCol:w
local Count:w,Wcnt:w
BEGIN
lda S_CurEditFlag
and #S_GridOff
jne Exit
lda S_CurPrinting
bne maskSet
Tool _SetPenMask,in=(#S_DashMask:l)
maskSet
; Draw the horizontal lines ;
MoveWord Y1,Count
loop3
Tool _MoveTo,in=(X1:w,Count:w)
Tool _LineTo,in=(X2:w,Count:w)
step3
AddWord #S_RowHeight,Count,Count
CmpWord Y2,Count
bge loop3
; Draw the vertical lines ;
MoveWord LCol,Wcnt
MoveWord X1,Count
loop4
Tool _MoveTo,in=(Count:w,Y1:w)
Tool _LineTo,in=(Count:w,Y2:w)
step4
Call S_CellWidth,in=(Wcnt:w),out=(a:w)
AddWord a,Count,Count
inc Wcnt
CmpWord X2,Count
bge loop4
Tool _SetPenMask,in=(#S_NormalMask:l)
Exit
RETURN
ENDP
;-----------------------------------------------------------------------------
; S_DrawRowLabels(Ypt:w,FRow:w,LRow:w)
;
; This routine draws the row labels in the given range starting at the given
; y coordinate. (x = constant).
S_DrawRowLabels PROC EXPORT
;Using S_CurrentData
input Ypt:w,FRow:w,LRow:w
local Rect:r
BEGIN
; Calculate the total length of the New labels ;
SubWord LRow,FRow,a
inc a
tax
ldy #S_RowHeight
Call D_FastMult
AddWord a,Ypt,Rect+4
; Paint the background light yellow ;
Call D_Set4Pat,in=(#LightYellow:w)
MoveWord Ypt,Rect
MoveWord S_RowLabRect+2,Rect+2
MoveWord S_RowLabRect+6,Rect+6
Tool _PaintRect,in=(!Rect:l)
Call D_Set4Pat,in=(#Black:w)
; Frame the New area ;
Tool _MoveTo,in=(#S_NumLabelWidth:w,Ypt:w)
Tool _LineTo,in=(#S_NumLabelWidth:w,Rect+4:w)
Tool _MoveTo,in=(#0:w,Rect+4:w)
Tool _LineTo,in=(#S_NumLabelWidth:w,Rect+4:w)
; Draw the labels with dividers ;
loop
Tool _MoveTo,in=(#0:w,Ypt:w)
Tool _LineTo,in=(#S_NumLabelWidth:w,Ypt:w)
Tool _Int2Dec,in=(FRow:w,#Buffer:l,#4:w,#0:w)
in #S_NumLabOffSet-S_NumLabelWidth:w,#S_TextOffset:w
XTool _Move
Call D_DrawText,in=(#Buffer:l,#4:w)
inc FRow
AddWord Ypt,#S_RowHeight,Ypt
CmpWord LRow,FRow
bge loop
RETURN
Buffer DS.B 4
ENDP
;---------------------------------------------------------------------------
; S_HiliteCells
;
S_HiliteCells PROC EXPORT
;Using S_CurrentData
local Rect:r
BEGIN
in S_CurTLSelect:l
out a:w,a:w,Rect:l
XCall S_WhereCell
in S_CurBRSelect:l
out Rect+4:l,a:w,a:w
XCall S_WhereCell
lda Rect
bne cont1
MoveWord S_CurContYpt,Rect
bra chk2
cont1
cmp S_CurContHt
bge Exit
chk2
lda Rect+2
bne cont2
MoveWord S_CurContXpt,Rect+2
bra chk3
cont2
cmp S_CurContWd
bge Exit
chk3
inc Rect
inc Rect+2
inc Rect+2
lda Rect+4
beq Exit
inc a
cmp S_CurContHt
blt cont3
lda S_CurContHt
cont3
sta Rect+4
chk4
lda Rect+6
beq Exit
inc a
inc a
cmp S_CurContWd
blt cont4
lda S_CurContWd
cont4
sta Rect+6
CmpWord Rect,Rect+4
bge Exit
CmpWord Rect+2,Rect+6
bge Exit
Tool _InvertRect,in=(!Rect:l)
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_FindLeftContent( CurCell:l ): ContCell:l,Offset:w
;
;
S_FindLeftContent PROC EXPORT
;Using S_CurrentData
input CurCell:l
output ContCell:l,Offset:w
local CellPtr:l
BEGIN
stz Offset
overlapLoop
dec CurCell+2
Call S_CellWidth,in=(CurCell+2:w),out=(:w)
SubWord Offset,s,Offset
in CurCell:l
out CellPtr:l
XCall S_GetCellPtr
MoveWord [CellPtr]:#S_CellFormat,a
bmi overlapLoop
MoveLong CurCell,ContCell
RETURN
ENDP
;---------------------------------------------------------------------------
; S_FindRightContent( CurCell:l ): ContCell:l,Offset:w
;
; It may be the first cell.
S_FindRightContent PROC EXPORT
;Using S_CurrentData
input CurCell:l
output ContCell:l,Offset:w
local CellPtr:l
BEGIN
stz Offset
overlapLoop
Call S_CellWidth,in=(CurCell+2:w),out=(a:w)
AddWord a,Offset,Offset
inc CurCell+2
in CurCell:l
out CellPtr:l
XCall S_GetCellPtr
MoveWord [CellPtr]:#S_CellFormat,a
bmi overlapLoop
MoveLong CurCell,ContCell
RETURN
ENDP
;--------------------------------------------------------------------------
;
;
S_DrawLocation PROC EXPORT
;Using S_CurrentData
local StrPtr:l,TextWd:w
BEGIN
Tool _EraseRect,in=(#LocRect:l)
CmpLong S_CurTLSelect,S_CurBRSelect
bne doRangeStr
MoveLong #Buffer,StrPtr
Call S_Cell2Str,in=(#Buffer:l,S_CurTLSelect:l)
bra doDraw
doRangeStr
MoveLong #RangeStr,StrPtr
doDraw
Tool _StringWidth,in=(StrPtr:l),out=(TextWd:w)
SubWord #S_NumLabelWidth,TextWd,a
lsr a
Tool _MoveTo,in=(a:w,#S_EditHeight+S_TextOffset+1:w)
Call D_DrawString,in=(StrPtr:l)
RETURN
LocRect DC.W S_EditHeight+2,0
DC.W S_EditHeight+S_ColLabelHeight,S_NumLabelWidth
RangeStr str 'Range'
Buffer DS.B 7
ENDP
;--------------------------------------------------------------------------
;
;
S_DrawBothTitles PROC EXPORT
;Using S_CurrentData
local DoDrawRegion:w
BEGIN
stz DoDrawRegion
Call S_DrawLocation
CmpWord S_CurContXpt,#S_NumLabelWidth
beq chkRowLabels
inc DoDrawRegion
in #S_NumLabelWidth:w
in S_CurTLTitle+2:w,S_CurBRTitle+2:w ; only cols
XCall S_DrawColLabels
chkRowLabels
CmpWord S_CurContYpt,#S_EditHeight+S_ColLabelHeight
beq Exit
in #S_EditHeight+S_ColLabelHeight:w
in S_CurTLTitle:w,S_CurBRTitle:w ; only rows
XCall S_DrawRowLabels
lda DoDrawRegion
beq Exit
in S_CurContXpt:w,S_CurContYpt:w
in #S_NumLabelWidth:w,#S_EditHeight+S_ColLabelHeight:w
in S_CurTLTitle:l,S_CurBRTitle:l,#0:w
in #S_NumLabelWidth:w
XCall S_DrawRegion
in S_CurContXpt:w,#S_EditHeight+S_ColLabelHeight:w
XTool _MoveTo
Tool _LineTo,in=(S_CurContXpt:w,S_CurContYpt:w)
Tool _MoveTo,in=(#S_NumLabelWidth:w,S_CurContYpt:w)
Tool _LineTo,in=(S_CurContXpt:w,S_CurContYpt:w)
Exit
RETURN
ENDP
;--------------------------------------------------------------------------
;
;
S_DrawColTitles PROC EXPORT
;Using S_CurrentData
input Xpt:w,FCol:w,LCol:w
local Xpt2:w
BEGIN
CmpWord S_CurContYpt,#S_EditHeight+S_ColLabelHeight
beq Exit
in LCol:w,S_CurTLCell:w
out Xpt2:w,a:w,a:w,a:w
XCall S_WhereCell
in Xpt2:w,S_CurContYpt:w
in Xpt:w,#S_EditHeight+S_ColLabelHeight:w
in FCol:w,S_CurTLTitle:w,LCol:w,S_CurBRTitle:w,#0:w
in S_CurContXpt:w
XCall S_DrawRegion
Tool _MoveTo,in=(S_CurContXpt:w,S_CurContYpt:w)
Tool _LineTo,in=(S_CurContWd:w,S_CurContYpt:w)
Exit
RETURN
ENDP
;--------------------------------------------------------------------------
;
;
S_DrawRowTitles PROC EXPORT
;Using S_CurrentData
input Ypt:w,FRow:w,LRow:w
local Ypt2:w
BEGIN
CmpWord S_CurContXpt,#S_NumLabelWidth
beq Exit
in S_CurTLCell+2:w,LRow:w
out a:w,Ypt2:w,a:w,a:w
XCall S_WhereCell
in S_CurContXpt:w,Ypt2:w
in #S_NumLabelWidth:w,Ypt:w
in S_CurTLTitle+2:w,FRow:w,S_CurBRTitle+2:w,LRow:w,#0:w
in #S_NumLabelWidth:w
XCall S_DrawRegion
Tool _MoveTo,in=(S_CurContXpt:w,S_CurContYpt:w)
Tool _LineTo,in=(S_CurContXpt:w,S_CurContHt:w)
Exit
RETURN
ENDP
;-----------------------------------------------------------------------------
;
;
S_DrawRegion PROC EXPORT
;Using S_CurrentData
input Xpt2:w,Ypt2:w,Xpt:w,Ypt:w
input TLCell:l,BRCell:l,DoHilite:w
input LeftEdge:w
local Rect:r,RectPtr:l,OldClip:l
local Ycnt:w,Xcnt:w,CurCol:w
BEGIN
inc Ypt2
inc Xpt2
inc Xpt2
; Set the clip area ;
lda Ypt
inc a
sta Rect
AddWord LeftEdge,#2,Rect+2
MoveWord S_CurContHt,Rect+4
MoveWord S_CurContWd,Rect+6
MoveLong !Rect,RectPtr
Tool _SectRect,in=(RectPtr:l,!Ypt:l,RectPtr:l),out=(a:w)
Tool _NewRgn,out=(OldClip:l)
Tool _GetClip,in=(OldClip:l)
Tool _NewRgn,out=(S_ClipHandle:l)
Tool _RectRgn,in=(S_ClipHandle:l,RectPtr:l)
Tool _SectRgn,in=(OldClip:l,S_ClipHandle:l,S_ClipHandle:l)
Tool _SetClip,in=(S_ClipHandle:l)
; Erase, but don't get any border lines. ;
CmpWord BRCell,#9999
blt ChkCol
dec Ypt2
Tool _MoveTo,in=(#0:w,Ypt2:w)
Tool _LineTo,in=(Xpt2:w,Ypt2:w)
chkCol
CmpWord BRCell+2,#$02BE
blt doErase
dec Xpt2
dec Xpt2
Tool _MoveTo,in=(Xpt2:w,#S_EditHeight+2:w)
Tool _LineTo,in=(Xpt2:w,Ypt2:w)
doErase
Tool _EraseRect,in=(!Ypt:l)
; Draw grid, the moved endpts are okay. ;
in Xpt2:w,Ypt2:w,Xpt:w,Ypt:w,TLCell+2:w
XCall S_DrawGrid
MoveWord Ypt,Ycnt
bra skip5
; Outer loop, for each row in the range, .... ;
loop2
AddWord #S_RowHeight,Ycnt,Ycnt
inc TLCell
skip5
MoveWord TLCell+2,CurCol
MoveWord Xpt,Xcnt
bra skip6
; Inner loop, for each cell in the current row, .... ;
loop1
Call S_CellWidth,in=(CurCol:w),out=(a:w)
AddWord a,Xcnt,Xcnt
inc CurCol
skip6
in CurCol:w,TLCell:w,Xcnt:w,Ycnt:w
XCall S_DrawCell
CmpWord CurCol,BRCell+2
blt loop1
CmpWord TLCell,BRCell
blt loop2
lda DoHilite
beq resetClip
Tool _SetClip,in=(S_ClipHandle:l)
Call S_HiliteCells
resetClip
Tool _SetClip,in=(OldClip:l)
Tool _DisposeRgn,in=(OldClip:l)
Tool _DisposeRgn,in=(S_ClipHandle:l)
Exit
RETURN
ENDP
;-----------------------------------------------------------------------------
; S_PrintPage (TLCell:l,BRCell:l,Rect:r) BRCellPrinted:l
;
;
S_PrintPage PROC EXPORT
;Using S_CurrentData
input TLCell:l,BRCell:l
input BRPoint:l,TLPoint:l
output NextCol:w,NextRow:w
local BRPointPrinted:l,GetBRLoc:w
BEGIN
stz GetBRLoc
; Determine the range to Update, and their coordinates ;
in BRPoint:l
out NextRow:l,BRPointPrinted:l
XCall S_WhichCell
CmpWord NextRow,TLCell ; rows only
bne BRowOk
sta BRCell
inc a
sta NextRow
AddWord BRPointPrinted,#S_RowHeight+1,BRPoint
bra chkRCol
BRowOk
cmp BRCell
beq doAllVert
blt doAllVert
inc GetBRLoc
bra chkRCol
doAllVert
lda BRPointPrinted
inc a
sta BRPoint
lda NextRow
dec a
sta BRCell
chkRCol
CmpWord NextCol,TLCell+2 ; cols only
bne RColOk
sta BRCell+2
inc a
sta NextCol
dec a
Call S_CellWidth,in=(a:w),out=(a:w)
inc a
inc a
AddWord a,BRPointPrinted+2,BRPoint+2
bra gotBRCell
RColOk
cmp BRCell+2
beq doAllHorz
blt doAllHorz
inc GetBRLoc
bra gotBRCell
doAllHorz
lda BRPointPrinted+2
inc a
inc a
sta BRPoint+2
lda NextCol
dec a
sta BRCell+2
gotBRCell
lda GetBRLoc
beq gotBRLoc
in BRCell:l
out :w,:w,a:w,a:w
XCall S_WhereCell
pla
inc a
sta BRPoint
pla
inc a
inc a
sta BRPoint+2
gotBRLoc
Tool _ClipRect,in=(!TLPoint:l)
dec BRPoint
dec BRPoint+2
dec BRPoint+2
lda S_CurEditFlag
and #S_GridOff
bne skipTLlines
Tool _MoveTo,in=(#0:w,#0:w)
Tool _LineTo,in=(S_CurContWd:w,#0:w)
Tool _MoveTo,in=(#0:w,#0:w)
Tool _LineTo,in=(#0:w,S_CurContHt:w)
skipTLlines
lda S_CurContYpt
beq doneTopTitle
lda S_CurContXpt
beq doneBothTitle
in S_CurContXpt:w,S_CurContYpt:w
in #0:w,#0:w
in S_CurTLTitle:l,S_CurBRTitle:l,#0:w
in #0:w
XCall S_DrawRegion
doneBothTitle
in BRPoint+2:w,S_CurContYpt:w
in S_CurContXpt:w,#0:w
in TLCell+2:w,S_CurTLTitle:w
in BRCell+2:w,S_CurBRTitle:w,#0:w
in S_CurContXpt:w
XCall S_DrawRegion
Tool _MoveTo,in=(#0:w,S_CurContYpt:w)
Tool _LineTo,in=(S_CurContWd:w,S_CurContYpt:w)
doneTopTitle
lda S_CurContXpt
beq doneLeftTitle
in S_CurContXpt:w,BRPoint:w
in #0:w,S_CurContYpt:w
in S_CurTLTitle+2:w,TLCell:w
in S_CurBRTitle+2:w,BRCell:w,#0:w
in #0:w
XCall S_DrawRegion
Tool _MoveTo,in=(S_CurContXpt:w,#0:w)
Tool _LineTo,in=(S_CurContXpt:w,S_CurContHt:w)
doneLeftTitle
in BRPoint:l,S_CurContXpt:w,S_CurContYpt:w
in TLCell:l,BRCell:l,#0:w
in S_CurContXpt:w
XCall S_DrawRegion
RETURN
ENDP
END