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

1 line
25 KiB
Plaintext
Executable File

LOAD 'Macros.dump'
INCLUDE 'SS.equ'
INCLUDE 'Driver.equ'
INCLUDE ':::Scrap:Scrap.equ'
INCLUDE 'Heap.aii.i'
INCLUDE 'Eval.aii.i'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT D_AlertBox
IMPORT D_BeachBall
IMPORT D_BitMapChanged
IMPORT D_BitMapPtr
IMPORT D_GrowHandle
IMPORT D_MemoryError
IMPORT D_NeedHand
IMPORT D_SetFileChanged
IMPORT D_SetUndoStr
IMPORT X_DialogFromScrap
IMPORT X_DisposeScrap
IMPORT X_PostScrap
IMPORT S_AcceptCell
IMPORT S_ActiveWindow
IMPORT S_AddCellToChangedList
IMPORT S_BadPasteMsg
IMPORT S_BuildSimpleUndo
IMPORT S_CalculateSheet
IMPORT S_CellWidth
IMPORT S_ChkCellProtect
IMPORT S_CurBRSelect
IMPORT S_CurContHt
IMPORT S_CurContWd
IMPORT S_CurContXpt
IMPORT S_CurContYpt
IMPORT S_CurDefFormat
IMPORT S_CurEditFlag
IMPORT S_CurEditRect
IMPORT S_CurHeap
IMPORT S_CurLEHandle
IMPORT S_CurTLSelect
IMPORT S_CurWindow
IMPORT S_ErrorFormula
IMPORT S_ErrorFormulaLength
IMPORT S_ExtraData
IMPORT S_ExtraDataMsg
IMPORT S_FixLE
IMPORT S_GetCellIndex
IMPORT S_GetRealCell
IMPORT S_INFFormula
IMPORT S_INFFormulaLength
IMPORT S_NAFormula
IMPORT S_NAFormulaLength
IMPORT S_NegINFFormula
IMPORT S_NegINFFormulaLength
IMPORT S_NewLineEdit
IMPORT S_ParseText
IMPORT S_ProtectedCell
IMPORT S_ProtectedCellMsg
IMPORT S_QTraverse
IMPORT S_RedrawCellRange
IMPORT S_RemoveCell
IMPORT S_SetUndoOn
IMPORT S_SwapIn
IMPORT S_SwapOut
IMPORT S_UndoHandle
IMPORT S_UndoNames
IMPORT S_UndoType
IMPORT S_WhichCell
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY S_AddBufferToScrap
ENTRY S_CheckFormula
ENTRY S_ClearCell
ENTRY S_CopyFrame
ENTRY S_CopyRect
ENTRY S_GetSSScrap
ENTRY S_Image
ENTRY S_PutSSScrap
ENTRY S_ScrapBR
ENTRY S_ScrapLeft
ENTRY S_ScrapRight
ENTRY S_ScrapTL
ENTRY S_SetImage
;-------------------------------------------------------------------------;
; S_Clear
;
; S_Clear will clear the currently selected item(s) from the active
; document.
S_Clear PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using S_ProtectData
;Using S_ErrorData
error ErrFlag
BEGIN +b
stz ErrFlag
Call S_SwapIn,in=(S_ActiveWindow:l)
lda S_CurEditFlag
and #S_EditingBit
beq notLE
Tool _LEDelete,in=(S_CurLEHandle:l)
brl Exit
notLE
in S_CurTLSelect:l,S_CurBRSelect:l,#S_ChkCellProtect:l
XCall S_QTraverse
bcc contClear
Call D_AlertBox,in=(#OkBox:w,#S_ProtectedCellMsg:l),out=(a:w)
brl Exit
contClear
MoveLong S_CurTLSelect,S_ScrapTL
MoveLong S_CurBRSelect,S_ScrapBR
in S_CurTLSelect:l,S_CurBRSelect:l
XCall S_BuildSimpleUndo,err=ErrFlag
bcs memError
Call S_QTraverse,in=(S_ScrapTL:l,S_ScrapBR:l,#S_ClearCell:l)
bcc redraw
memError
Call D_MemoryError
redraw
ldx #0
Call S_NewLineEdit,in=(x:w,x:w)
in S_ScrapTL:l,S_ScrapBR:l
XCall S_RedrawCellRange
Call S_SetUndoOn,in=(#S_UndoClearType:w)
lda S_CurEditFlag
and #S_ManCalcBit
bne Exit
Call S_CalculateSheet
Exit
RETURN
ENDP
;-------------------------------------------------------------------------
;
;
S_ClearCell PROC EXPORT
;Using S_ScrapData
input Cell:l,CellIndex:l
error ErrorFlag
BEGIN
; Note: cells will be added to ChangedList in S_RemoveCell
; Another Note: There is no need to execute this code on pad or empty
; cells. Put in branch around in that case.
ldx #S_CellTypeEmpty
in Cell:l,x:w,x:w,x:w,x:w
out :l,:l
XCall S_AcceptCell,err=ErrorFlag
fixLRCells
pla
pla
cmp S_ScrapRight
blt OKright
sta S_ScrapRight
OKright
pla
pla
cmp S_ScrapLeft
bge Exit
sta S_ScrapLeft
Exit
RETURN
ENDP
;-------------------------------------------------------------------------;
; S_Copy (Window:l): ImageRoutine:l, Type:w, Scrap:l
;
; S_Copy will perform a copy of the currently selected item(s) in the given
; document. The output routine draws an image of the scrap for dragging and
; is defined:
;
; ImageRoutine(where:L) - draws the shape at where
;
; The routine should use the current port and penmode (don't change either).
; Pass back a 0 type for no scrap.
S_Copy PROC EXPORT
;Using S_CurrentData
;Using X_ClipData
input Window:l
output ImageRoutine:l,SType:w,ScrapHandle:l
local ScrapLen:l,LEScrapHandle:l
error ErrorFlag
BEGIN +b
stz ErrorFlag
Call S_SwapIn,in=(Window:l)
MoveWord #0,SType
Call S_SetImage,in=(S_CurTLSelect:l,S_CurBRSelect:l)
MoveLong #S_Image,ImageRoutine
lda S_CurEditFlag
and #S_EditingBit
beq notLE
Tool _LECopy,in=(S_CurLEHandle:l),err=ErrorFlag
jcs Exit
Tool _LEGetScrapLen,out=(a:w)
beq Exit
sta ScrapLen
stz ScrapLen+2
in ScrapLen:l
out ScrapHandle:l
XCall D_NeedHand,err=ErrorFlag
bcs Exit
Tool _LEScrapHandle,out=(LEScrapHandle:l),err=ErrorFlag
in [LEScrapHandle]:l,[ScrapHandle]:l,ScrapLen:l
XTool _BlockMove
MoveWord #AsciiText,SType
bra Exit
notLE
in S_CurTLSelect:l,S_CurBRSelect:l
out ScrapHandle:l
XCall S_GetSSScrap,err=ErrorFlag
bcs Exit
MoveWord #SSScrap,SType
Exit
RETURN
ENDP
;---------------------------------------------------------------------
S_ScrapData PROC EXPORT
EXPORT S_ScrapOrgCell
EXPORT S_ScrapTL
EXPORT S_ScrapTop
EXPORT S_ScrapLeft
EXPORT S_ScrapBR
EXPORT S_ScrapBottom
EXPORT S_ScrapRight
EXPORT S_ScrapBufferSize
EXPORT S_ScrapHandleSize
EXPORT S_ScrapHandle
EXPORT S_ScrapBuffer
EXPORT S_ScrapParse
EXPORT S_ScrapPasteType
S_ScrapOrgCell DS.B 4
S_ScrapTL
S_ScrapTop DS.B 2
S_ScrapLeft DS.B 2
S_ScrapBR
S_ScrapBottom DS.B 2
S_ScrapRight DS.B 2
S_ScrapBufferSize DS.B 4
S_ScrapHandleSize DS.B 4
S_ScrapHandle DS.B 4
S_ScrapBuffer DS.B 4
S_ScrapParse DS.B 2
S_ScrapPasteType DS.B 2
ENDP
;-------------------------------------------------------------------------;
; S_Cut (Window:l): ImageRoutine:l
;
; S_Cut will perform a cut of the currently selected item(s) in the given
; document. The output routine draws an image of the scrap for dragging and
; is defined:
;
; ImageRoutine(where:L) - draws the shape at where
;
; The routine should use the current port and penmode (don't change either).
; Pass back a 0 for no scrap.
S_Cut PROC EXPORT
;Using S_CurrentData
;Using S_UndoData
input Window:l
output ImageRoutine:l
local SType:w,ScrapHandle:l
error ErrFlag
BEGIN +b
stz ErrFlag
in Window:l
out ImageRoutine:l,SType:w,ScrapHandle:l
XCall S_Copy,err=ErrFlag
bcs Exit
lda SType
beq Exit
Call X_PostScrap,in=(SType:w,ScrapHandle:l)
Call S_Clear,err=ErrFlag
; some manipulation is needed here to get right undo string
lda S_UndoHandle
ora S_UndoHandle+2
beq Exit
MoveWord #S_UndoCutType,S_UndoType
asl a
asl a
tax
PushLong S_UndoNames:x
Call D_SetUndoStr,in=(:l,S_CurWindow:l)
Exit
RETURN
ENDP
;-------------------------------------------------------------------------;
; S_Paste ( Window:l, Scrap:l, Type:w, Paste:w, Where:l)
;
; The input are:
; - Window, which window to paste in, usually the active one
; - Scrap, a handle to the data, dispose of it when you're done
; - Type, the type of scrap that is being passed.
; - Paste, What type 0 - from menu 1-directional (look at where)
; 2 - from import
; - Where, where paste was if Paste was type 1
; Return any memory errors.
S_Paste PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using S_ProtectData
;Using S_ErrorData
;Using X_ClipData
input Window:l,Scrap:l,Type:w,Paste:w,Where:l
local Buffer:l,Rect:r,PasteType:w
local ContentIndex:l,CellPtr:l
error ErrorFlag
BEGIN +b
stz ErrorFlag
stz ContentIndex
stz ContentIndex+2
stz PasteType
Cmpword Type,#SSScrap
beq doSSScrap
inc ErrorFlag
brl Exit
doSSScrap
Call S_SwapIn,in=(Window:l)
MoveLong Scrap,S_ScrapBuffer
MoveWord Paste,S_ScrapPasteType
CmpWord Paste,#1
jne normal ; menu paste same as import
; Put directional paste code here ;
MoveWord S_CurEditFlag,a
and #S_EditingBit
beq notLE
Tool _PtInRect,in=(!Where:l,#S_CurEditRect:l),out=(a:w)
beq endBranch
Call X_DialogFromScrap
Tool _LEPaste,in=(S_CurLEHandle:l)
endBranch
brl Exit
notLE
MoveWord S_CurContYpt,Rect
MoveWord S_CurContXpt,Rect+2
MoveWord S_CurContHt,Rect+4
MoveWord S_CurContWd,Rect+6
Tool _PtInRect,in=(!Where:l,!Rect:l),out=(a:w)
beq endBranch
in Where:l
out S_ScrapTL:l,Where:l
XCall S_WhichCell
bra fixScrapRange
; CmpWord S_ScrapTop,#10000
; jge Exit
;
; CmpWord S_ScrapLeft,#$02BF
; blt fixScrapRange
; brl Exit
; Set up for normal SS scrap ;
normal
MoveWord S_CurEditFlag,a
and #S_EditingBit
beq notLE2
Call X_DialogFromScrap
Tool _LEPaste,in=(S_CurLEHandle:l)
brl Exit
notLE2
MoveLong S_CurTLSelect,S_ScrapTL
fixScrapRange
MoveLong [Scrap],Buffer
AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
dec a
sta S_ScrapRight
cmp #703
bge badPaste
AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
dec a
sta S_ScrapBottom
cmp #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
; PushLong S_ScrapTL
;
; AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
;; dec a
; pha
;
; AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
; dec a
; pha
in S_ScrapTL:l,S_ScrapBR:l
in #S_ChkCellProtect:l ;two longs on stack
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
; Call D_SetCursor,in=(#WatchCursor:w)
lda Paste
bne setImport
MoveWord #S_UndoPasteType,PasteType
bra contSetUndo
setImport
cmp #1
beq doHotPaste
MoveWord #S_UndoImportType,PasteType
bra contSetUndo
doHotPaste
Call D_SetFileChanged,in=(Window:l)
CmpLong Window,S_ActiveWindow
bne doPaste2
MoveWord #S_UndoPasteType,PasteType
contSetUndo
; MoveLong [Scrap],Buffer
;
; PushLong S_CurTLSelect
; AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
; dec a
; pha
; AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
; dec a
; pha
PushLong S_ScrapTL
in S_ScrapTL:l,S_ScrapBR:l
XCall S_BuildSimpleUndo,err=ErrorFlag
PullLong S_ScrapTL
bcs memError
doPaste2
MoveLong Scrap,S_ScrapBuffer
MoveWord Paste,S_ScrapPasteType
Call S_PutSSScrap,err=ErrorFlag
memError
Call S_FixLE
in S_ScrapTL:l,S_ScrapBR:l
XCall S_RedrawCellRange
lda PasteType
beq chkCalc
Call S_SetUndoOn,in=(PasteType:w)
chkCalc
; Stick code here to see if Appleworks Open should calculate ;
lda S_CurEditFlag
and #S_ManCalcBit
bne savePaste
Call S_CalculateSheet
savePaste
CmpLong S_ActiveWindow,S_CurWindow
beq Exit
Call S_SwapOut
Exit
Call X_DisposeScrap,in=(Type:w,Scrap:l)
RETURN
ENDP
;-----------------------------------------------------------------------------
; S_Image(where) draws an image of the copied cells.
S_Image PROC EXPORT
;Using S_ImageData
input Where:l
BEGIN +b
MoveLong Where,S_CopyRect
AddLong Where,S_CopyFrame,S_CopyRect+4
Tool _FrameRect,in=(#S_CopyRect:l)
RETURN
ENDP
;-----------------------------------
S_ImageData PROC EXPORT
EXPORT S_CopyRect
EXPORT S_CopyFrame
S_CopyRect DS.B 8
S_CopyFrame DS.B 4
ENDP
;-----------------------------------
S_SetImage PROC EXPORT
;Using S_ImageData
;Using S_CurrentData
input TLCell:l,BRCell:l
local MaxHeight:w,MaxWidth:w
BEGIN
SubWord S_CurContHt,S_CurContYpt,MaxHeight
SubWord S_CurContWd,S_CurContXpt,MaxWidth
SubWord BRCell,TLCell,a
inc a
cmp #35
bge setCurHt
asl a
sta S_CopyFrame
asl a
asl a
AddWord a,S_CopyFrame,S_CopyFrame
cmp MaxHeight
blt setWidth
setCurHt
MoveWord MaxHeight,S_CopyFrame
setWidth
SubWord BRCell+2,TLCell+2,a
inc a
cmp #35
bge setCurWd
stz S_CopyFrame+2
wdLoop
Call S_CellWidth,in=(BRCell+2:w),out=(a:w)
AddWord a,S_CopyFrame+2,S_CopyFrame+2
cmp MaxWidth
bge setCurWd
dec BRCell+2
CmpWord BRCell+2,TLCell+2
bge wdLoop
bra Exit
setCurWd
MoveWord MaxWidth,S_CopyFrame+2
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetScrapCell
;
S_GetScrapCell PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using SANEequs
input Cell:l,CellIndex:l
local Buffer:l,ContentSize:l,CellSize:w
local CellPtr:l,ContentPtr:l,Format:w
error ErrorFlag
BEGIN
stz ErrorFlag
CmpWord S_ScrapBufferSize,#$7800
blt bufferOK
Call S_AddBufferToScrap,err=ErrorFlag
jcs Exit
bufferOK
H_GetBlockPtr CellIndex,CellPtr
MoveWord [CellPtr]:#S_CellFormat,Format
jmi Exit
AddLong S_ScrapBuffer,S_ScrapBufferSize,Buffer
; Store the location ;
SubWord Cell,S_ScrapOrgCell,a
inc a
MoveWord a,[Buffer]:#S_ScrapCellLoc
iny
iny
SubWord Cell+2,S_ScrapOrgCell+2,a
inc a
sta [Buffer],y
; Store the format information ;
MoveWord Format,[Buffer]:#S_ScrapFormat
MoveWord [CellPtr]:#S_CellFormat+2,a
and #$FFFF-S_CellProtect-S_CellCircular
MoveWord a,[Buffer]:#S_ScrapFormat+2
MoveWord #S_ScrapValueSize,CellSize
; Store the last calculated value ;
lda Format
and #S_CellTypeValue
jne getSane
CmpLong [CellPtr]:#S_CellValue,[CellPtr]:#S_CellContent
bne getString
MoveWord #0,[Buffer]:#S_ScrapValueSize
inc CellSize
brl getContent
getString
H_GetBlockPtr [CellPtr]:#S_CellValue,ContentPtr
lda [ContentPtr]
and #$00FF
inc a
sta ContentSize
stz ContentSize+2
PushLong ContentPtr
AddLong Buffer,#S_ScrapValueSize,s
PushLong ContentSize
Tool _BlockMove
AddWord ContentSize,CellSize,CellSize
bra getContent
getSane
MoveWord #10,[Buffer]:#S_ScrapValueSize
AddLong CellPtr,#S_CellValue,s
AddLong Buffer,#S_ScrapValue,s
Tool FX2X,in=(:l,:l)
AddWord #11,CellSize,CellSize
; Store the content of the cell ;
getContent
H_GetBlockSize [CellPtr]:#S_CellContent,ContentSize
lda ContentSize+2
ora ContentSize
beq storeSize
H_GetBlockPtr [CellPtr]:#S_CellContent,ContentPtr
PushLong ContentPtr
lda CellSize
AddLong a,Buffer,s
PushLong ContentSize
Tool _BlockMove
; Store the cell size ;
storeSize
AddWord CellSize,ContentSize,[Buffer]:#S_ScrapCellSize
AddLong a,S_ScrapBufferSize,S_ScrapBufferSize
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
;
;
S_ScrapValue2String PROC EXPORT
;Using S_CurrentData
;Using S_FormulaData
;Using SANEequs
input Buffer:l
output ContentIndex:l,CellType:w
local ContentPtr:l,StringPtr:l,ContentSize:l
local FormatPtr:l,ValuePtr:l
error ErrFlag
BEGIN
stz ErrFlag
MoveWord #S_CellTypeValue,CellType
AddLong Buffer,#S_ScrapFormat,FormatPtr
lda [FormatPtr]
and #S_CellInvalid
beq chkInf
MoveWord #S_CellTypeFormula,CellType
lda [FormatPtr]
and #S_CellError
beq doNa
MoveLong #S_ErrorFormula,StringPtr
MoveLong #S_ErrorFormulaLength,ContentSize
brl saveContent
doNa
MoveLong #S_NAFormula,StringPtr
MoveLong #S_NAFormulaLength,ContentSize
brl saveContent
chkInf
AddLong Buffer,#S_ScrapValue,ValuePtr
Tool FCLASSX,in=(ValuePtr:l)
txa
and #$00FF
cmp #$00FE
bne doValue
MoveWord #S_CellTypeFormula,CellType
txa
bmi doNegInf
MoveLong #S_INFFormula,StringPtr
MoveLong #S_INFFormulaLength,ContentSize
bra saveContent
doNegInf
MoveLong #S_NegINFFormula,StringPtr
MoveLong #S_NegINFFormulaLength,ContentSize
bra saveContent
doValue
stz ContentIndex
stz ContentIndex+2
brl Exit
saveContent
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrFlag
bcs Exit
Tool _BlockMove,in=(StringPtr:l,ContentPtr:l,ContentSize:l)
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
; S_GetSSScrap
;
S_GetSSScrap PROC EXPORT
;Using D_GlobalData
;Using S_ScrapData
input TLCell:l,BRCell:l
output ScrapHandle:l
local Buffer:l,ScrapPtr:l
error ErrFlag
BEGIN
stz ErrFlag
MoveWord #1,>D_BitMapChanged
lda >D_BitMapPtr+2
tax
lda >D_BitMapPtr
MoveLong ax,Buffer
MoveLong ax,S_ScrapBuffer
SubWord BRCell,TLCell,a
inc a
MoveWord a,[Buffer]:#S_ScrapRows
SubWord BRCell+2,TLCell+2,a
inc a
MoveWord a,[Buffer]:#S_ScrapCols
MoveWord #0,[Buffer]:#S_ScrapParseCode
MoveWord #S_ScrapCells,S_ScrapBufferSize
stz S_ScrapBufferSize+2
stz S_ScrapHandle
stz S_ScrapHandle+2
stz S_ScrapHandleSize
stz S_ScrapHandleSize+2
MoveLong TLCell,S_ScrapOrgCell
in TLCell:l,BRCell:l,#S_GetScrapCell:l
XCall S_QTraverse,err=ErrFlag
bcs Exit
Call S_AddBufferToScrap,err=ErrFlag
bcs Exit
MoveLong S_ScrapHandle,ScrapHandle
Exit
RETURN
ENDP
;------------------------------------------------------------------------------
;
;
S_AddBufferToScrap PROC EXPORT
;Using S_ScrapData
local ScrapHandle:l,NewSize:l,ScrapPtr:l
error ErrFlag
BEGIN
stz ErrFlag
MoveLong S_ScrapHandle,ScrapHandle
lda ScrapHandle
ora ScrapHandle+2
bne resizeHandle
MoveLong S_ScrapBufferSize,ax
MoveLong ax,NewSize
Call D_NeedHand,in=(ax:l),out=(ax:l),err=ErrFlag
jcs Exit
MoveLong ax,S_ScrapHandle
MoveLong ax,ScrapHandle
bra moveData
resizeHandle
AddLong S_ScrapHandleSize,S_ScrapBufferSize,NewSize
Call D_GrowHandle,in=(NewSize:l,ScrapHandle:l),err=ErrFlag
bcc moveData
Tool _DisposeHandle,in=(ScrapHandle:l)
bra Exit
moveData
MoveLong [ScrapHandle],ScrapPtr
PushLong S_ScrapBuffer
AddLong ScrapPtr,S_ScrapHandleSize,s
PushLong S_ScrapBufferSize
XTool _BlockMove
MoveWord NewSize,[ScrapPtr]:#S_ScrapSize
sta S_ScrapHandleSize
MoveWord NewSize+2,[ScrapPtr]:#S_ScrapSize+2
sta S_ScrapHandleSize+2
stz S_ScrapBufferSize
stz S_ScrapBufferSize+2
Exit
RETURN
ENDP
;---------------------------------------------------------------------------
;
;
S_PutSSScrap PROC EXPORT
;Using S_ScrapData
;Using S_CurrentData
;Using SANEEqus
local TLCell:l,BRCell:l,ScrapLimit:l
local Cell:l,CellIndex:l,CellPtr:l
local ContentIndex:l,ContentPtr:l
local Buffer:l,TypeCell:w,Format:l
local LCell:l,RCell:l,StringPtr:l,ScrapHandle:l
local ParseCode:w
local ContentStart:l,ContentSize:l,CellSize:w
local ScrapSize:l,ValueSize:l
error ErrorFlag
BEGIN
stz ErrorFlag
MoveLong S_ScrapBuffer,ScrapHandle
MoveLong [ScrapHandle],Buffer
AddWord S_ScrapTop,[Buffer]:#S_ScrapRows,a
dec a
sta S_ScrapBottom
AddWord S_ScrapLeft,[Buffer]:#S_ScrapCols,a
dec a
sta S_ScrapRight
SubLong S_ScrapTL,#$10001,S_ScrapOrgCell
; Determine Parse Code ;
MoveWord [Buffer]:#S_ScrapParseCode,ParseCode
; do Paste ;
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 Exit
pasteLoop
Call D_BeachBall
stz ContentIndex
stz ContentIndex+2
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
CmpWord ParseCode,#2
jlt semiParsed
SpaceWord
SpaceLong
; This cludge makes A1 references refer to top,left of Paste ;
; when it is an import of ascii file. ;
CmpWord S_ScrapPasteType,#2
bne notImport
SubLong Cell,S_ScrapOrgCell,s
bra contNotParsed
notImport
PushLong Cell
contNotParsed
PushLong ScrapHandle
lda ContentStart
inc a
AddLong a,ScrapSize,s
SubWord ContentSize,#1,s
PushLong #DRec
PushWord #1
Call S_ParseText,err=ErrorFlag
PullLong ContentIndex
PullWord TypeCell
jcs Exit
lda S_CurDefFormat
and #$FFFF-S_CellType
ora TypeCell
sta Format
MoveWord S_CurDefFormat+2,Format+2
CmpWord TypeCell,#S_CellTypeValue
jne createCell
Tool FDEC2X,in=(#DRec:l,#Number:l)
brl createCell
; Scrap is either semi-parsed or fully - parsed ;
semiParsed
MoveLong [Buffer]:#S_ScrapFormat,Format
MoveWord Format,a
and #S_CellType
sta TypeCell
beq jmpCopyContent ; cell type text
and #S_CellTypeTextForm ; any formula
jeq createCell ; must be a value
lda ParseCode
bne parseFormula
jmpCopyContent
brl copyContent
parseFormula
; Scrap is semi - parsed ;
; These come from AppleWorks and may never have calculated ;
; text fields. ;
SpaceLong
lda ContentStart
inc a
AddLong a,Buffer,s
lda ContentSize
dec a
pha
PushLong Cell
PushWord #1
Call E_ParseFormula,err=ErrorFlag
PullLong ContentIndex
jcc createCell
lda Format
and #$FFFF-S_CellType-S_CellInvalid-S_CellError
; ora #S_CellTypeText ; = 0
sta Format
stz TypeCell
; The Content field has the correct content ;
copyContent
H_NewBlock ContentSize,ContentIndex,ContentPtr,err=ErrorFlag
jcs Exit
AddLong [ScrapHandle],ScrapSize,Buffer
AddLong Buffer,ContentStart,s
PushLong ContentPtr
PushLong ContentSize
Tool _BlockMove
lda Format
and #S_CellTypeTextForm
beq createCell
; If this is an SS formula, make sure that all cell references ;
; are within the spreadsheet. ;
Call S_CheckFormula,in=(Cell:l,ContentPtr:l)
; Get a New cell ;
createCell
in Cell:l,Format:l,ContentIndex:l
out LCell:l,RCell:l
XCall S_AcceptCell,err=ErrorFlag
jcs Exit
; Store the last calculated value ;
AddLong [ScrapHandle],ScrapSize,Buffer
in Cell:l
out CellIndex:l
XCall S_GetCellIndex
H_GetBlockPtr CellIndex,CellPtr
lda TypeCell
and #S_CellTypeValue
beq textInValue
CmpWord ParseCode,#2
bne valueInScrap
lda TypeCell
and #S_CellTypeTextForm ; any formula
jne wrapUp
PushLong #Number
bra moveNumber
valueInScrap
AddLong Buffer,#S_ScrapValue,s
moveNumber
AddLong CellPtr,#S_CellValue,s
Tool FX2X,in=(:l,:l)
brl wrapUp
textInValue
lda TypeCell
jeq setValue ; type = Text
AddWord ValueSize,#1,ValueSize
H_NewBlock ValueSize,ContentIndex,ContentPtr,err=ErrorFlag
bcc okTextValue
; No Space for text value ;
H_GetBlockPtr CellIndex,CellPtr
lda Format
and #$FFFF-S_CellType
ora #S_CellTypeFormula
MoveWord a,[CellPtr]:#S_CellFormat
Call S_RemoveCell,in=(Cell:l)
brl Exit
okTextValue
AddLong [ScrapHandle],ScrapSize,Buffer
AddLong Buffer,#S_ScrapValueSize,s
PushLong ContentPtr
PushLong ValueSize
Tool _BlockMove
H_GetBlockPtr CellIndex,CellPtr
setValue
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
jlt pasteLoop
Exit
RETURN
DRec DS.B 33
Number DS.B 10
ENDP
;-----------------------------------------------------------------------------
;
;
S_CheckFormula PROC EXPORT
input Cell:l,FormulaPtr:l
local Start:w,Stop:w,RealCell:l
BEGIN
MoveWord [FormulaPtr]:#E_FormulaCells,Stop
MoveWord #E_FormulaData,Start
CmpWord Start,Stop
jge Exit
dependLoop
SpaceLong
AddWord Start,#3,y
PushWord [FormulaPtr]:y
dey
dey
PushWord [FormulaPtr]:y
dey
lda [FormulaPtr],y
and #$00FF
pha
PushLong Cell
Call S_GetRealCell
PullLong RealCell
lda RealCell
beq trashIt
cmp #10000
bge trashIt
lda RealCell+2
beq trashIt
cmp #703
blt nextDepend
trashIt
ldy Start
iny
MoveLong #S_NotACell,[FormulaPtr]:y
nextDepend
AddWord Start,#5,Start
cmp Stop
jlt dependLoop
Exit
RETURN
ENDP
END