 lst off
 ttl "QASM Menu Routines"
 exp off
 tr on
 cas se
* dup
*======================================================
* Graphic Shell for QuickASM development system

* Programming by Lane Roath
* Copyright (c) 1990 Ideas From the Deep & Lane Roath
*------------------------------------------------------
* 22-Feb-90 0.20 :remove from main file
*======================================================

 rel

Class1 = $2000

 lst off
 use 2/data/qa.equates
 use macs
 use ifd.equs
 use equs
 lst rtn

 EXT TextName,TextPath,GetTEInfo,GetSelection,selStart,selEnd
 EXT SetSelection,DWarning,GetSelText,SetText,tFind,Shell
 EXT NewStyle,AllTypes,FNSub,tReplace,rulerH,DEOF
 EXT QuitPath,MFOpen,HFile,TEInfoRec,RemoveText,GetText
 EXT textH,TxtTypes

*======================================================
* Handle the find menu (find & replace stuff)

HProj ENT
 cmp #-1 ;open finder doc?
 bne :0

 lda TextName ; yes- special case it!
 tax
 clc ;get length of window title
 adc TextPath
 sta TextPath
 tay
]loop lda TextName+1,x ; & append filename to prefix
 sta TextPath+1,y
 dey
 dex ;done?
 bne ]loop
 bra :DoOpen ; yes- open doc!
:0
 asl ;create index
 tax
 jmp (:tbl,x) ; & pass control to item handler
:tbl
 da :New
 da :Open
 da :Close
 da :Save
 da :Save_As
 da :Build
 da :Options
 da :AddWdw
 da :AddFile
 da :Remove
 da :Other

*------------------------------------------------------
:New
 rts
*------------------------------------------------------
:Open
:DoOpen ;finder entry
 rts
*------------------------------------------------------
:Close
 rts
*------------------------------------------------------
:Save
 rts
*------------------------------------------------------
:Save_As
 rts
*------------------------------------------------------
:Build
* ~PutFile #:BuildAs;#TextName
* bcs :err
* bfl :xit
 ~QASetCancelFlag #0 ;haven't done so yet!
 _QAClearKey
 ~SelectWindow CmdPtr
 jsr pTextPath
 ~QALink #lquick;#TextPath ; yes- link it
 jsr pTextPath
 bcc :xit
:err
 ~SysError #:lerr ;show any errors
:xit
 rts

:BuildAs str 'Save Application as...'
*------------------------------------------------------
:Other
 ~GetFile #:Prompt;#TextName;#TxtTypes
 bcs :err
 bfl :xit
 ~QASetCancelFlag #0 ;haven't done so yet!
 _QAClearKey
 ~SelectWindow CmdPtr ;must have this in forground!
 jsr pTextPath
 ~QALink #lfromname;#TextPath-1
 jsr pTextPath
 bcs :err
 rts

:Prompt str 'Link the file...'
:lerr str 'Linking'

*------------------------------------------------------
:Options
 rts
*------------------------------------------------------
:AddWdw
 rts
*------------------------------------------------------
:AddFile
 rts
*------------------------------------------------------
:Remove
 rts

*======================================================
* Handle the find menu (find & replace stuff)

HSrc ENT
 asl ;create index
 tax
 jmp (:tbl,x) ; & pass control to item handler
:tbl
 da :Find
 da :Find_Again
 da :Replace
 da :Replace_All
 da :Tabs
 da :Fix
 da :Info
 da :Font
 da :Color
 da :Color
 da :Color
 da :Color
 da :Color
 da :Color
 da :Color
 da :Assem
 da :Line

*------------------------------------------------------
:Find
 jsr GetTEInfo
 brl FRDialog ; yes- only if doc not empty!
*------------------------------------------------------
:Find_Again
 ldx tFLen ;anything to search for?
 beq :Find
 jmp FindNext ; yes- do so
*------------------------------------------------------
:Replace
 ldx tFLen ;anything to search for?
 beq :Find
:doReplace
 jsr FindNext ;can we find a match?
 bcs :2x
 ~TEReplace #%101;#tReplace+1;tRLen;#0;#0;#0 ;YES-replace it!
 bcs :2y
 lda selStart
 adc tRLen ;get start/end of replaced
 sta selEnd
 lda selStart+2 ; text (old start & len of new)
 adc #0
 sta selEnd+2
 jsr SetSelection ;hilite the new text for user
 bcc :2x
:2y
 ~SysError #:FR ;oh shit!
:2x rts

:FR str 'Search'

*------------------------------------------------------
:Replace_All
 ldx tFLen ;anything to search for?
 beq :Find
]loop jsr :doReplace ;do one replace
 bcc ]loop
 rts ; & repeat till error

*------------------------------------------------------
:Tabs
 brl MTDialog ; yes- do it w/dialog

*------------------------------------------------------
* Fix text so it will display as true ASCII, not garbage

:Fix
 stz temp ;assume no selection

 ~NewAlert #DWarning ;warn use undo-able!
 bne :2z

 _WaitCursor  ;show we're working

 jsr GetSelText ;get text (selection)
 bcs :2c

 SHORTM
]loop
 lda [Ptr],y ;get a character
 cmp #" "
 bne :f0
 lda #9 ;merlin spaces to tabs!
