
	load 'macros.dump'
	include 'driver.equ'
	include 'pl.equ'

;-----------------------------------------------
;
;   Imported addresses
;
;-----------------------------------------------

	IMPORT	Asc2Fix
	IMPORT	D_CloseDialog
	IMPORT	D_DecimalOnly
	IMPORT	D_Deref
	IMPORT	Fix2Asc
	IMPORT	D_GetNewModalDialog
	IMPORT	D_NeedHand
	IMPORT	P_AddGuide
	IMPORT	P_AllHGCount
	IMPORT	P_AllHGuides
	IMPORT	P_AllVGCount
	IMPORT	P_AllVGuides
	IMPORT	P_BuildUndo
	IMPORT	P_ContentRect
	IMPORT	P_DefSize
	IMPORT	P_DeleteData
	IMPORT	P_DoScritch
	IMPORT	P_DragStuff
	IMPORT	P_ExplodeGuide
	IMPORT	P_FindGuide
	IMPORT	P_Fix2Int
	IMPORT	P_FixPt
	IMPORT	P_H
	IMPORT	P_HorizGCount
	IMPORT	P_HorizGuides
	IMPORT	P_Local2PL
	IMPORT	P_LockGuides
	IMPORT	P_MergeGuides
	IMPORT	P_OldIdlePt
	IMPORT	P_PageMode
	IMPORT	P_PageRect
	IMPORT	P_PaperRect
	IMPORT	P_PrintHand
	IMPORT	P_SGuideDlog
	IMPORT	P_TrackMaskHorz
	IMPORT	P_TrackMaskVert
	IMPORT	P_TrackOn
	IMPORT	P_V
	IMPORT	P_VRulRect
	IMPORT	P_VertGCount
	IMPORT	P_VertGuides
	IMPORT	P_VisGuides
	IMPORT	D_Set4Pat
	IMPORT	D_SetCursor
	IMPORT	D_UnLock
	IMPORT	D_FastMult
	
	IMPORT 	P_FullPaperRect
	IMPORT	D_UseStdColors

;-----------------------------------------------
;
;   Forward addresses and entries
;
;-----------------------------------------------

	ENTRY	P_DrawAGuide
	ENTRY	P_KillOldGuides

;		   pguide.s






;-----------------------------------------------------------------------------
;
; P_NewGuide (Vert:w)
;

