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

1 line
16 KiB
Plaintext
Executable File

load 'macros.dump'
include 'driver.equ'
include 'wp.equ'
;-----------------------------------------------
;
; Imported addresses
;
;-----------------------------------------------
IMPORT W_BoxAdTable
IMPORT W_BoxLocTable
IMPORT W_DTabPc
IMPORT D_DrawIcon
IMPORT W_LTabPc
IMPORT W_MargPc
IMPORT W_RTabPc
IMPORT W_TabWell
IMPORT W_IndentPc
IMPORT Q_Mask
IMPORT W_NothingPc
IMPORT W_oldnumtabs
IMPORT Q_Point
IMPORT W_TabIcons
IMPORT W_vr_indentm
IMPORT W_vr_leftm
IMPORT W_vr_numtabs
IMPORT W_vr_rightm
IMPORT W_vr_status
IMPORT W_vr_tablist
import W_r_changes
import W_RulOffset
;-----------------------------------------------
;
; Forward addresses and entries
;
;-----------------------------------------------
ENTRY W_CheckWells
ENTRY W_DeleteTab
ENTRY W_InvertBitBox
ENTRY W_SetStatBit
ENTRY W_TrackTab
****************************************************************
*
* StyleWorks word processor RULERS private routines
*______________________________________________________________*
*
* CONTENTS:
* W_OneRulClick(clickpt:l) -> changed:w
* W_DeleteTab(num:w) ;
* W_InsertTab(type:w,pos:w)
* W_TrackTab(type:w) ;
* W_SetStatBit(bit:w)
* W_InvertBitBox(bit:w)
*
****************************************************************
****************************************************************
*
* W_OneRulClick(clickpt:l) -- W_Handle a single D_MouseDown event
* in the visible ruler
*
****************************************************************
W_OneRulClick PROC EXPORT
;Using W_RulerData
input clickpt:l
output changed:w
local count:w,temprect:r,rectptr:l
begin
stz changed
moveword W_vr_numtabs,W_oldnumtabs ; redraw tabwells if nec.
cmpw clickpt,#W_tabtop ; is the Q_Point in the numbers?
jlt bye
cmpw clickpt,#W_boxtop ; could it be in a box?
jge boxstuff
*--------------------------------------------------------------*
* W_Handle click in tab area
*--------------------------------------------------------------*
subword clickpt+2,#W_TabOffset,clickpt+2 ; adjust for clk detex'n
subword clickpt+2,W_vr_leftm,a ; is it the left margin?
blt notleft
cmp #W_TabSlop
bgt notleft
subword clickpt+2,W_vr_indentm,a ; COULD it be the W_Indent margin?
blt justleft
cmp #W_TabSlop
bgt justleft
cmpw clickpt,#W_tabtop+3 ; it could be. Is it low enough?
jgt itsindent
justleft pushlong #W_NothingPc ; erase the margin markers
addword W_vr_leftm,#W_TabOffset,s
pushword #W_tabtop
pushword #NotCopy
jsl D_DrawIcon
pushlong #W_NothingPc
addword W_vr_indentm,#W_TabOffset,s
pushword #W_tabtop
pushword #NotCopy
jsl D_DrawIcon
pushword #W_rt_leftm
addword W_vr_leftm,#W_TabOffset,s
pushword #W_tabtop
jsl W_TrackTab
lda W_r_changes
ora #W_ch_left
ora #W_ch_indent ; W_Indent changed, too.
sta W_r_changes
brl done
notleft subword clickpt+2,W_vr_indentm,a ; is it the W_Indent margin?
blt notindent
cmp #W_TabSlop
bgt notindent
itsindent pushlong #W_NothingPc ; erase the marker
addword W_vr_indentm,#W_TabOffset,s
pushword #W_tabtop
pushword #NotCopy
jsl D_DrawIcon
pushlong #W_MargPc ; redraw the left margin, just in case
addword W_vr_leftm,#W_TabOffset,s
pushword #W_tabtop
pushword #NotBic
jsl D_DrawIcon
pushword #W_rt_indentm
addword W_vr_indentm,#W_TabOffset,s
pushword #W_tabtop
jsl W_TrackTab
lda W_r_changes
ora #W_ch_indent
sta W_r_changes
brl done
notindent subword clickpt+2,W_vr_rightm,a ; is it the right margin?
blt notright
cmp #W_TabSlop
bgt notright
pushlong #W_NothingPc ; erase the marker
addword W_vr_rightm,#W_TabOffset,s
pushword #W_tabtop
pushword #NotCopy
jsl D_DrawIcon
pushword #W_rt_rightm
addword W_vr_rightm,#W_TabOffset,s
pushword #W_tabtop
jsl W_TrackTab
lda W_r_changes
ora #W_ch_right
sta W_r_changes
brl done
notright stz count
tabloop cmpw count,W_vr_numtabs ; is it a tab?
jeq bye
lda count
asl a
asl a
tax
lda clickpt+2
sec
sbc W_vr_tablist+W_ort_Location,x
blt nexttab
cmp #W_TabSlop
bgt nexttab
pushword W_vr_tablist+W_ort_Type:x ; for W_TrackTab...
addword W_vr_tablist+W_ort_Location:x,#W_TabOffset,s
pushword #W_tabtop ;
pushword count ;delete the tab (and fix the screen)
jsl W_DeleteTab
jsl W_TrackTab ; ...here (This ;may* reinsert the tab)
brl done
nexttab inc count
brl tabloop
*--------------------------------------------------------------*
* W_Handle click in box area
*--------------------------------------------------------------*
boxstuff stz count
boxloop lda count
cmp #11 ; am I through?
jeq bye
asl a
asl a
tax
movelong W_BoxAdTable:x,rectptr ; get the icon rectangle
movelong [rectptr],temprect ; get my own copy
movelong [rectptr]:#4,temprect+4
pushlong !temprect ; W_offset by icon location
pushlong W_BoxLocTable:x
_OffsetRect
spaceword
pushlong !clickpt
pushlong !temprect
_PtInRect
pla
beq nextbox
cmpw count,#8
bge itsawell
pushword count
jsl W_SetStatBit
brl done
itsawell cmpw W_vr_numtabs,#W_maxTabs
jeq done
subword count,#9,s
pushlong clickpt
jsl W_TrackTab ; (this MAY insert a tab)
bra done
nextbox inc count
brl boxloop
done inc changed
bye return
ENDP
****************************************************************
*
* W_DeleteTab(num:w) -- delete the num'th tab, and fix the screen
*
****************************************************************
W_DeleteTab PROC EXPORT
;Using W_RulerData
input num:w
begin
lda W_r_changes
ora #W_ch_tabs
sta W_r_changes
dec W_vr_numtabs
pushlong #W_NothingPc ; erase the marker
lda num
asl a
asl a
tax
addword W_vr_tablist+W_ort_Location:x,#W_TabOffset,s
pushword #W_tabtop
pushword #NotCopy
jsl D_DrawIcon
mloop cmpw num,W_vr_numtabs
bge endmloop
lda num ; shuffle the next tab back one
asl a
asl a
tax
movelong W_vr_tablist+4:x,W_vr_tablist:x
inc num
bra mloop
endmloop return
ENDP
****************************************************************
*
* W_InsertTab(type:w,pos:w) -- insert a tab
*
****************************************************************
W_InsertTab PROC EXPORT
;Using W_RulerData
input type:w,pos:w
local count:w,count2:w
begin
lda W_r_changes
ora #W_ch_tabs
sta W_r_changes
stz count
floop cmpw count,W_vr_numtabs
bge gotit
lda count
asl a
asl a
tax
lda W_vr_tablist+W_ort_Location,x
cmp pos
bgt gotit
inc count
bra floop
gotit moveword W_vr_numtabs,count2
mloop cmpw count2,count
ble insertit
dec count2
lda count2
asl a
asl a
tax
movelong W_vr_tablist:x,W_vr_tablist+4:x
bra mloop
insertit lda count
asl a
asl a
tax
moveword type,W_vr_tablist+W_ort_Type:x
moveword pos,W_vr_tablist+W_ort_Location:x
inc W_vr_numtabs
return
ENDP
****************************************************************
*
* W_TrackTab - track the tab marker whose type is specified by
* the accumulator
*
****************************************************************
W_TrackTab PROC EXPORT
;Using W_RulerData
input type:w,lastpt:l
local iptr:l,Q_Point:l,redraw:w
local llimit:w,rlimit:w,mlimit:w
local dist:w,count:w
begin
_HideCursor
inc redraw
lda type ; Get a pointer to the icon
inc a
asl a
asl a
tax
movelong W_TabIcons:x,iptr
*--------------------------------------------------------------*
* Compute limits for various tab types
*--------------------------------------------------------------*
lda type
cmp #W_rt_leftm ; ---- PREP FOR LEFT/W_Indent MARGIN ----
beq left1
cmp #W_rt_indentm
jne notleft1
left1 subword W_vr_rightm,#W_pixPerInch*2,rlimit ; limit to rightm - 2"
lda W_vr_numtabs ; any W_Tabs?
jeq gotlimits1 ; if not, we have our limits
subword W_vr_tablist+W_ort_Location,#W_TabSlop,a
cmp rlimit ; if so, limit to the first tab
bge gotlimits1
sta rlimit
gotlimits1 cmpw type,#W_rt_indentm ; if W_Indent, start tracking!
beq in_dent2
tabfirst subword W_vr_indentm,W_vr_leftm,dist ; how far to W_Indent?
bgt in_dent
subword #-W_TabOffset,dist,llimit ; if 'out-denting', keep
brl adjlimits ; indentm positive
in_dent subword rlimit,dist,rlimit ; else limit indentm as above
in_dent2 moveword #-W_TabOffset,llimit ; and keep leftm positive
brl adjlimits
notleft1 cmp #W_rt_rightm ; ---- PREP FOR RIGHT MARGIN ----
jne notright1
addword #8*W_pixPerInch,W_RulOffset,rlimit ; keep it below 8"
lda W_vr_leftm ; which is closer, leftm or indentm?
cmp W_vr_indentm
bgt gotleft2
lda W_vr_indentm
gotleft2 addword a,#W_pixPerInch*2,llimit ; limit to that margin + 2"
lda W_vr_numtabs ; any W_Tabs?
jeq adjlimits ; if not, start trackin'
dec a
asl a
asl a
tax
addword W_vr_tablist+W_ort_Location:x,#W_TabSlop,a
cmp llimit ; if so, limit to the first tab
jle adjlimits
sta llimit
brl adjlimits
notright1 subword W_vr_rightm,#W_TabSlop,rlimit ; ---- PREP FOR W_Tabs ----
lda W_vr_leftm ; which is closer, leftm or indentm?
cmp W_vr_indentm
bgt gotleft3
lda W_vr_indentm
gotleft3 addword a,#W_TabSlop,llimit
adjlimits addword llimit,#W_TabOffset,llimit ; adjust limits for
addword rlimit,#W_TabOffset,rlimit ; tab W_offset
*--------------------------------------------------------------*
* The track loop ;
*--------------------------------------------------------------*
trloop pushlong !Q_Point ; ---- GET AND MANGLE THE MOUSE LOC ----
_GetMouse
lda type
bmi maybedrop ; check for decimal W_Tabs
cmp #W_rt_leftm ; don't drop margins
bge toohigh
maybedrop cmpw Q_Point,#200 ; << sigh... >>
bgt toohigh
cmpw Q_Point,#W_welltop ; is it in the tab area?
bge toolow
toohigh moveword #W_tabtop,Q_Point ; constrain to the tab area
bra goty
toolow moveword #W_welltop,Q_Point ; stay below the tab area
goty lda Q_Point+2 ; make the x coord even
and #$fffe
clc
adc #W_TabOffset ; tweak it a bit
sta Q_Point+2
cmpw Q_Point+2,#10000 ; << ... >>
blt @ok
moveword llimit,Q_Point+2
bra limited
@ok lda llimit ; put the Q_Point within the limits
cmp Q_Point+2
blt l_limited ; << ... >>
sta Q_Point+2
bra limited
l_limited lda rlimit
cmp Q_Point+2
bgt limited
sta Q_Point+2
limited cmpw Q_Point,#W_welltop ; If I'm not in the tab
jeq notnear ; area, I don't need to
stz count ; ---- CHECK FOR TAB COLLISION ----
tabloop cmpw count,W_vr_numtabs
jeq notnear
lda count
asl a
asl a
tax
lda Q_Point+2 ; get the distance to the left side of
sec ; the other tab marker
sbc W_vr_tablist+W_ort_Location,x
sec ; << HMMM! >>
sbc #W_TabOffset-W_TabSlop
cmp #0 ; << hmmm.... >>
ble nexttab
cmp #2*W_TabSlop
blt nearone
nexttab inc count ; maybe next W_Time
bra tabloop
nearone movelong lastpt,Q_Point ; don't move from last W_Time!
notnear lda redraw ; ---- DRAW THE ICONS IF NECESSARY ----
jne newicon
spaceword
pushword #0
_StillDown ; is the button down?
pla
jeq endtrloop ; if not, stop tracking
cmpl Q_Point,lastpt ; has the Q_Point changed?
jeq trloop ; if not, keep tracking
pushlong iptr ; erase the old one
pushlong lastpt
pushword #NotXor
jsl D_DrawIcon
cmpw type,#W_rt_leftm ; W_Indent marker, too?
bne newicon
pushlong #W_IndentPc
addword lastpt+2,dist,s
pushword lastpt
pushword #notXor
jsl D_DrawIcon
newicon pushlong iptr ; draw the D_New one
pushlong Q_Point
pushword #NotXor
jsl D_DrawIcon
cmpw type,#W_rt_leftm ; W_Indent marker, too?
bne noindent
pushlong #W_IndentPc
addword Q_Point+2,dist,s
pushword Q_Point
pushword #notXor
jsl D_DrawIcon
noindent movelong Q_Point,lastpt
stz redraw
brl trloop
*--------------------------------------------------------------*
* Set the margin/tab and D_Update the ruler
*--------------------------------------------------------------*
endtrloop pushlong iptr
pushlong lastpt
pushword #notXor
jsl D_DrawIcon
cmpw type,#W_rt_leftm
bne erased2
pushlong #W_IndentPc
addword lastpt+2,dist,s
pushword lastpt
pushword #notXor
jsl D_DrawIcon
erased2 cmpw Q_Point,#W_welltop
beq bye
pushlong iptr
pushlong Q_Point
pushword #notBic
jsl D_DrawIcon
cmpw type,#W_rt_leftm
bne notleft3
pushlong #W_IndentPc
addword Q_Point+2,dist,s
pushword Q_Point
pushword #notBic
jsl D_DrawIcon
subword Q_Point+2,#W_TabOffset,W_vr_leftm
addword Q_Point+2,dist,a
subword a,#W_TabOffset,W_vr_indentm
brl bye
notleft3 cmp #W_rt_indentm
bne notindent3
subword Q_Point+2,#W_TabOffset,W_vr_indentm
brl bye
notindent3 cmp #W_rt_rightm
bne notright3
subword Q_Point+2,#W_TabOffset,W_vr_rightm
brl bye
notright3 pushword type ; it must be a tab.
subword Q_Point+2,#W_TabOffset,s
jsl W_InsertTab
bye jsl W_CheckWells ; redraw the tabwells?
goway _ShowCursor
return
ENDP
****************************************************************
*
* W_CheckWells -- redraw the tabwells if necessary
*
****************************************************************
W_CheckWells PROC EXPORT
;Using W_RulerData
lda W_vr_numtabs
cmp W_oldnumtabs
jeq goway
pushlong #W_TabWell ; if W_NumTabs = W_maxTabs or W_maxTabs-1,
pushword #W_t1 ; redraw the tab wells
pushword #W_welltop
pushword #notCopy
jsl D_DrawIcon
pushlong #W_TabWell
pushword #W_t2
pushword #W_welltop
pushword #notCopy
jsl D_DrawIcon
pushlong #W_TabWell
pushword #W_t3
pushword #W_welltop
pushword #notCopy
jsl D_DrawIcon
cmpw W_vr_numtabs,#W_maxTabs ; if W_maxTabs, then that's all!
beq goway
pushlong #W_LTabPc ; Otherwise, fill 'em, too.
pushword #W_t1+W_THoff
pushword #W_welltop
pushword #NotBic
jsl D_DrawIcon
pushlong #W_DTabPc
pushword #W_t2+W_THoff
pushword #W_welltop
pushword #NotBic
jsl D_DrawIcon
pushlong #W_RTabPc
pushword #W_t3+W_THoff
pushword #W_welltop
pushword #NotBic
jsl D_DrawIcon
goway rtl
ENDP
****************************************************************
*
* W_SetStatBit -- set the specified status bit, reseting any
* others in the same family, and change the appearance
* of the ruler appropriately.
*
****************************************************************
W_SetStatBit PROC EXPORT
;Using W_RulerData
input bit:w
local Q_Mask:w,family:w
begin
lda #1
ldx bit
bitloop beq gotit
asl a
dex
bra bitloop
gotit sta Q_Mask
lda Q_Mask
cmp #W_r_widow ; is it the widow bit?
jne notwidow
lda W_r_changes ; remember that I changed it...
ora #W_r_widow
sta W_r_changes
pushword bit ; ...change it on the screen...
jsl W_InvertBitBox
lda W_vr_status ; ...then change it for real.
eor #W_r_widow
sta W_vr_status
brl bye
notwidow jlt notjust ; is it justification?
moveword #W_r_just,family
bra gotfam
notjust moveword #W_r_spacing,family
gotfam lda W_r_changes ; remember ONLY the last bit set in
and #$ffff-family ; the family!!!
ora Q_Mask
sta W_r_changes
lda W_vr_status
and family
cmp Q_Mask
jeq bye ; if the bit's already set, do nothing
ldx #0
jloop lsr a
beq gotoldj
inx
bra jloop
gotoldj phx ; invert the old box
jsl W_InvertBitBox
pushword bit ; invert the D_New box
jsl W_InvertBitBox
lda W_vr_status ; set the bit
eor #$ffff
ora family ; (clear the old bit first)
eor #$ffff
ora Q_Mask
sta W_vr_status
bye return
ENDP
****************************************************************
*
* W_InvertBitBox -- invert the box associated with a status bit
*
****************************************************************
W_InvertBitBox PROC EXPORT
;Using W_RulerData
input bit:w
local rectptr:r,temprect:r
begin
lda bit
asl a
asl a
tax
movelong W_BoxAdTable:x,rectptr ; get the icon rectangle
movelong [rectptr],temprect ; get my own copy
movelong [rectptr]:#4,temprect+4
pushlong !temprect ; W_offset by icon location
pushlong W_BoxLocTable:x
_OffsetRect
inc temprect
addword temprect+2,#2,temprect+2
subword temprect+4,#2,temprect+4
subword temprect+6,#4,temprect+6
pushlong !temprect
_InvertRect
return
ENDP
END