:f0 and #$7F
 sta [Ptr],y ;store TE readable value
 iny
 bne :f1 ;update bank byte?
 inc Ptr+2
:f1 cpy selEnd ;are we done?
 bne ]loop
 dec temp3 ; (must also check bank!)
 bpl ]loop

 LONGM

 jsr SetText ;replace text & style info
 Hdl_Ptr TEHdl;Ptr
 ldy #$10
 lda [Ptr],y ;show we changed the text
 ora #%01000000
 sta [Ptr],y
:2c
 _InitCursor
 rts

*------------------------------------------------------
:Info
 jsr SetInfo ; yes- set info for dialog
 lda textLen
 ora textLen+2 ;did we get anything?
 bfl :2z
 ~Alert #InfoAlert;#0 ; yes- show user some cool stuff
 pla
:2z
 rts

*------------------------------------------------------
:Font
 jsr GetStyle
 ~ChooseFont NewStyle;#0 ; yes- allow user to do so
 PullLong NewStyle
 bcs :9
 txa
 ora NewStyle ;cancel?
 bfl :fx
 lda #%1100010 ; no, update TE record
 brl SetStyle
:9
 ~SysError #:TEStyle ;oops!
:fx rts

:TEStyle str 'SetStyle'

*------------------------------------------------------
:Color
 sbc #8 ;create index value
 asl
 tax
 lda :colors,x ;get color word
 tax
 lda TaskRc+14 ;option key pressed?
 and #%0000100000000000
 bfl :fore
 stx NewStyle+6 ; yes- change background color
 lda #%00001000
 brl SetStyle
:fore
 stx NewStyle+4
 lda #%00010000 ; no- change foreground color
 brl SetStyle
:colors
 dw $0000,$1111,$4444,$5555,$8888,$9999,$CCCC

*------------------------------------------------------
* Assemble the current source (window)

:Assem
 ~QASetCancelFlag #0 ;haven't done so yet!

 lda FrontWdw ;do we have a window open?
 bfl :sfile
 jsr GetText
 ~SelectWindow CmdPtr ;bring cmd wdw to front!
 _QAClearKey
 ~QACompile #afromhandle;textH ; & assemble source
 jsr RemoveText
 bcc :xit
:err
 ~SysError #:aerr ;show any errors
:xit
 rts
:sfile
 ~GetFile #:Prompt;#TextName;#TxtTypes
 bcs :err
 bfl :xit
 ~SelectWindow CmdPtr ;must have this in forground!
 ~QACompile #afromname;#TextPath
 bcs :err
 rts

:Prompt str 'Assemble the file...'
:aerr str 'Assembling'

*------------------------------------------------------
* Jump to line # in current source window

:Line
 jsr GetTEInfo
 brl LLDialog ;only if doc not empty!

*======================================================
* Handle the TOOL menu added items!

HTool ENT
 bne :added
 ~GetFile #:Prompt;#TextName;#:Types
 bcs :err
 bfl :xit
:xit
 rts
:added
 rts
:err
 ~SysError #MFOpen ;oops!
 rts

*------------------------------------------------------
:Prompt
 str 'Execute the tool...'
:Types
 dw 1
 dw $8000 ;any aux type
 dw $B2
 adrl 0

*======================================================
* Handle the GS/OS menu

HGSOS ENT
 asl ;create index
 tax
 jmp (:tbl,x) ; & pass control to item handler
:tbl
 da :Delete
 da :Rename
 da :Format

*------------------------------------------------------
:Delete
 ~GetFile #:DPrompt;#TextName;#AllTypes
 bcs :de
 bfl :nodel
 lax #TextPath+1
 sax FNSub
 lda TextPath
 xba ;create PString
 sta TextPath
 ~AlertWindow #1;#FNSub;#:DDelete ; yes- should we save it?
 plx
 bcs :de
 btr :Delete
 _WaitCursor
 _GSOS _Destroy;:DelParms ;...delete the file!...
 pha
 _InitCursor
 lda TextPath
 xba ;restore real pathname
 sta TextPath
 pla
 bfl :Delete
:de
 ~SysError #:Del ;show errors
:nodel
 rts
*------------------------------------------------------
:Rename
 rts
*------------------------------------------------------
:Format
 rts
*------------------------------------------------------
:DPrompt
 str 'Delete the file...'
:DDelete
 asc '55$'
 asc 'Are you sure you wish to delete the file *0 ?$'
 asc '#6$^#1',00
:DelParms
 dw 1
 adrl TextName
:Del str 'Delete'

*======================================================
* Handle the LAUNCH menu

HTran ENT
 bne :parmfile ;other than zero special!
 ~GetFile #:Prompt;#TextName;#:Types
 bcs :SFErr
 bfl :xit
 bra :SetLaunch ; yes-setup to launch properly
:SFErr
 ~SysError #MFOpen ;oops!
:xit rts
:parmfile
 rts

*------------------------------------------------------
:Prompt
 str 'Launch...'