P_NewGuide	PROC		EXPORT
			;Using P_Data


		input Vert:w
		local Amount:w,Count:w,Offset:w,guiderect:r
		local Max:w,Min:w,array:l,dist:w,tmprect:r
		local amt:l,newcount:w
		error err
		begin

		stz err



		lda vert
		bne SetVert
		call D_SetCursor,in=(#UpDownCursor:w)
		bra DidCursor

SetVert	call D_SetCursor,in=(#LeftRightCursor:w)
DidCursor
		movelong P_ContentRect+4,tmprect+4
		stz tmprect
		moveword P_VRulRect+2,tmprect+2

		tool _ClipRect,in=(!tmprect:l)


		lda vert
		bne VertArray

		moveword P_AllHGCount,Count
		movelong P_AllHGuides,array

		moveword P_ContentRect,Min
		moveword P_ContentRect+4,Max
		moveword #2,dist
		bra DidArrays

VertArray	moveword P_AllVGCount,Count
		movelong P_AllVGuides,array

		moveword P_ContentRect+2,Min
		moveword P_ContentRect+6,Max
		moveword #4,dist
DidArrays

		in #641:w,#201:w,count:w,array:l,#P_DrawAGuide:l,#RulerGuide:w
		in Vert:w,Max:w,Min:w,dist:w,#0:w
		out newcount:w,amt:w
		xerr err
		xcall P_DragStuff

		call P_BuildUndo,in=(#P_GuideUndo:w)

		cmpw count,newcount
		beq DidMove

		lda vert
		beq GetHoriz
		movelong P_VertGuides,array
		moveword P_VertGCount,count
		bra DidArrays2
GetHoriz	movelong P_HorizGuides,array
		moveword P_HorizGCount,count

DidArrays2	bne Unlocked

NeedNew	call D_NeedHand,in=(#4:l),out=(array:l)

Unlocked

;		 ; Place it in the array.
		in amt:w,array:l,count:w,#RulerGuide:w
		out a:w
		xerr err
		xcall P_AddGuide


done	lda vert
		beq HorizCount
		inc P_VertGCount
		inc P_AllVGCount
		movelong array,P_VertGuides
		bra DidMove

HorizCount	inc P_HorizGCount
		inc P_AllHGCount
		movelong array,P_HorizGuides

DidMove

exit	call P_MergeGuides
		tool _ClipRect,in=(#P_ContentRect:l)
		return

		ENDP




;-----------------------------------------------------------------------------
;
; P_MoveGuide (Pt:l)	-- localized Q_Point
;
;		   D_MouseDown at Pt.
;		   Look through page's guidelists to see if it should be dragged.
;		   If so, rip it out of the master guidelist, then call the drag
;		   routine with the master guidelist.  Rip it out of the page
;		   guide list and re-insert it if it still exists.
;
;		   DragStuff needs to return a Q_Point.  Guide existance can be checked
;		   by looking at the input/output count.  The returned Q_Point is used
;		   for insertion into the page's guidelist.
;

P_MoveGuide	PROC		EXPORT
			;Using P_Data

		input Pt:l
		output MovedIt:w
		local vert:w,offset:w,array:l,count:w
		local amt:w,newcount:w,OrigPt:l
		local Max:w,Min:w,Dist:w
		local tmprect:r,NewPt:l
		local _p_array:l,_p_count:w
		local hwidth:w,vwidth:w,guidetype:w
		error err

		begin

		; Q_Point needs to be 'widened' to check 1 pixel above & below,
		; 2 Q_Pixels each to the left & right?
		; needs to coincide w/ draggings nearness checking.

		stz MovedIt

		lda P_LockGuides		; Don't drag if guides are X_Locked
		jne exit

		lda P_VisGuides		 ; or hidden.
		jeq exit

		moveword #2,vwidth
		moveword #1,hwidth

		movelong Pt,OrigPt

		lda P_PageMode
		beq DidMap

		asl vwidth
		asl vwidth	  ; ;** ?
		asl hwidth
		inc hwidth

		; check vertical guides
DidMap	moveword #1,vert
		movelong P_VertGuides,array
		moveword P_VertGCount,count
		moveword Pt+2,amt
		moveword P_ContentRect+2,Min
		moveword P_ContentRect+6,Max
		moveword #4,dist

		in array:l,count:w,amt:w,vwidth:w,#-1:w
		out offset:w,Pt+2:w,guidetype:w
		xcall P_FindGuide
		lda offset
		bpl Removal

		; check horizontal guides
		stz vert
		movelong P_HorizGuides,array
		moveword P_HorizGCount,count
		moveword Pt,amt
		moveword P_ContentRect,Min
		moveword P_ContentRect+4,Max
		moveword #2,dist

		in array:l,count:w,amt:w,hwidth:w,#-1:w
		out offset:w,Pt:w,guidetype:w
		xcall P_FindGuide
		lda offset
		bpl Removal
		brl exit


		; remove it.
Removal	call P_BuildUndo,in=(#P_GuideUndo:w)
		lda count
		dec a
		bne DeleteIt
		tool _DisposeHandle,in=(array:l)
		stzl array
		stz count
		bra Deleted

DeleteIt	call P_DeleteData,in=(array:l,offset:w,#1:w,#4:w,count:w),err=(err)
		dec count
Deleted


		moverect P_ContentRect,tmprect

		lda vert
		beq DoHoriz

		dec P_VertGCount
		rcall P_FixPt,in=(Pt:ax,#1:y),out=(NewPt:ax)
		stx tmprect+2
		inx
		stx tmprect+6

		bra DidUnMap

DoHoriz	dec P_HorizGCount
		rcall P_FixPt,in=(Pt:ax,#0:y),out=(NewPt:ax)
		sta tmprect
		inc a
		sta tmprect+4

DidUnmap
		; re-merge
		call P_MergeGuides

		lda vert
		beq HorizMerge

		movelong P_AllVGuides,_p_array
		moveword P_AllVGCount,_p_count

		bra DidMerge
HorizMerge	movelong P_AllHGuides,_p_array
		moveword P_AllHGCount,_p_count

DidMerge

		tool _EraseRect,in=(!tmprect:l)
		tool _InvalRect,in=(!tmprect:l)

		movelong P_ContentRect+4,tmprect+4
		stz tmprect
		moveword P_VRulRect+2,tmprect+2
		tool _ClipRect,in=(!tmprect:l)

		lda P_TrackOn
		beq DidScritch
		call P_DoScritch,in=(P_OldIdlePt:l)
		stz P_TrackOn
DidScritch

		lda vert
		bne DoLeftRight
		call D_SetCursor,in=(#UpDownCursor:w)
		bra DidCurse

DoLeftRight	call D_SetCursor,in=(#LeftRightCursor:w)

DidCurse

		; drag it.
		in #641:w,#201:w,_p_count:w,_p_array:l,#P_DrawAGuide:l,guidetype:w
		in Vert:w,Max:w,Min:w,dist:w,#0:w
		out newcount:w,amt:w
		xerr err
		xcall P_DragStuff

		inc MovedIt

		cmpw _p_count,newcount
		beq DidMove

		lda count
		bne Unlocked

NeedNew	call D_NeedHand,in=(#4:l),out=(array:l)

Unlocked

;		 ; Place it in the array.
		in amt:w,array:l,count:w,guidetype:w
		out a:w
		xerr err
		xcall P_AddGuide


done	lda vert
		beq HorizCount
		inc P_VertGCount
		inc P_AllVGCount
		movelong array,P_VertGuides
		bra DidMove

HorizCount	inc P_HorizGCount
		inc P_AllHGCount
		movelong array,P_HorizGuides

DidMove
		call P_MergeGuides

		tool _ClipRect,in=(#P_ContentRect:l)

exit	return
		ENDP





;------------------------------------------------------------------------------
;
; P_DrawGuides (RectPtr:l)
;

P_DrawGuides	PROC		EXPORT
			;Using P_Data

		input RectPtr:l
		local Ptr:l,Count:w,H:w,V:w,offset:l

		begin
ThePt	equ V


		subword P_ContentRect,P_V,offset
		subword P_ContentRect+2,P_H,offset+2

		lda P_AllVGCount
		beq DoHoriz

; draw vertical guides
		rcall D_Deref,in=(P_AllVGuides:ax),out=(Ptr:ax)

		stz Count

VLoop	lda Count
		cmp P_AllVGCount
		bge DoneVert

		asl a
		asl a
		tay
		moveword [Ptr]:y,H

		lda P_PageMode
		beq NormV

		tool _MapPt,in=(!ThePt:l,#P_PaperRect:l,#P_FullPaperRect:l)
		bra ShowV

NormV	addword H,offset+2,H

ShowV	call P_DrawAGuide,in=(#-1:l,H:w,#0:w,#-1:w,#1:w)

		inc Count
		bra VLoop
DoneVert

		rcall D_UnLock,in=(P_AllVGuides:ax)


; draw horizontal guides
DoHoriz	lda P_AllHGCount
		beq Exit

		rcall D_Deref,in=(P_AllHGuides:ax),out=(Ptr:ax)

		stz Count
HLoop	lda Count
		cmp P_AllHGCount
		bge DoneHoriz

		asl a
		asl a
		tay
		moveword [Ptr]:y,V

		lda P_PageMode
		beq NormH

		tool _MapPt,in=(!ThePt:l,#P_PaperRect:l,#P_FullPaperRect:l)
		bra ShowH

NormH	addword V,offset,V

ShowH	call P_DrawAGuide,in=(#-1:l,#0:w,V:w,#-1:w,#0:w)

		inc Count
		bra HLoop
DoneHoriz

		rcall D_UnLock,in=(P_AllHGuides:ax)

Exit	_PenNormal
		return

		ENDP





;---------------------------------------------------------------------------
;
; P_DrawAGuide
;
;		   Notes for D_DrawProc:
;
;		   newpt of -1,-1 says to get rid of the old drawing & nothing else
;
;		   newpt == oldpt says to get rid of old, then redraw it for real.
;
;		   oldpt == -1,-1 says just draw it
;
;		   need to clip as necessary before calling this.
;		   Coordinates are in WINDOW local -- not offset nor scaled.
;

P_DrawAGuide	PROC		EXPORT
			;Using P_Data

		input oldpt:l,newpt:l,type:w,vert:w
		local tmprect:r
		begin


		movelong P_ContentRect+4,tmprect+4

		call D_Set4Pat,in=(#Black:w)
		tool _SetPenSize,in=(#1:w,#1:w)

		tool _SetPenMode,in=(#notXOR:w)


		lda vert
		beq MaskVert

		tool _SetPenMask,in=(#P_TrackMaskVert:l)
		bra DidMask
MaskVert	tool _SetPenMask,in=(#P_TrackMaskHorz:l)
DidMask

;		 ; UnDraw the old first...
		cmpl oldpt,#-1
		beq DrawNew

DoErase	lda vert
		bne EraseV

		tool _MoveTo,in=(P_VRulRect+2:w,OldPt:w)
		tool _LineTo,in=(P_ContentRect+6:w,OldPt:w)
		bra DidOld

EraseV	tool _MoveTo,in=(OldPt+2:w,#0:w)
		tool _LineTo,in=(OldPt+2:w,P_ContentRect+4:w)

DidOld

;		 ; Now the D_New...
DrawNew	cmpl newpt,#-1
		jeq exit

		cmpl newpt,oldpt
		bne DrawIt
;		 ; Do send to back stuff....

		moverect P_ContentRect,tmprect
		lda vert
		bne SendBackV

		moveword NewPt,tmprect
		inc a
		sta tmprect+4

		bra SendIt

SendBackV	moveword NewPt+2,tmprect+2
		inc a
		sta tmprect+6

SendIt	tool _EraseRect,in=(!tmprect:l)
		tool _InvalRect,in=(!tmprect:l)
		brl exit


DrawIt
		cmpl OldPt,#-1
		bne Clipped

		tool _SetPenMode,in=(#modeCOPY:w)

Clipped	lda vert
		bne ShowV

		tool _MoveTo,in=(P_VRulRect+2:w,NewPt:w)
		tool _LineTo,in=(P_ContentRect+6:w,NewPt:w)
		bra Exit

ShowV
		tool _MoveTo,in=(NewPt+2:w,#0:w)
		tool _LineTo,in=(NewPt+2:w,P_ContentRect+4:w)

exit	_PenNormal

		return
		ENDP







;---------------------------------------------------------------------------
;
; P_SetGuides 
;
;		   1 = OK, 2 = Cancel
;
;		   4 = LR LineEdit
;		   5 = TB LineEdit
;		   6 = Col LineEdit
;		   7 = CS LineEdit
;
;		   8 = LR  0.25 inch
;		   9 =	 0.5 inch
;		  10 =	 LE control
;
;		  12 = TB  0.25 inch
;		  13 =	 0.5 inch
;		  14 =	 LE control
;
;		  16 = Col 1
;		  17 =	 2
;		  18 =	 LE control
;
;		  20 = CS  0.25 inch
;		  21 =	 0.5 inch
;		  22 =	 LE control
;
;		  24-27 Static Q_Text

P_SetGuides	PROC		EXPORT
			;Using P_Data
		local result:w,TheDlog:l,anItem:w,ptr:l,hdl:l
		local vert:l,horz:l,tmp:l
		local vfrac:l,hfrac:l,cols:w
		local colspace:w,colwidth:w,margwidth:w
		local str:r,inches:l
		begin +b

		; Dialog item #'s
LRLE	equ 4
TBLE	equ 5
ColLE	equ 6
CSLE	equ 7
LR1	equ 8
LR2	equ 9
LR3	equ 10
TB1	equ 12
TB2	equ 13
TB3	equ 14
Col1	equ 16
Col2	equ 17
Col3	equ 18
CS1	equ 20
CS2	equ 21
CS3	equ 22

FirstStat	equ 24
LastLE	equ 7
		jsl	D_UseStdColors

		call D_GetNewModalDialog,in=(#P_SGuideDlog:l),out=(TheDlog:l)
		; set defaults according to print record ??

		movelong P_PrintHand,tmp
		movelong [tmp],ptr
		moveword [ptr]:#4,vert
		moveword [ptr]:#6,horz

		subword P_PageRect,P_PaperRect,tmp
		tool _FixDiv,in=(tmp:w,#0:w,vert:w,#0:w),out=(vfrac:l)

		subword P_PageRect+2,P_PaperRect+2,tmp
		tool _FixDiv,in=(tmp:w,#0:w,horz:w,#0:w),out=(hfrac:l)


		; Now check horz and vert to see if they are .25 or .5"
		; if so, D_Activate the appropriate control.  If not, set
		; the Q_Text to reflect the real page Q_Rect & D_Activate the
		; LE's ctl.

		; horizontal

		cmpl hfrac,#$00004000
		beq DoHQuarter

		cmpl hfrac,#$00008000
		beq DoHHalf

DoHLE	call Fix2Asc,in=(hfrac:l,!str:l)
		tool _SetIText,in=(TheDlog:l,#LRLE:w,!str:l)
		tool _SetDItemValue,in=(#1:w,TheDlog:l,#LR3:w)
		tool _SelIText,in=(TheDlog:l,#LRLE:w,#0:w,#4:w)
		bra DidH
DoHQuarter	tool _SetDItemValue,in=(#1:w,TheDlog:l,#LR1:w)
		bra DoneH
DoHHalf	tool _SetDItemValue,in=(#1:w,TheDlog:l,#LR2:w)

DoneH	tool _SelIText,in=(TheDlog:l,#LRLE:w,#4:w,#4:w)
DidH
		; vertical

		cmpl vfrac,#$00004000
		beq DoVQuarter

		cmpl vfrac,#$00008000
		beq DoVHalf

DoVLE	call Fix2Asc,in=(vfrac:l,!str:l)
		tool _SetIText,in=(TheDlog:l,#TBLE:w,!str:l)
		tool _SetDItemValue,in=(#1:w,TheDlog:l,#TB3:w)
		bra DoneV
DoVQuarter	tool _SetDItemValue,in=(#1:w,TheDlog:l,#TB1:w)
		bra DoneV
DoVHalf	tool _SetDItemValue,in=(#1:w,TheDlog:l,#TB2:w)

DoneV

Loop	tool _ModalDialog,in=(#D_DecimalOnly+$80000000:l),out=(result:w)
		beq Loop

		cmp #OK
		beq Add
		cmp #Cancel
		jeq QuitDlog

		cmp #LastLE+1
		blt Loop
		cmp #FirstStat
		bge Loop

		tool _SetDItemValue,in=(#1:w,TheDlog:l,result:w)

		cmpw result,#LR3
		beq LEActive
		cmp #TB3
		beq LEActive
		cmp #Col3
		beq LEActive
		cmp #CS3
		beq LEActive
		bra Loop

;		 ; 4 rctl's w/ LE's need to D_Activate that LE if selected!
;		   10 -> 4, 14 -> 5, 18 -> 6, 22 -> 7.
;
LEActive	lsr a
		inc a
		lsr a
		inc a
		sta anItem

		tool _SelIText,in=(TheDlog:l,anItem:w,#0:w,#4:w)

		bra Loop

;		 ; Add necessary guides, after deleting old marked guides
Add	call P_KillOldGuides

		; Top Margin
		tool _GetDItemValue,in=(TheDlog:l,#TB1:w),out=(a:w)
		beq Ck5TopB
		movelong #$00004000,inches			  ; 1/4"
		bra DoTopB

Ck5TopB	tool _GetDItemValue,in=(TheDlog:l,#TB2:w),out=(a:w)
		beq CkLETopB
		movelong #$00008000,inches			  ; 1/2"
		bra DoTopB

CkLETopB	tool _GetIText,in=(TheDLog:l,#TBLE:w,!str:l)
		call Asc2Fix,in=(!str:l),out=(inches:l)
		bcs Margins

DoTopB	lda P_HorizGCount
		bne GotNewH

		call D_NeedHand,in=(#4:l),out=(P_HorizGuides:l)

GotNewH	spacelong
		pushfixword vert
		pushlong inches
		_FixMul
		rcall P_Fix2Int,in=(s:ax),out=(vert:a)

		in a:w,P_HorizGuides:l,P_HorizGCount:w,#MargGuide:w
		out P_HorizGCount:w
		xcall P_AddGuide

		; Bottom Margin
		subword P_PaperRect+4,vert,a
		in a:w,P_HorizGuides:l,P_HorizGCount:w,#MargGuide:w
		out P_HorizGCount:w
		xcall P_AddGuide



		; Left Margin
Margins	tool _GetDItemValue,in=(TheDlog:l,#LR1:w),out=(a:w)
		beq Ck5LR
		movelong #$00004000,inches			  ; 1/4"
		bra DoLR

Ck5LR	tool _GetDItemValue,in=(TheDlog:l,#LR2:w),out=(a:w)
		beq CkLELR
		movelong #$00008000,inches			  ; 1/2"
		bra DoLR

CkLELR	tool _GetIText,in=(TheDLog:l,#LRLE:w,!str:l)
		call Asc2Fix,in=(!str:l),out=(inches:l)
		bcs Columns

DoLR	lda P_VertGCount
		bne GotNewV

		call D_NeedHand,in=(#4:l),out=(P_VertGuides:l)

GotNewV	spacelong
		pushfixword horz
		pushlong inches
		_FixMul
		rcall P_Fix2Int,in=(s:ax),out=(margwidth:a)
		and #$FFFE
		in a:w,P_VertGuides:l,P_VertGCount:w,#MargGuide:w
		out P_VertGCount:w
		xcall P_AddGuide

		; Right Margin
		subword P_PaperRect+6,margwidth,a
		and #$FFFE
		in a:w,P_VertGuides:l,P_VertGCount:w,#MargGuide:w
		out P_VertGCount:w
		xcall P_AddGuide

		; Column guides....
Columns	tool _GetDItemValue,in=(TheDlog:l,#Col1:w),out=(a:w)
		jne QuitDlog					; w/ 1 col, no col-guides necess

Ck2Col	tool _GetDItemValue,in=(TheDlog:l,#Col2:w),out=(a:w)
		beq CkLECol
		moveword #2,cols
		bra DoCol

CkLECol	tool _GetIText,in=(TheDLog:l,#ColLE:w,!cols:l)
		tool _Dec2Int,in=(!cols+1:l,#1:w,#0:w),out=(cols:w)
		jcs QuitDlog

DoCol	tool _GetDItemValue,in=(TheDlog:l,#CS1:w),out=(a:w)
		beq Ck5CW
		movelong #$00004000,inches			  ; 1/4"
		bra DoCW

Ck5CW	tool _GetDItemValue,in=(TheDlog:l,#CS2:w),out=(a:w)
		beq CkLECW
		movelong #$00008000,inches			  ; 1/2"
		bra DoCW

CkLECW	tool _GetIText,in=(TheDLog:l,#CSLE:w,!str:l)
		call Asc2Fix,in=(!str:l),out=(inches:l)
		jcs QuitDlog

DoCW	spacelong
		pushfixword horz
		pushlong inches
		_FixMul

		rcall P_Fix2Int,in=(s:ax),out=(colspace:a)

		; colwidth = (pagewidth - 2*marginwidth - (cols-1)*colspace) / cols.
		lda margwidth
		asl a
		sta tmp
		subword P_PaperRect+6,tmp,tmp
		lda cols
		dec a
		rcall D_FastMult,in=(a:x,colspace:y),out=(tmp+2:a)
		subword tmp,tmp+2,tmp
		tool _UDivide,in=(tmp:w,cols:w),out=(y:w,colwidth:w)

		moveword margwidth,tmp

ColLoop	dec cols
		beq QuitDlog

		addword tmp,colwidth,tmp
		and #$FFFE

		in a:w,P_VertGuides:l,P_VertGCount:w,#ColGuide:w
		out P_VertGCount:w
		xcall P_AddGuide

		addword tmp,colspace,tmp
		and #$FFFE

		in a:w,P_VertGuides:l,P_VertGCount:w,#ColGuide:w
		out P_VertGCount:w
		xcall P_AddGuide

		bra ColLoop

QuitDlog	call D_CloseDialog,in=(TheDlog:l)
		cmpw result,#Cancel
		beq exit

		call P_MergeGuides
		tool _EraseRect,in=(#P_ContentRect:l)
		tool _InvalRect,in=(#P_ContentRect:l)

exit	return
		ENDP






;---------------------------------------------------------------------------
;
; P_KillOldGuides 
;

P_KillOldGuides	PROC		EXPORT
			;Using P_Data

		local array:l,count:w,offset:w
		begin


		lda P_VertGCount
		jeq DoHoriz

		rcall D_Deref,in=(P_VertGuides:ax),out=(array:ax)
		moveword P_VertGCount,count
		dec a
		asl a
		asl a
		ina
		ina
		sta offset

KillVLoop	cmpw [array]:offset,#RulerGuide
		bne KillV

		subword offset,#4,offset
		bra ContV

KillV	rcall D_UnLock,in=(P_VertGuides:ax)			   ; ick!!!

		dec offset
		dec offset
		in P_VertGuides:l,offset:w,#1:w,#4:w,P_VertGCount:w
		xcall P_DeleteData

		rcall D_Deref,in=(P_VertGuides:ax),out=(array:ax) ; doubly so.

		dec P_VertGCount
		dec offset
		dec offset

ContV	lda offset
		bpl KillVLoop

		rcall D_UnLock,in=(P_VertGuides:ax)

		lda P_VertGCount
		bne DoHoriz

		tool _DisposeHandle,in=(P_VertGuides:l)

		stzl P_VertGuides


DoHoriz	lda P_HorizGCount
		jeq exit

		rcall D_Deref,in=(P_HorizGuides:ax),out=(array:ax)
		moveword P_HorizGCount,count
		dec a
		asl a
		asl a
		ina
		ina
		sta offset


KillHLoop	cmpw [array]:offset,#RulerGuide
		bne KillH

		subword offset,#4,offset

		bra ContH

KillH	rcall D_UnLock,in=(P_HorizGuides:ax)			  ; ick!!!

		dec offset
		dec offset
		in P_HorizGuides:l,offset:w,#1:w,#4:w,P_HorizGCount:w
		xcall P_DeleteData

		rcall D_Deref,in=(P_HorizGuides:ax),out=(array:ax) ; doubly so.

		dec P_HorizGCount
		dec offset
		dec offset

ContH	lda offset
		bpl KillHLoop

		rcall D_UnLock,in=(P_HorizGuides:ax)

		lda P_HorizGCount
		bne exit

		tool _DisposeHandle,in=(P_HorizGuides:l)

		stzl P_HorizGuides

exit	return
		ENDP



;---------------------------------------------------------------------------
;
; P_ExplodeRect(pt:l,recptr:l)   pt is in D_PL coords.
;

P_ExplodeRect	PROC		EXPORT
			;Using P_Data

		input pt:l,rectptr:l
		local ptr:l,hdl:l,tmppt:l
		error err
		begin

		moveword #1,err

		rcall P_Local2PL,in=(P_PageRect:ax),out=(tmppt:ax)
		subword pt,tmppt,a
		jmi quit
		subword pt+2,tmppt+2,a
		jmi quit

		rcall P_Local2PL,in=(P_PageRect+4:ax),out=(tmppt:ax)
		subword tmppt,pt,a
		jmi quit
		jeq quit
		cmp P_DefSize
		jlt quit

		subword tmppt+2,pt+2,a
		jmi quit
		jeq quit

DoTop	in P_AllHGuides:l,P_AllHGCount:w,pt:w,#-1:w,#-1:w
		out [rectptr]:w
		xcall P_ExplodeGuide
		bcc DoBottom

		cmpw pt,P_PageRect
		jlt quit
		moveword P_PageRect,[rectptr]

DoBottom	in P_AllHGuides:l,P_AllHGCount:w,pt:w,#-1:w,#1:w
		out [rectptr]:#4:w
		xcall P_ExplodeGuide
		bcc DoLeft

		cmpw P_PageRect+4,pt
		jlt quit
		subword P_PageRect+4,#1,[rectptr]:#4

DoLeft	in P_AllVGuides:l,P_AllVGCount:w,pt+2:w,#-1:w,#-1:w
		out [rectptr]:#2:w
		xcall P_ExplodeGuide
		bcc DoRight

		cmpw pt+2,P_PageRect+2
		jlt quit
		moveword P_PageRect+2,[rectptr]:#2

DoRight	in P_AllVGuides:l,P_AllVGCount:w,pt+2:w,#-1:w,#1:w
		out [rectptr]:#6:w
		xcall P_ExplodeGuide
		bcc exit

		cmpw P_PageRect+6,pt+2
		blt quit
		subword P_PageRect+6,#4,[rectptr]:#6

exit	stz err
		ldy #6
		addword [rectptr]:y,#2,[rectptr]:y
		ldy #4
		addword [rectptr]:y,#1,[rectptr]:y

quit	return
		ENDP
		END

