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

1 line
10 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'SS.equ'
INCLUDE 'Driver.equ'
INCLUDE 'Heap.aii.i'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_AlertBox
IMPORT D_MemoryError
IMPORT X_DialogFromScrap
IMPORT X_GetScrap
IMPORT X_SSScTypes
IMPORT S_AcceptCell
IMPORT S_ActiveWindow
IMPORT S_AddCellToChangedList
IMPORT S_BadPasteMsg
IMPORT S_BuildSimpleUndo
IMPORT S_CalculateSheet
IMPORT S_ChkCellProtect
IMPORT S_ClearCell
IMPORT S_CurBRMost
IMPORT S_CurBRSelect
IMPORT S_CurEditFlag
IMPORT S_CurLEHandle
IMPORT S_CurTLSelect
IMPORT S_DoChecks
IMPORT S_DrawLocation
IMPORT S_ExtraData
IMPORT S_ExtraDataMsg
IMPORT S_FixLE
IMPORT S_GetCellPtr
IMPORT S_GetDirDlog
IMPORT S_GetSSScrap
IMPORT S_HiliteCells
IMPORT S_PasteValueMsg
IMPORT S_ProtectedCell
IMPORT S_ProtectedCellMsg
IMPORT S_PutSSScrap
IMPORT S_QTraverse
IMPORT S_RedrawCellRange
IMPORT S_ScrapBR
IMPORT S_ScrapBottom
IMPORT S_ScrapBuffer
IMPORT S_ScrapLeft
IMPORT S_ScrapOrgCell
IMPORT S_ScrapRight
IMPORT S_ScrapTL
IMPORT S_ScrapTop
IMPORT S_ScrapValue2String
IMPORT S_SetBRMostCell
IMPORT S_SetUndoOn
IMPORT S_SwapIn
;----------------------------------------------------------------------------
; S_PasteValues
;
S_PasteValues PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using X_ClipData
;Using SANEequs
;Using S_ErrorData
;Using S_ProtectData
local ContentIndex:l,Cell:l,CellPtr:l
local ScrapHandle:l,Buffer:l,SFlag:w
local TLCell:l,BRCell:l,ScrapLimit:l
local ContentPtr:l
local TypeCell:w,Format:l
local LCell:l,RCell:l,StringPtr:l
local ContentStart:l,ContentSize:l,CellSize:w
local ScrapSize:l,ValueSize:l
error ErrorFlag
BEGIN +b
stz ErrorFlag
stz ContentIndex
stz ContentIndex+2
Call X_GetScrap,in=(#X_SSScTypes:l),out=(SFlag:w,ScrapHandle:l)
beq needScrap
MoveLong [ScrapHandle],Buffer
MoveWord [Buffer]:#S_ScrapParseCode,a
beq goodScrap
needScrap
Call D_AlertBox,in=(#OkBox:w,#S_PasteValueMsg:l),out=(a:w)
lda SFlag
jeq Quit
brl Exit
goodScrap
Call S_SwapIn,in=(S_ActiveWindow:l)
MoveWord S_CurEditFlag,a
and #S_EditingBit
beq notLE
Call X_DialogFromScrap
Tool _LEPaste,in=(S_CurLEHandle:l)
brl Exit
notLE
MoveWord S_CurTLSelect,S_ScrapTop
AddWord a,[Buffer]:#S_ScrapRows,a
dec a
sta S_ScrapBottom
MoveWord S_CurTLSelect+2,S_ScrapLeft
AddWord a,[Buffer]:#S_ScrapCols,a
dec a
sta S_ScrapRight
; Is it on the spread sheet ;
cmp #703
bge badPaste
CmpWord S_ScrapBottom,#10000
blt chkProtect
badPaste
Call D_AlertBox,in=(#OkBox:w,#S_BadPasteMsg:l),out=(a:w)
brl Exit
chkProtect
; Call D_SetCursor,in=(#WatchCursor:w)
stz S_ProtectedCell
stz S_ExtraData
in S_ScrapTL:l,S_ScrapBR:l,#S_ChkCellProtect:l
XCall S_QTraverse
bcc chkOtherData
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
brl Exit
chkOtherData
lda S_ExtraData
beq DoPaste
Call D_AlertBox,in=(#OkCancelBox:w,#S_ExtraDataMsg:l),out=(a:w)
cmp #OK
beq DoPaste
brl Exit
DoPaste
PushLong S_ScrapTL
PushLong S_ScrapBR
in S_ScrapTL:l,S_ScrapBR:l
XCall S_BuildSimpleUndo,err=ErrorFlag
PullLong S_ScrapBR
PullLong S_ScrapTL
jcs pasteError
MoveLong ScrapHandle,S_ScrapBuffer
MoveLong [ScrapHandle],Buffer
; do Paste ;
SubLong S_ScrapTL,#$10001,S_ScrapOrgCell
MoveLong [Buffer]:#S_ScrapSize,ScrapLimit
MoveWord #S_ScrapCells,ScrapSize
stz ScrapSize+2
MoveLong S_ScrapTL,TLCell
MoveLong S_ScrapBR,BRCell
in TLCell:l,BRCell:l,#S_ClearCell:l
XCall S_QTraverse,err=ErrorFlag
jcs Exit
stz ValueSize+2
stz ContentStart+2
stz ContentSize+2
CmpLong ScrapSize,ScrapLimit
jge chkRedraw
pasteLoop
AddLong [ScrapHandle],ScrapSize,Buffer
; Figure cell location ;
AddLong [Buffer]:#S_ScrapCellLoc,S_ScrapOrgCell,Cell
; Get the content of the cell ;
MoveWord [Buffer]:#S_ScrapValueSize,a
and #$00FF
sta ValueSize
AddWord a,#S_ScrapValue,ContentStart
MoveWord [Buffer]:#S_ScrapCellSize,CellSize
SubWord a,ContentStart,ContentSize
; Check the format for the cell type ;
MoveLong [Buffer]:#S_ScrapFormat,Format
MoveWord Format,a
and #S_CellType
sta TypeCell
jeq copyContent ; cell type text
cmp #S_CellTypeValue
beq noContent
cmp #S_CellTypeTextForm
beq copyValueText
; Must be a value formula ;
in Buffer:l
out ContentIndex:l,TypeCell:w
XCall S_ScrapValue2String,err=ErrorFlag
jcs pasteError
lda Format
and #$FFFF-S_CellType
ora TypeCell ; this might be formula
sta Format ; if NA, ERROR, INF, etc.
brl createCell
noContent
stz ContentIndex
stz ContentIndex+2
brl createCell
copyValueText
AddLong Buffer,#S_ScrapValueSize,StringPtr
MoveWord [StringPtr],a
and #$00FF
inc a
sta ContentSize
stz ContentSize+2
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
jcs pasteError
AddLong Buffer,#S_ScrapValueSize,s
Tool _BlockMove,in=(:l,ContentPtr:l,ContentSize:l)
lda Format
and #$FFFF-S_CellType
; ora #S_CellTypeText ;= 0
sta Format
bra createCell
copyContent
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
jcs pasteError
AddLong [ScrapHandle],ScrapSize,Buffer
AddLong ContentStart,Buffer,s
PushLong ContentPtr
PushLong ContentSize
Tool _BlockMove
; Get a New cell ;
createCell
in Cell:l,Format:l,ContentIndex:l
out LCell:l,RCell:l
XCall S_AcceptCell,err=ErrorFlag
jcs pasteError
; Store the last calculated value ;
in Cell:l
out CellPtr:l
XCall S_GetCellPtr
AddLong [ScrapHandle],ScrapSize,Buffer
lda Format
and #S_CellType
beq setTextValue
AddLong Buffer,#S_ScrapValue,s
AddLong CellPtr,#S_CellValue,s
Tool FX2X,in=(:l,:l)
bra wrapup
setTextValue
MoveLong ContentIndex,[CellPtr]:#S_CellValue
wrapUp
Call S_AddCellToChangedList,in=(Cell:l)
lda RCell+2
cmp S_ScrapRight
blt OKright
sta S_ScrapRight
OKright
lda LCell+2
cmp S_ScrapLeft
bge fixSize
sta S_ScrapLeft
fixSize
lda CellSize
AddLong a,ScrapSize,ScrapSize
CmpLong ScrapSize,ScrapLimit
bge chkRedraw
brl pasteLoop
pasteError
Call D_MemoryError
; Redraw the necessary cells ;
chkRedraw
Call S_FixLE
redraw
in S_ScrapTL:l,S_ScrapBR:l
XCall S_RedrawCellRange
Call S_SetUndoOn,in=(#S_UndoPasteValuesType:w)
lda S_CurEditFlag
and #S_ManCalcBit
bne Exit
Call S_CalculateSheet
Exit
Tool _DisposeHandle,in=(ScrapHandle:l)
Quit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_SelectAll
;
S_SelectAll PROC EXPORT
;Using S_CurrentData
BEGIN +b
Call S_SwapIn,in=(S_ActiveWindow:l)
MoveWord S_CurEditFlag,a
and #S_EditingBit
beq findRange
Tool _LEGetTextLen,in=(S_CurLEHandle:l),out=(x:w)
Tool _LESetSelect,in=(#0:w,x:w,S_CurLEHandle:l)
bra Exit
findRange
lda S_CurEditFlag
and #S_BRMostBit
beq BRset
Call S_SetBRMostCell,in=(#0:w)
lda #S_BRMostBit
trb S_CurEditFlag
BRset
Call S_HiliteCells
MoveWord #1,S_CurTLSelect
sta S_CurTLSelect+2
MoveLong S_CurBRMost,S_CurBRSelect
Call S_HiliteCells
Call S_DoChecks
Call S_FixLE
Call S_DrawLocation
Exit
RETURN
ENDP
;-----------------------------------------------------------------------------
; S_Fill
;
S_Fill PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using S_ErrorData
local TLCell:l,LMost:w,RMost:w
error ErrFlag
BEGIN +b
stz ErrFlag
Call S_SwapIn,in=(S_ActiveWindow:l)
lda S_CurEditFlag
and #S_EditingBit
jne Exit
stzl S_ScrapBuffer
MoveLong S_CurTLSelect,TLCell
MoveWord S_CurTLSelect+2,LMost
MoveWord S_CurBRSelect+2,RMost
CmpWord S_CurTLSelect,S_CurBRSelect
jeq chkFillCols
CmpWord S_CurTLSelect+2,S_CurBRSelect+2
beq fillRows
; Put dialog for choosing row or column fill here ;
; direction: 0==Cancel,1==Left,2==Right,3==Up,4==Down
Call S_GetDirDlog,in=(#0:w),out=(a:w)
jeq Exit ; = cancel
cmp #2 ; = right
jeq chkFillCols
cmp #4 ; = down
jne Exit
fillRows
CmpWord S_CurTLSelect,S_CurBRSelect
jeq Exit
; Call D_SetCursor,in=(#WatchCursor:w)
PushWord TLCell+2
lda TLCell
inc a
pha
in S_CurBRSelect:l,#S_ChkCellProtect:l
XCall S_QTraverse
bcc contRFill
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
brl Exit
contRFill
PushWord TLCell+2
lda TLCell
inc a
pha
Call S_BuildSimpleUndo,in=(:l,S_CurBRSelect:l),err=ErrFlag
bcs cantFill
in S_CurTLSelect:l,S_CurBRSelect+2:w,S_CurTLSelect:w
out S_ScrapBuffer:l
XCall S_GetSSScrap,err=ErrFlag
bcs cantFill
pasteRowLoop
inc TLCell
MoveLong TLCell,S_ScrapTL
Call S_PutSSScrap,err=ErrFlag
bcs cantFill
CmpWord S_ScrapLeft,LMost
bge chkRight1
sta LMost
chkRight1
CmpWord S_ScrapRight,RMost
blt cont1
sta RMost
cont1
CmpWord TLCell,S_CurBRSelect
blt pasteRowLoop
brl redraw
cantFill
Call D_MemoryError
brl redraw
chkFillCols
CmpWord S_CurTLSelect+2,S_CurBRSelect+2
jeq Exit
; Call D_SetCursor,in=(#WatchCursor:w)
lda TLCell+2
inc a
pha
PushWord TLCell
in S_CurBRSelect:l,#S_ChkCellProtect:l
XCall S_QTraverse
bcc contCFill
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
brl Exit
contCFill
lda TLCell+2
inc a
pha
PushWord TLCell
Call S_BuildSimpleUndo,in=(:l,S_CurBRSelect:l),err=ErrFlag
bcs cantFill2
fillCols
in S_CurTLSelect:l,S_CurTLSelect+2:w,S_CurBRSelect:w
out S_ScrapBuffer:l
XCall S_GetSSScrap,err=ErrFlag
bcc pasteColLoop
cantFill2
brl cantFill
pasteColLoop
inc TLCell+2
MoveLong TLCell,S_ScrapTL
Call S_PutSSScrap,err=ErrFlag
bcs cantFill2
CmpWord S_ScrapLeft,LMost
bge chkRight2
sta LMost
chkRight2
CmpWord S_ScrapRight,RMost
blt cont2
sta RMost
cont2
CmpWord TLCell+2,S_CurBRSelect+2
blt pasteColLoop
redraw
in LMost:w,S_CurTLSelect:w,RMost:w,S_CurBRSelect:w
XCall S_RedrawCellRange
Call S_SetUndoOn,in=(#S_UndoFillType:w)
lda S_CurEditFlag
and #S_ManCalcBit
bne killHandle
Call S_CalculateSheet
killHandle
lda S_ScrapBuffer
ora S_ScrapBuffer+2
beq Exit
Tool _DisposeHandle,in=(S_ScrapBuffer:l)
Exit
RETURN
ENDP
END