:Types
 dw 2
 dw $8000
 dw $FF
 adrl 0 ;we can launch these file types
 dw $8000
 dw $B3
 adrl 0

*------------------------------------------------------
* Setup the quit parms to launch another program

:SetLaunch
* ldx TextPath
* stx QuitPath ;copy length
* SHORTM
*]loop lda TextPath+1,x ;copy to safe buffer
* sta QuitPath+1,x
* dex ; done?
* bne ]loop
* LONGM

 ldy #$C000 ;assume sublaunch
 lda TaskRc+14
 and #%0000100000000000
 bfl :slx ;option key = simple launch
 ldy #$8000
:slx
 sty temp
 ~QASetLaunch #QuitPath;temp ;tell QA to do launch
 lda #267-FileMenu
 jmp HFile   ; & fake QUIT menu selection

*======================================================
* Set a ruler styling.
* ENTRY: A = ruler value, Y = index into ruler record
*  EXIT: none

SetRuler ENT
 pha ;save parms
 phy
 _WaitCursor
 ~TEGetRuler #3;#rulerH;#0 ;get ruler
 bcc :ok
 ply
 plx ;exit w/parms saved
 bra rerr
:ok
 MoveLong rulerH;Hdl ;get into DP
 Hdl_Ptr Hdl;Ptr
 ply ;get offset to justify type
 pla
 sta [Ptr],y ; & set for this file
mySetRuler ENT
 ~TESetRuler #1;Hdl;TEHdl ;all done!
 bcc ne
rerr
 ~SysError #MRuler ;show errors
ne
 ~DisposeHandle Hdl ;hey- we don't want it anymore!
 _InitCursor
 rts

MRuler str 'SetRuler'
*======================================================
* Set style of current TE record seletion
* ENTRY: A = style flags, NewStyle = new style record
*  EXIT: none

SetStyle ENT
 sta temp
 _WaitCursor
 ~TEStyleChange temp;#NewStyle;#0
 _InitCursor
 rts

*======================================================
* Get the current TE record selection's style info.
* ENTRY: none
*  Exit: none

GetStyle
 ~NewHandle #1024;ID3;#0;#0 ;who cares!
 PullLong Hdl
 bcs :9
 ~TEGetSelStyle #NewStyle;Hdl;#0
 plx
 stx temp ;get style return flags
 bcc :1
:9
 ~SysError #:GetStyle ;ooops!
:1
 ~DisposeHandle Hdl ;we don't care!

 lsr temp
 bcs :2 ;attr. valid?
 SHORTM
 stz NewStyle+2 ; no- zap it
 LONGM
:2
 lsr temp ;user data valid?
 bcs :3
 stz NewStyle+8 ; no- zap old data
 stz NewStyle+10
:3
 lsr temp ;backcolor valid?
 bcs :4
 stz NewStyle+6 ; no- zap it
:4
 lsr temp ;forecolor valid?
 bcs :5
 stz NewStyle+4 ; no- ignore it
:5
 lsr temp ;font family valid?
 bcs :7
 stz NewStyle ; no- ignore it
:7
 rts

:GetStyle str 'GetStyle'

*======================================================
* Create a pString or gString of TextPath, depending.

pTextPath ENT
 pha
 lda TextPath
 xba ;[][ Linker not Class1 yet ][]
 sta TextPath
 pla
 rts

*======================================================
* Find the next occurance after the current selection
* of the string in the find buffer.
* ENTRY: none
*  EXIT: selStart/End = offset range of find, bcs = no find

FindNext
 lda FromTop ;start at top?
 btr :top
 jsr GetSelection ; no- start search at end of selection
:top
 jsr GetText ;get the text to search through

 CmpLong selEnd;textLen ;do this?
 blt :doit
 brl :eof ; no- done!
:doit
 lda [Hdl]
 sta Ptr
 ldy #2 ;get TRUE starting location
 lda [Hdl],y
 clc
 adc selEnd+2 ; (ie, adj. for bank)
 sta Ptr+2

 lda textLen+2
 sec
 sbc selEnd+2 ;get # of banks to search
 sta temp3

 SHORTM
 lda CaseFlg ;case insensitive?
 bfl :no
 lda #$7F ; yes- set stuff
 ldx #'_'
 bra :set
:no
 lda #$FF ; no- dissuade code from working
 tax
:set sta :cm1+1
 txa
 sta :cm2+1 ;set ANDs appropriately

 ldy selEnd
:initx
 ldx #1 ;init indexes
]loop
 iny
 bne :ckeof ;update text pointers
 inc Ptr+2
 inc selEnd+2 ;update selection as needed
:ckeof
 cpy textLen ;are we at the EOF?
 bne :getchar
 dec temp3 ; well, past first 64K anyway
 bmi :eof
:getchar
 lda [Ptr],y ;get a char
:cm1 and #$7F
 cmp #'`'+1 ;upper?
 blt :nocnv
:cm2 and #'_' ; yes- force lower
:nocnv
 cmp tFind,x ;does it match?
 bne :initx
 cpx #1 ; yes, fist match?
 bne :no1st
 LONGM
 lda selEnd+2 ; yes- save selection
 sta selStart+2
 sty selStart ; for highlighting
 tya
 dec ;backup one
 clc
 adc Ptr
 sta temp2 ; & set pointer for word checks!
 lda Ptr+2
 adc #0
 sta temp2+2 ; & set zero page for word check
 SHORTM
