load 'macros.dump' include 'driver.equ' include 'pl.equ' ;----------------------------------------------- ; ; Imported addresses ; ;----------------------------------------------- IMPORT X_CopyOneHandle IMPORT D_Deref IMPORT Local2TextObj IMPORT P_ContentRect IMPORT P_DrawATab IMPORT P_HRulRect IMPORT P_PL2Local IMPORT P_PortRect IMPORT P_Traverse IMPORT P_VRulRect IMPORT P_VisRuler IMPORT D_Set4Pat IMPORT T_ChangeRuls IMPORT T_DotObj IMPORT T_DotParag IMPORT T_Editing IMPORT T_GetParPtr IMPORT TextObj2Local IMPORT D_UnLock ;----------------------------------------------- ; ; Forward addresses and entries ; ;----------------------------------------------- ENTRY P_DragTab ENTRY P_DrawTabwell ;--------------------------------------------------------------------------- ; ; P_EraseTabs ; ; erase all of the tabs P_EraseTabs PROC EXPORT ;Using P_Data ;Using P_RulerData local tmprect:r begin lda P_VisRuler beq Exit call D_Set4Pat,in=(#LightYellow:w) moveword #P_TabWBottom-6,tmprect moveword #P_TabWBottom-1,tmprect+4 moveword P_ContentRect+2,tmprect+2 moveword P_ContentRect+6,tmprect+6 tool _ClipRect,in=(!tmprect:l) tool _PaintRect,in=(!tmprect:l) _PenNormal tool _ClipRect,in=(#P_ContentRect:l) Exit RETURN ENDP ;--------------------------------------------------------------------------- ; ; P_EraseTabwell ; P_EraseTabwell PROC EXPORT ;Using P_Data ;Using P_RulerData local tmprect:r begin lda P_VisRuler beq Exit call D_Set4Pat,in=(#LightYellow:w) moveword #P_TabWTop,tmprect moveword P_VRulRect+2,tmprect+2 moveword #P_TabWBottom-1,tmprect+4 subword P_VRulRect+6,#2,tmprect+6 tool _ClipRect,in=(!tmprect:l) tool _PaintRect,in=(!tmprect:l) _PenNormal tool _ClipRect,in=(#P_ContentRect:l) Exit RETURN ENDP ;--------------------------------------------------------------------------- ; ; P_HideTabs (erase the Tabwell and any active tabs) ; P_HideTabs PROC EXPORT call P_EraseTabwell call P_EraseTabs rtl ENDP ;--------------------------------------------------------------------------- ; ; P_DrawTabs ; P_DrawTabs PROC EXPORT ;Using P_RulerData ;Using P_Data ;Using T_Data ;Using T_TextEqu local count:w,ptr:l,offset:w,tmp:l,objhdl:l,hoffset:w local rulerhdl:l begin lda P_VisRuler jeq exit lda T_Editing jeq exit rcall T_GetParPtr,in=(T_DotParag:a),out=(ptr:ax) movelong [ptr]:#T_RulerHdl,RulerHdl rcall D_Deref,in=(RulerHdl:ax),out=(ptr:ax) cmpw [ptr]:#T_TabCount,#P_MaxTabcount bge DidTabwell call P_DrawTabwell DidTabwell tool _ClipRect,in=(#P_HRulRect:l) moveword [ptr]:#T_TabCount,count addwl #T_Indent,ptr stz offset tabloop pushlong #-1 call TextObj2Local,in=([ptr]:offset:w,#0:w),out=(:w,y:w) pushword #P_HRulTop+P_HRulWdth-6 inc offset inc offset pushword [ptr]:offset call P_DrawATab,in=(:l,:l,:w) addword offset,#2,offset dec count bpl tabloop tool _ClipRect,in=(#P_ContentRect:l) rcall D_UnLock,in=(RulerHdl:ax) exit return ENDP ;--------------------------------------------------------------------------- ; ; P_DrawTabwell () ; P_DrawTabwell PROC EXPORT ;Using P_RulerData ;Using P_Data ;Using T_Data ;Using T_TextEqu begin tool _ClipRect,in=(#P_PortRect:l) ; Draw the 3 in the Tabwell. addword P_VRulRect+2,#8,a and #$FFFE call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_LeftTab:w) addword P_VRulRect+2,#18,a and #$FFFE call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_DecimalTab:w) addword P_VRulRect+2,#28,a and #$FFFE call P_DrawATab,in=(#-1:l,a:w,#P_TabWTop+5:w,#P_RightTab:w) tool _ClipRect,in=(#P_ContentRect:l) RETURN ENDP ;--------------------------------------------------------------------------- ; ; P_MoveTabs (Pt:l) : Moved:w ; ; pt is local P_MoveTabs PROC EXPORT ;Using T_Data ;Using P_Data ;Using T_TextEqu ;Using P_ObjData ;Using P_RulerData input ThePt:l output moved:w local ParagPtr:l,RulerHdl:l,RulerPtr:l local TabsHdl:l,TabsPtr:l,TabArray:l,TabType:w local tmprect:r,tabcount:w,tmp:l,ptr:l local tmptab:l,tmpptr:l,arrayhdl:l,hoffset:w local leftside:w,rightside:w,offset:w error err begin moverect P_ContentRect,tmprect moveword P_PortRect,tmprect moveword P_VRulRect+2,tmprect+2 tool _ClipRect,in=(!tmprect:l) stz moved rcall T_GetParPtr,in=(T_DotParag:a),out=(ParagPtr:ax) movelong [ParagPtr]:#T_RulerHdl,RulerHdl call X_CopyOneHandle,in=(RulerHdl:l),out=(TabsHdl:l) rcall D_Deref,in=(TabsHdl:ax),out=(TabsPtr:ax) moveword [TabsPtr]:#T_TabCount,tabcount addlong #T_Indent,TabsPtr,TabArray call TextObj2Local,in=(#0:w,#0:w),out=(leftside:w,y:w) bpl DoRightSide moveword #0,leftside DoRightSide movelong T_DotObj,tmp movelong [tmp],ptr rcall P_PL2Local,in=([ptr]:#P_RLeft:x) call Local2TextObj,in=(x:w,#0:w),out=(hoffset:w,a:w) rcall P_PL2Local,in=([ptr]:#P_RRight:x),out=(a:x) and #$FFFE sta rightside movelong !tabarray,arrayhdl ; Check for D_MouseDown in tab-Q_Rect moverect P_HRulRect,tmprect moveword #10,tmprect tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w) jeq CkTabwell ; See if mouse was down on a tab call Local2TextObj,in=(ThePt:l),out=(ThePt:l) subword ThePt+2,#4,tmp lda tabcount ina sta tmp+2 in arrayhdl:l,tmp:w,#4:w,tmp+2:w out offset:w xcall P_Traverse lsr a lsr a cmp tmp+2 jge Exit movelong [tabarray]:offset,tmptab addword #5,ThePt+2,a and #$FFFE cmp tmptab jlt Exit ; Foundit!! lda offset bne DoNormTab lda tabcount beq CheckMax ; use the first tab as the rightmost bounds. call TextObj2Local,in=([tabarray]:#4:w,#0:w),out=(a:w,y:w) subword a,#P_MinTabDist,rightside CheckMax cmpw P_ContentRect+6,rightside bge CheckMin sta rightside CheckMin cmpw P_ContentRect+2,leftside blt DoOldDrag sta leftside bra DoOldDrag DoNormTab addlong a,tabarray,ptr addlong ptr,#4,s pushlong ptr lda Tabcount asl a asl a pushword #0 subword a,offset,s _BlockMove dec TabCount addword P_VRulRect+2,#2,leftside subword P_ContentRect+6,#2,rightside DoOldDrag call TextObj2Local,in=(tmptab:w,#0:w),out=(ThePt:l) moveword #P_TabWBottom-6,ThePt ; Erase the old one... call P_DrawATab,in=(ThePt:l,#-1:l,#0:w) moveword tabcount,tmp lda offset not a in a:w,leftside:w,rightside:w,ThePt:l in tabarray:l,tabcount:w,tmptab+2:w out tabcount:w xcall P_DragTab lda tabcount cmp #P_MaxTabCount-1 bne NoDraw cmp tmp bne NoDraw call P_DrawTabwell ; We've removed the 10th tab NoDraw brl DoStore CkTabwell cmpw tabcount,#P_MaxTabCount jge Exit addword P_VRulRect+2,#2,leftside subword P_ContentRect+6,#2,rightside moveword P_HRulRect,tmprect moveword P_VRulRect+2,tmprect+2 movelong P_ContentRect,tmprect+4 tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w) jeq Exit moveword #2,tmprect moveword #11,tmprect+4 addword P_VRulRect+2,#3,tmprect+2 addword P_VRulRect+2,#13,tmprect+6 tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w) beq CkDec moveword #P_LeftTab,TabType bra DoDrag CkDec moveword tmprect+6,tmprect+2 addword P_VRulRect+2,#23,tmprect+6 tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w) beq CkRight moveword #P_DecimalTab,TabType bra DoDrag CkRight moveword tmprect+6,tmprect+2 addword P_VRulRect+2,#33,tmprect+6 tool _PtInRect,in=(!ThePt:l,!tmprect:l),out=(a:w) beq Exit moveword #P_RightTab,TabType DoDrag in #0:w,leftside:w,rightside:w,ThePt:l in tabarray:l,tabcount:w,TabType:w out a:w xcall P_DragTab cmp tabcount beq Exit sta tabcount DoStore moveword tabcount,[TabsPtr]:#T_Tabcount inc moved cmpw tabcount,#P_MaxTabcount blt StillThere call P_EraseTabwell StillThere tool _ClipRect,in=(#P_ContentRect:l) movelong [RulerHdl],RulerPtr ldy #T_Indent cmpw [RulerPtr]:y,[TabsPtr]:y beq ChTabs call T_ChangeRuls,in=(#T_ChangeIndent:w,[TabsPtr]:#T_Indent:w,#0:l) bra Exit ChTabs call T_ChangeRuls,in=(#T_ChangeTabs:w,#0:w,TabsHdl:l) Exit tool _DisposeHandle,in=(TabsHdl:l) tool _ClipRect,in=(#P_ContentRect:l) return ENDP ;--------------------------------------------------------------------------- ; ; P_DragTab ; P_DragTab PROC EXPORT ;Using P_RulerData ;Using P_Data ;Using T_Data ;Using T_TextEqu input izitindent:w,minhorz:w,maxhorz:w,oldpt:l input array:l,count:w,type:w output newcount:w local ThePt:l,TabPt:l,arrayhdl:l,tmprect:r local offset:w,ptr:l,tmp:l begin moveword count,newcount movelong !array,arrayhdl _HideCursor moveword #-50,oldpt dragloop tool _GetMouse,in=(!ThePt:l) lda ThePt+2 bpl CheckMax lda #0 CheckMax cmp maxhorz blt CheckMin moveword maxhorz,ThePt+2 CheckMin cmp minhorz bge DoConvert moveword minhorz,ThePt+2 DoConvert jsr FixPt call Local2TextObj,in=(ThePt:l),out=(TabPt:l) lda izitindent bne DrawIt cmpw #P_TabWBottom-6,ThePt ; Not in the ruler. bne DrawIt ; Do nearness checking for other tabs, incl indent lda TabPt+2 ; Not in the textobj bmi DrawIt DoSearch addword count,#1,tmp+2 subword TabPt+2,#P_MinTabDist,tmp in arrayhdl:l,tmp:w,#4:w,tmp+2:w out offset:w xcall P_Traverse lsr a lsr a cmp tmp+2 bge DrawIt subword [array]:offset,TabPt+2,a abs a cmp #P_MinTabDist bge DrawIt movelong oldpt,ThePt ; There's a tab to the right bra D_SkipIt DrawIt cmpl ThePt,oldpt beq ContLoop call P_DrawATab,in=(oldpt:l,ThePt:l,type:w) ContLoop movelong ThePt,oldpt D_SkipIt tool _StillDown,in=(#0:w),out=(a:w) jne dragloop call Local2TextObj,in=(ThePt:l),out=(TabPt:l) ; Check to see if it's in a valid location & accept or reject it. lda izitindent beq CkValid moveword TabPt+2,[array] brl Accept CkValid lda TabPt+2 ; if it's to the left of the obj. jmi Reject cmpw #P_TabWBottom-6,ThePt ; if it's out of the ruler. jne Reject cmpw TabPt+2,[array] ; It's to the left of the indent jlt Reject subword a,#P_MinTabDist,tmp ; In the indent's 'space' jmi Reject ; See if it's on top of another tab's space (incl the indent). addword count,#1,tmp+2 in arrayhdl:l,tmp:w,#4:w,tmp+2:w out offset:w xcall P_Traverse lsr a lsr a cmp tmp+2 ; It's the last tab. bge DoInsert subword [array]:offset,TabPt+2,a abs a cmp #P_MinTabDist blt Reject ; There's a tab too D_Close ; insert it. DoInsert inc newcount in arrayhdl:l,TabPt+2:w,#4:w,newcount:w out a:w xcall P_Traverse bne DoMove lda #4 DoMove sta offset addlong a,array,ptr pushlong ptr addlong #4,ptr,s pushword #0 lda newcount asl a asl a subword a,offset,s _BlockMove moveword TabPt+2,[ptr] moveword type,[ptr]:#2 bra accept Reject call P_DrawATab,in=(ThePt:l,#-50:w,#-50:w,type:w) bra exit Accept call P_DrawATab,in=(ThePt:l,#-1:l,type:w) moverect P_ContentRect,tmprect stz tmprect tool _ClipRect,in=(!tmprect:l) call P_DrawATab,in=(#-1:l,ThePt:l,type:w) exit _ShowCursor return ;------------------------ ; FixPt ; FixPt lda ThePt+2 and #$FFFE sta ThePt+2 lda izitindent bne FixDrag lda ThePt bpl CkVert stz ThePt CkVert subword ThePt,#3,a bmi FixDrag cmp P_HRulRect+4 bge GotIt FixDrag moveword #P_TabWBottom-6,ThePt GotIt rts ENDP END