:no1st
 cpx tFLen ;have we found the entire string?
 inx
 blt ]loop ; no- keep going!
:fnd
 lda LabelFlg ;looking for label?
 bfl :nolbl
 lda [temp2] ; yes, is prev. char a CR?
 cmp #$0D
 bne :initx ; no- not found!
:nolbl
 lda WordFlg ;looking for words?
 bfl :found
 jsr :checkword ; yes- do we have one?
 bfl :initx
:found
 LONGM
 iny ; (must go past last char!)
 sty selEnd
 jsr SetSelection ;show user where selection found!
 bra :bye
:eof
 REP #$30
 ~NewAlert #DEOF ;show user EOF reached
 sec
:bye
 jmp RemoveText ; & exit w/all restored

*------------------------------------------------------
* Check to see if where we now point is a word or just
* part of a word intermixed within some text.

 MX %11 ;in emulation!!!
:checkword
 iny
 lda [Ptr],y ;get char after word
 cmp #'-'
 beq :w0 ;dash?
 cmp #"'"&$7F
 beq :w0
 cmp #'`' ;check for stupid quotes
 bne :w1
:w0
 iny
 lda [Ptr],y ;is this a lonely quote/dash?
 dey
 cmp #' '+1
 blt :w2 ; yes- could be a word
:noword
 dey
 lda #0 ; no- return w/bfl
 rts
:w1
 cmp #'0'
 blt :w2 ;can't be a number
 cmp #'9'+1
 blt :noword
 cmp #'A'
 blt :w2 ;can't be a letter
 cmp #'Z'+1
 blt :noword
 cmp #'a'
 blt :w2 ; (upper or lower case!)
 cmp #'z'+1
 blt :noword
:w2
 lda selStart ;at TOF?
 ora selStart+1
 beq :word
 lda [temp2] ; no- get char before 'word'
 cmp #'0'
 blt :word ;can't be a number
 cmp #'9'+1
 blt :noword
 cmp #'A'
 blt :word ;can't be a letter
 cmp #'Z'+1
 blt :noword
 cmp #'a'
 blt :word ; (upper or lower case!)
 cmp #'z'+1
 blt :noword
:word
 dey ;return normal
 lda #1
 rts

 MX %00 ;back to native!
:justs
 dw 2,0,-1,1

*======================================================
* Bring up the Find and Replace dialog & get user's input

FRDialog
 ~GetNewModalDialog #FindDialog
 PullLong Ptr
 bcc :0
:err
 ~SysError #:FRDlg ;error?
 rts
:0
*---------------------------------------------------------------------
* make the text you got last time the default text

 ~SelectIText Ptr;#5;#0;#-1 ;select the find text
 bcs :err
 ldx #$8000
 lda CaseFlg
 jsr SetDIValue ;set check marks
 ldx #$8002
 lda FromTop
 jsr SetDIValue
 ldx #$8004
 lda WordFlg
 jsr SetDIValue
 ~ShowWindow Ptr ;now show the dialog
 bcs :err
:1
 ~ModalDialog #0 ;let user do his/her thing
 pla
 bmi :check
 cmp #2 ;was it cancel?
 beq :Quit
 cmp #1 ;wait for one of the find
 beq :2
 cmp #4+1 ; or replace buttons
 bge :1
:2
 sta :t
 jsr :SaveText ;save find/replace text
 bfl :1
 pea #:dofind-1 ; & go find whatever it is
:Quit
 ~CloseDialog Ptr
 rts

:t dw 0 ;can't use stack!

*------------------------------------------------------
* handle the checking of the boxes, senor.
*  enter with the ID of the check box in the accumulator

:check
 sta temp ;save for use

 ~GetDItemValue Ptr;temp ;get value of item
 lda temp
 and #$FF ;get index into flags
 tax
 pla
 eor #1 ;invert the value bit
 sta CaseFlg,x
 ldx temp
 jsr SetDIValue
 brl :1

*------------------------------------------------------
* Save the find/replace text so we always have them!

:SaveText
 ~GrabText #5;#tFind
 ~GrabText #6;#tReplace
 lda tFind
 and #$FF
 sta tFLen ;any text to find?
 bfl :no
 jsr CaseFind ; yes -case it as desired
 lda tReplace
 and #$FF
 sta tRLen ; & set replace length as needed
 stz tRLen+2
 lda #1 ;set BTR flag
:no
 rts

*=====================================================================
* find the word that they want to see.

:dofind
 stz selEnd ;assume start search @ top
 stz selEnd+2
 stz LabelFlg ;show NOT a label

 lda :t ;get button #
 dec
 bne :10 ;find = # 1
 inc
:10 jmp HSrc ;handle as menu selection

:FRDlg str 'FRDialog'

*------------------------------------------------------
* Make the FIND text case insensitive

CaseFind
 lda CaseFlg
 bfl :nocase
 ldx tFLen
 SHORTM
]loop lda tFind,x ; yes- transform search string
 and #$7F
 cmp #'`'+1 ;upper?
 blt :nocnv
 and #'_' ; yes- force lower
:nocnv sta tFind,x
 dex ;done?
 bne ]loop
 LONGM ; yes- back to normal
:nocase
 rts

*======================================================
* Bring up the Label/Line # dialog & get user's input

LLDialog
 ~GetNewModalDialog #LineDialog
 PullLong Ptr
 bcc :0
:err
 ~SysError #:LLDlg ;error?
 rts
:0
*---------------------------------------------------------------------
* make the text you got last time the default text

 ~SelectIText Ptr;#3;#0;#-1 ;select the find text
 bcs :err
:1
 ~ModalDialog #0 ;let user do his/her thing
 pla
 cmp #2 ;was it cancel?
 beq :Quit
 dec  ; no- was it just an event?
 bne :1
 jsr :SaveText ;save find/replace text
 bfl :1
 pea #:dofind-1 ; & go find whatever it is
:Quit
 ~CloseDialog Ptr
 rts

*------------------------------------------------------
* Save the find/replace text so we always have them!

:SaveText
 ~GrabText #3;#tFind
 lda tFind
 and #$FF
 sta tFLen
 stz tRLen ;no replacing!
 stz tRLen+2
 rts

*------------------------------------------------------
* find the word that they want to see.

:dofind
 lda tFind+1
 and #$7F
 cmp #'9'+1 ;line # or label?
 blt :line

 dec LabelFlg ;label -tell 'FIND' about it!
 jsr CaseFind

 lda #1
 sta FromTop ;always search from top!
 stz selEnd
 stz selEnd+2
 jmp HSrc ; & handle as simple 'find'

:LLDlg str 'LLDialog'

*------------------------------------------------------
* Display line # @ center of screen
* Based on DISPLAY, not CRs, but this is faster & memory efficient!

:line
 stz temp3 ;init value

 ldx #0 ;start w/first digit
]loop
 lda tFind+1,x ;get a char
 and #$7F
 cmp #'0'
 blt :done ; is it a number?
 cmp #'9'+1
 bge :done
 and #$F
 sta temp3+2 ; yes- get hex digit
 lda temp3
 asl
 sta temp3 ;multiply current value by 10
 asl
 asl
 adc temp3
 adc temp3+2 ;add in new digit
 sta temp3
 inx
 cpx tFLen ;are we done?
 blt ]loop
:done
 stz temp3+2 ; yes- zap high word

 ~TEScroll #3;temp3;#0;#0 ; & show line!
 rts

* ldy #$10+4
* lda [WdwPtr],y ;depth of window (top = 0)
* lsr
* sta temp ; / 2 = middle of window
* stz temp+2
*
* ~TEPointToOffset temp;#0;#0
* PullLong selStart
* bcs :oops
* ~TEPointToOffset temp;#1000;#0 ;get offsets to start & end of line
* PullLong selEnd
* bcs :oops
* jmp SetSelection ; & highlight the line!
*:oops
* ~SysError #:lerr
* rts
*
*:lerr str 'GOTO line'

*======================================================
* Handle the magins & tabs dialog.

MTDialog
 ~TEGetRuler #3;#rulerH;#0 ;get ruler
 bcc :ok
 brl :err
:ok
 MoveLong rulerH;Hdl
 ~HLock Hdl ;lock & make usable

 lda #6
 sta DecLeft
 sta DecIndent
 sta DecRight ;they could be bogus
 sta DecLine
 sta DecTabs

 Hdl_Ptr Hdl;temp3

 lda [temp3],y ;create 'user-friendly' value
 sec
 sbc [temp3]
 sta [temp3],y
 ~Int2Dec [temp3],y;#DecIndent+1;#6;#1

 ~Int2Dec [temp3];#DecLeft+1;#6;#1
 ldy #4
 ~Int2Dec [temp3],y;#DecRight+1;#6;#1
 ldy #8
 ~Int2Dec [temp3],y;#DecLine+1;#6;#1
 ldy #$14
 ~Int2Dec [temp3],y;#DecTabs+1;#6;#1
 ldy #$18
 ~Int2Dec [temp3],y;#DecTabs1+1;#6;#1
 ldy #$1C
 ~Int2Dec [temp3],y;#DecTabs2+1;#6;#1
 ldy #$20
 ~Int2Dec [temp3],y;#DecTabs3+1;#6;#1

 ~GetNewModalDialog #TabDialog
 PullLong Ptr
 bcc :0
:err
 ~SysError #:TabDlg ;error?
 rts
:0
*---------------------------------------------------------------------
* Handle the actual usage of this dialog

 ~SelectIText Ptr;#3;#0;#-1 ;select first box
 bcs :err
 ~ShowWindow Ptr ;now show the dialog
 bcs :err
:1
 ~ModalDialog #0 ;let user do his/her thing
 pla
 cmp #2 ;was it cancel?
 beq :Quit
 dec ; no, ok?
 bne :1
:2
 jsr :SaveText ;save changed values
:Quit
 ~CloseDialog Ptr
 rts
:verr
 ~NewAlert #DIllVal ;show illegal value
 pla
 bra :1 ; zap RTS & continue

*------------------------------------------------------
* Save the value of the dialog into the ruler settings

:SaveText
 ~GetInt #3 ;left margin
 bcs :verr
 sta [temp3]

 ~GetInt #5 ;indention
 bcs :verr
 ldy #2
 adc [temp3] ; (which is added to left margin)
 sta [temp3],y
 sta temp

 ~GetInt #4 ;right margin
 bcs :verr
 ldy #4
 sta [temp3],y
 cmp [temp3] ;must be > left margin
 blt :verr
 cmp temp ; and paragraph indention!
 blt :verr

 ~GetInt #6 ;line spacing
 bcs :verr
 ldy #8
 sta [temp3],y

 ~GetInt #7 ;tabs
 bcs :t1
 ldy #$14
 sta [temp3],y
:t1
 ~GetInt #16
 bcs :t2
 ldy #$18
 sta [temp3],y
:t2
 ~GetInt #17
 bcs :t3
 ldy #$1C
 sta [temp3],y
:t3
 ~GetInt #18
 bcs :t4
 ldy #$20
 sta [temp3],y
:t4
 jmp mySetRuler ;make changes

:TabDlg str 'Margin'

*======================================================
* Update the values shown in the info dialog

SetInfo
 _WaitCursor

 jsr GetTEInfo ;get some info, check for empty

 ~Long2Dec TEInfoRec;#DecLen+1;#6;#0 ;...char count
 ~Long2Dec TEInfoRec+4;#DecLines+1;#4;#0 ;...lines
 ~Long2Dec TEInfoRec+12;#DecMem+1;#8;#0 ;...memory
 ~Long2Dec TEInfoRec+16;#DecStCt+1;#4;#0 ;...styles

 jsr GetSelText ;get text (selection)
 bcc :doit
 rts
:doit
 stz temp ;no words
 stz temp+2 ;no paras
 stz temp2 ;no prev. word

 SHORTM ;work w/char
]loop
 lda [Ptr],y ;get a char
 cmp #' '
 beq :word ;word?
 cmp #13
 beq :cr ;paragraph?
 stz temp2
 bra :no ; no- must be text
:cr
 ldx temp+2 ; yes- count paragraph
 inx
 stx temp+2
:word
 ldx temp2 ;space/CR previous?
 btr :no
 dec temp2 ; no- mark & count this one
 ldx temp
 inx  ; (16 bit incr. ... INC = 8 here!)
 stx temp
:no
 iny
 bne :same ;update bank byte?
 inc Ptr+2
:same cpy selEnd ;done w/this bank?
 bne ]loop
 dec temp3 ; yes- are we totally done?
 bpl ]loop

 LONGM
 and #$7F
 cmp #13 ;last char a CR?
 beq :skip
 cmp #' ' ; or a space?
 beq :skip
 inc temp ; no- one last word & para.
 inc temp+2
:skip
 ~Int2Dec temp;#DecWord+1;#4;#0
 ~Int2Dec temp+2;#DecPara+1;#4;#0 ;covert values to dec ASCII

 jsr RemoveText ;free up memory for next part

 ~FreeMem ;get free memory
 PullLong temp
 ~Long2Dec temp;#DecFree+1;#8;#0
 ~RealFreeMem
 PullLong temp ;get purgable free mem
 ~Long2Dec temp;#DecPurg+1;#8;#0
 ~MaxBlock
 PullLong temp ;largest block
 ~Long2Dec temp;#DecBlock+1;#8;#0
 ~TotalMem
 PullLong temp ;total system memory
 ~Long2Dec temp;#DecTotal+1;#8;#0

 _InitCursor
 rts

*=================================================
* our Document Information dialog thingy!

InfoAlert
 dw 34,130,129,473
 dw 1
 hex 80808080
 adrl :item1
 adrl :item23
 adrl :item22
 adrl :item21
 adrl :item20
 adrl :item19
 adrl :item18
 adrl :item17
 adrl :item16
 adrl :item15
 adrl :item14
 adrl :item2
 adrl :item3
 adrl :item4
 adrl :item5
 adrl :item6
 adrl :item7
 adrl :item8
 adrl :item9
 adrl :item10
 adrl :item11
 adrl :item12
 adrl :item13
 adrl 0

:item23 dw 23
 dw 58,271,68,333
 dw #$800F
 adrl DecTotal
 dw 0
 dw 0
 adrl 0

:item22 dw 22
 dw 48,271,58,333
 dw #$800F
 adrl DecBlock
 dw 0
 dw 0
 adrl 0

:item21 dw 21
 dw 38,271,48,333
 dw #$800F
 adrl DecPurg
 dw 0
 dw 0
 adrl 0

:item20 dw 20
 dw 28,271,38,333
 dw #$800F
 adrl DecFree
 dw 0
 dw 0
 adrl 0

:item19 dw 19
 dw 18,271,28,333
 dw #$800F
 adrl DecMem
 dw 0
 dw 0
 adrl 0

:item18 dw 18
 dw 58,100,68,148
 dw #$800F
 adrl DecPara
 dw 0
 dw 0
 adrl 0

:item17 dw 17
 dw 48,100,58,148
 dw #$800F
 adrl DecWord
 dw 0
 dw 0
 adrl 0

:item16 dw 16
 dw 38,100,48,148
 dw #$800F
 adrl DecStCt
 dw 0
 dw 0
 adrl 0

:item15 dw 15
 dw 28,99,38,147
 dw #$800F
 adrl DecLines
 dw 0
 dw 0
 adrl 0

:item14 dw 14
 dw 18,99,28,147
 dw #$800F
 adrl DecLen
 dw 0
 dw 0
 adrl 0

:item1 dw 1
 dw 77,70,90,270
 dw #$A
 adrl :item1txt
 dw 0
 dw 1
 adrl 0
:item1txt str /Well, Isn't that special!/

:item2 dw 2
 dw 18,13,28,96
 dw #$800F
 adrl :item2txt
 dw 0
 dw 0
 adrl 0
:item2txt str 'Char. Count:'

:item3 dw 3
 dw 28,18,38,96
 dw #$800F
 adrl :item3txt
 dw 0
 dw 0
 adrl 0
:item3txt str 'Line Count:'

:item4 dw 4
 dw 38,11,48,96
 dw #$800F
 adrl :item4txt
 dw 0
 dw 0
 adrl 0
:item4txt str 'Num. Styles:'

:item5 dw 5
 dw 48,16,58,96
 dw #$800F
 adrl :item5txt
 dw 0
 dw 0
 adrl 0
:item5txt str 'Word Count:'

:item6 dw 6
 dw 58,14,68,96
 dw #$800F
 adrl :item6txt
 dw 0
 dw 0
 adrl 0
:item6txt str 'Paragraphs:'

:item7 dw 7
 dw 18,182,28,267
 dw #$800F
 adrl :item7txt
 dw 0
 dw 0
 adrl 0
:item7txt str 'Doc. Memory:'

:item8 dw 8
 dw 28,180,38,267
 dw #$800F
 adrl :item8txt
 dw 0
 dw 0
 adrl 0
:item8txt str 'Free Memory:'

:item9 dw 9
 dw 38,193,48,267
 dw #$800F
 adrl :item9txt
 dw 0
 dw 0
 adrl 0
:item9txt str 'w/Purging:'

:item10 dw 10
 dw 48,164,58,267
 dw #$800F
 adrl :item10txt
 dw 0
 dw 0
 adrl 0
:item10txt str 'Largest Block:'

:item11 dw 11
 dw 58,170,68,267
 dw #$800F
 adrl :item11txt
 dw 0
 dw 0
 adrl 0
:item11txt str 'Total Memory:'

:item13 dw 13
 dw 5,3,16,344
 dw #$800F
 adrl :item13txt
 dw 0
 dw 0
 adrl 0
:item13txt str '__________________________________________'

:item12 dw 12
 dw 3,62,12,285
 dw #$800F
 adrl :item12txt
 dw 0
 dw 0
 adrl 0
:item12txt str 'Document & System Information'

*=================================================
FindDialog
 dw 34,50,105,399
 dw 0
 adrl 0
 adrl :words
 adrl :case
 adrl :fromtop
 adrl :item6
 adrl :item5
 adrl :item8
 adrl :item7
 adrl :item4
 adrl :item3
 adrl :item2
 adrl :item1
 adrl 0

:item8 dw 8
 dw 24,4,37,99
 dw #$800F
 adrl :item8txt
 dw 0
 dw 0
 adrl 0
:item8txt str 'Replace with:'

:item7 dw 7
 dw 8,3,21,100
 dw #$800F
 adrl :item7txt
 dw 0
 dw 0
 adrl 0
:item7txt str 'Find the text:'

:item6 dw 6
 dw 22,102,36,342
 dw #$11
 adrl tReplace
 dw 30
 dw 0
 adrl 0

:item5 dw 5
 dw 6,102,20,342
 dw #$11
 adrl tFind
 dw 30
 dw 0
 adrl 0

:item4 dw 2
 dw 53,270,66,338
 dw #$A
 adrl CancelTxt
 dw 0
 dw $00
 adrl 0

:item3 dw 4
 dw 53,155,66,259
 dw #$A
 adrl :item3txt
 dw 0
 dw $00
 adrl 0
:item3txt str 'Replace All'

:item2 dw 3
 dw 53,69,66,145
 dw #$A
 adrl :item2txt
 dw 0
 dw $00
 adrl 0
:item2txt str 'Replace'

:item1 dw 1
 dw 53,8,66,57
 dw #$A
 adrl :item1txt
 dw 0
 dw $01
 adrl 0
:item1txt str 'Find'

:case
 dw $8000
 dw 40,85,50,200
 dw $B
 adrl :casetxt
 dw 1
 dw 4
 adrl 0
:casetxt
 str 'Ignore Case'

:fromtop
 dw $8002
 dw 40,210,50,340
 dw $B
 adrl :ftxt
 dw 1
 dw 4
 adrl 0
:ftxt
 str 'From Beginning'

:words
 dw $8004
 dw 40,6,50,70
 dw $B
 adrl :wordtxt
 dw 0
 dw 4
 adrl 0
:wordtxt
 str 'Words'

*=================================================
TabDialog
 dw 36,115,162,275
 dw 0
 adrl 0
 adrl :item15
 adrl :item14
 adrl :item13
 adrl :item12
 adrl :item11
 adrl :item10
 adrl :item9
 adrl :item8
 adrl :item18
 adrl :item17
 adrl :item16
 adrl :item7
 adrl :item6
 adrl :item5
 adrl :item4
 adrl :item3
 adrl :item2
 adrl :item1
 adrl 0

:item15 dw 15
 dw 95,16,106,96
 dw #$800F
 adrl :item15txt
 dw 0
 dw 0
 adrl 0
:item15txt str 'Tab #4:'

:item14 dw 14
 dw 82,16,93,96
 dw #$800F
 adrl :item14txt
 dw 0
 dw 0
 adrl 0
:item14txt str 'Tab #3:'

:item13 dw 13
 dw 69,16,80,96
 dw #$800F
 adrl :item13txt
 dw 0
 dw 0
 adrl 0
:item13txt str 'Tab #2:'

:item12 dw 12
 dw 56,16,67,96
 dw #$800F
 adrl :item12txt
 dw 0
 dw 0
 adrl 0
:item12txt str 'Tab #1:'

:item11 dw 11
 dw 43,4,54,96
 dw #$800F
 adrl :item11txt
 dw 0
 dw 0
 adrl 0
:item11txt str 'Line Spacing:'

:item10 dw 10
 dw 30,22,41,96
 dw #$800F
 adrl :item10txt
 dw 0
 dw 0
 adrl 0
:item10txt str 'Indention:'

:item9 dw 9
 dw 17,4,28,96
 dw #$800F
 adrl :item9txt
 dw 0
 dw 0
 adrl 0
:item9txt str 'Right Margin:'

:item8 dw 8
 dw 4,11,15,96
 dw #$800F
 adrl :item8txt
 dw 0
 dw 0
 adrl 0
:item8txt str 'Left Margin:'

:item18 dw 18
 dw 93,100,107,154
 dw #$11
 adrl DecTabs3
 dw 6
 dw 0
 adrl 0

:item17 dw 17
 dw 80,100,94,154
 dw #$11
 adrl DecTabs2
 dw 6
 dw 0
 adrl 0

:item16 dw 16
 dw 67,100,81,154
 dw #$11
 adrl DecTabs1
 dw 6
 dw 0
 adrl 0

:item7 dw 7
 dw 54,100,68,154
 dw #$11
 adrl DecTabs
 dw 6
 dw 0
 adrl 0

:item6 dw 6
 dw 41,100,55,154
 dw #$11
 adrl DecLine
 dw 6
 dw 0
 adrl 0

:item5 dw 5
 dw 28,100,42,154
 dw #$11
 adrl DecIndent
 dw 6
 dw 0
 adrl 0

:item4 dw 4
 dw 15,100,29,154
 dw #$11
 adrl DecRight
 dw 6
 dw 0
 adrl 0

:item3 dw 3
 dw 2,100,16,154
 dw #$11
 adrl DecLeft
 dw 6
 dw 0
 adrl 0

:item2 dw 2
 dw 110,86,123,154
 dw #$A
 adrl CancelTxt
 dw 0
 dw 0
 adrl 0

:item1 dw 1
 dw 110,12,123,69
 dw #$A
 adrl :item1txt
 dw 0
 dw 1
 adrl 0
:item1txt str 'Done'

DIllVal
 asc '12/'
 asc 'Illegal Value!/'
 asc '^#0',00
*------------------------------------------------------
* Used by info alert

DecWord str '    '
DecPara str '    '
DecLines str '    ' ;strings for Info alert
DecStCt str '    '
DecLen str '      '
DecMem str '        '
DecFree str '        '
DecPurg str '        '
DecBlock str '        '
DecTotal str '        '
DecLeft str '      '
DecRight str '      '
DecIndent str '      '
DecLine str '      '
DecTabs str '      '
DecTabs1 str '      '
DecTabs2 str '      '
DecTabs3 str '      '

CancelTxt str 'Cancel'

*------------------------------------------------------
LineDialog
 dw 34,50,69,298
 dw -1
 adrl 0
 adrl :item4
 adrl :item3
 adrl :item2
 adrl :item1
 adrl 0

:item4 dw 4
 dw 6,5,19,95
 dw #$800F
 adrl :item4txt
 dw 0
 dw 0
 adrl 0
:item4txt str 'Label/Line #'

:item3 dw 3
 dw 19,4,33,244
 dw #$11
 adrl tFind
 dw 30
 dw 0
 adrl 0

:item2 dw 2
 dw 3,175,16,243
 dw #$A
 adrl CancelTxt
 dw 0
 dw $00
 adrl 0

:item1 dw 1
 dw 4,119,15,167
 dw #$A
 adrl :item1txt
 dw 0
 dw 1
 adrl 0
:item1txt str 'GO'

 lst off
 sav 2/obj/qasm1.l
