mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-24 17:32:59 +00:00
15505 lines
563 KiB
Plaintext
15505 lines
563 KiB
Plaintext
;
|
|
; File: TextEdit.a (formerly te68k.a)
|
|
;
|
|
; Contains: TextEdit for ROM or (when included in TextEditPatch.a) 'ptch' 0
|
|
;
|
|
; Written by: SC Steve Capps
|
|
; EHB Ernie Beernink
|
|
; MBK Margie Kaptanoglu
|
|
; RWW Russ Wetmore
|
|
; SMB Sue Bartalo
|
|
; YS Yishai Steinhart (most recently)
|
|
;
|
|
; Copyright: © 1982-1993 by Apple Computer, Inc., all rights reserved.
|
|
;
|
|
; Change History (most recent first):
|
|
;
|
|
; <SM9> 10/12/93 RC Stop using A6 in the DefClikProc callback. Instead grad the
|
|
; teHandle from a RecoverHandle on the tePtr
|
|
; <SM8> 6/28/93 kc Init TEDoText,TERecal and TEWdBreak at TEGlobalInit time so work
|
|
; around a QuickTime bug. (Movies containing text as StartupItems)
|
|
; <SM7> 10/22/92 CSS Change some branch short instructions to word branches.
|
|
; <SM6> 10/6/92 PN # 1040150 Get rid of Sysvers conditionals and bring the code to
|
|
; the current state (7.1)
|
|
; <50> 8/11/92 SMB #1036481 <gbm>: #1036481 <gbm>: Removed font/keyboard
|
|
; synchronization for Roman-only systems. It's unnecessary and
|
|
; slows things down!
|
|
; <49> 7/15/92 SMB ## <ys>: Renamed DoText selectors: teMark is now teHighlight and
|
|
; teLoc is teCaret.
|
|
; <48> 7/8/92 PKE Fix up previous comment (I was too quick with the Return key).
|
|
; <47> 7/8/92 PKE #1035214 <csd>: Fix DoSearch so that it always exits by calling
|
|
; FreeFmtOrderArray at exit, which will dispose of any fmtOrdering
|
|
; handle and clear the ExpandMemRec.emFmtOrderHFlag flag which
|
|
; says that the handle is valid. This will prevent subsequent
|
|
; calls from thinking they have a valid handle before they
|
|
; actually allocate one.
|
|
; <46> 7/7/92 PKE #1030684 <yds>: TEGetPoint failed in multiline text if a R->L
|
|
; script was present because in this case DoMeasure measured from
|
|
; the beginning of the buffer, not the beginning of the current
|
|
; line. Fixed.
|
|
; <45> 6/23/92 SMB #1029263,<pke>: Now checking the script's 'itlb' flags to
|
|
; determine if the keyboard and font should be synchronized. Added
|
|
; new IM 2nd Ed. routine names to the file for easier searching of
|
|
; routines.
|
|
; <44> 4/27/92 DTY Get rid of hasSplineFonts conditionals.
|
|
; <43> 4/20/92 YS #1027783, a wrong label @1 instead of @3 caused the wrong jump,
|
|
; and the stack was not cleared, causing the registers not to be
|
|
; restored.<43-YDS-4/19/92>
|
|
; <42> 4/3/92 YS #1025998, in TextBox, when trying to find the right line highet
|
|
; in systems that use associated font (see <41>), saving and
|
|
; restoring of the font saves a LONG (instead of a word) creating
|
|
; the problem of loosing the port font. Another connected problem
|
|
; was the way Script Manager handeld those privete verb calls in
|
|
; the roman. This was fixed in the Script Manager. <42-YDS-4/2/92>
|
|
; <41> 2/6/92 YS #1014691, Cube-E, In the old days, the Hebrew/Arabic extention
|
|
; used to calculate the highet of a script font as Max(script font
|
|
; size, associated font size). The problem with that is that if
|
|
; you use style runs, like styled TE & WP's, you can't get the
|
|
; real size of of a script font, and you allways have the
|
|
; associated font size in it. The universal one byte init no
|
|
; longer handles it. TE will calculate it itself if it is: 1)
|
|
; unstyled text. 2) script font. 3) Has associated font (other
|
|
; then 0). <41-YDS-2/6/92>
|
|
; <40> 2/4/92 YS #1015382, Cube-E, don't redraw the whole line for a left 2 right
|
|
; system when justification is teForceLeft. <40-YDS-2/5/92>
|
|
; <39> 1/30/92 YS #1018683, Cube-E: TextBox should handle #teForceLeft correctly
|
|
; and not set it to #teJustLeft allways. <39-YDS-1/30/92>
|
|
; <38> 1/13/92 PKE #1019673, Bruges: Unstyled TE should not sync the keyboard at
|
|
; all for smEastEurRoman script.
|
|
; <37> 12/17/91 PKE #1017647: Fix keyboard synchronization in unstyled one-byte
|
|
; non-Roman text. For bidi scripts: don't synchronize control
|
|
; chars and L-R numbers, set keyboard to Roman for other L-R
|
|
; chars, and sync keyboard to font for R-L chars. For other
|
|
; scripts: sync keyboard to font for script letters, set keyboard
|
|
; to Roman for Roman letters, and don't sync anything else.
|
|
; <36> 12/12/91 DCL #1009157: Changed a Tst to Tst.b so as not to test the potential
|
|
; garbage in the other byte. Changed procedure noClickProc in
|
|
; TextEdit.a, StyledTextEdit.a, and TextEditPatchIIciROM.a
|
|
; <35> 11/12/91 JL fixed the broken build. The previous change had a <34> after an
|
|
; EndIf with no comment marker - - ooops! The build was broken for
|
|
; a day and no one complained.
|
|
; <34> 11/12/91 SMB #1014705 - for CubeE and Bruges. Keyboard and font synch'ing
|
|
; isn't correct for punctuation and numbers: TE allows a Roman
|
|
; keyboard & a non-Roman font combination for ascii characters and
|
|
; european characters (or high ascii chars.) and it should also
|
|
; allow this for numbers and punctuation marks. This was reported
|
|
; against the Eastern European systems. Actually, this code will
|
|
; be optimized to only allow this unsynchronized state for a
|
|
; 2-byte fontScript and a Roman kbd. See ClickKeyboard2Font. Also
|
|
; fixed some bugs in the synchronization of the font & kbd for
|
|
; unstyled text in TEClick and TEKey.
|
|
; <33> 9/30/91 YS Used to syncronize the keyboard wrong for L->R scripts
|
|
; (unstyled) when was backspacing a selection (and not a single
|
|
; delete), d6 wasn't set up corectly. use teSelStart(a3) instead.
|
|
; (bug #1013159) <33-YDS-10/1/91>
|
|
; <32> 9/23/91 PKE For Cube-E (and Bruges): If non-Roman scripts are installed,
|
|
; TEInit should no longer set TESysJust to its idea of system
|
|
; default, since users can now set the default. Also: Define
|
|
; forLocalizability here if it is not defined in BBSStartup.
|
|
; <31> 9/13/91 YS Rolled in the fixes made for SS-6.1.
|
|
; <31p> Fix the wrong placment of the caret for one blinking cycle when
|
|
; changing a language and typing a char. (bug #1006971)
|
|
; <31p-YDS-8/27/91>
|
|
; <31n> when backspacing, sync the keyboard to the right language enen
|
|
; for unstyled (single byte only). (bug #1006972) <31n-YDS-8/27/91>
|
|
; <31m> Fix the Big cursor bug, this is NOT the old big applelink cursor
|
|
; bug (fix YSD <3.1>). In the case where the cursor is on a line
|
|
; start, we used to fall into the single caret code
|
|
; (but we didn't have any split caret !!!), so while switching
|
|
; the cursor rect's for a single caret, we used to garbage the
|
|
; selRect. so, we now test ExpandMemRec.emTwoCursorsFlag in this
|
|
; case to avoid it. (bug #1007065) <31m-YDS-8/27/91>
|
|
; <31l> Fix TEGetPoint for styled TE for R->L scripts, used to asume
|
|
; that if we are on a begining of a style run, the width is 0, and
|
|
; if we are on the end, we should TextWidth all of it, which is
|
|
; not true for R->L scripts. (bug #1007067) <31l-YDS-8/27/91>
|
|
; <31k> Added support for a single caret while handling an Arrow (left
|
|
; or right) key, for styled L->R text. have to change the Keyboard
|
|
; in a different way to support the corect display of a
|
|
; single caret. <31k-YDS-8/27/91>
|
|
; <31j> Fix in xStyleGuts, don't change font's when their are not from the same
|
|
; script, has a minor fix in SetGuts to.(commented) <31j-YDS-8/27/91>
|
|
; <31i> Fix DoMeasure for Right to left text in unstyled TE, in order to
|
|
; support fix <31h> for unstyled, use _Pixel2Char instead of
|
|
; MeasureIt. <31i-YDS-8/27/91>
|
|
; <31h> Fix TEGetPoint Bug for Right to left text, use DoMeasure
|
|
; instead of MeasureIt. <31h-YDS-8/27/91>
|
|
; <31g> Synch Keyboard to click even with an unstyled TE record,
|
|
; this is not only a nice thing to do, but very importent when
|
|
; handling a single cursor on a bi-direction script, if we
|
|
; would like your single-split carret to be displayed
|
|
; correctly. <31g-YDS-8/27/91>
|
|
; <31f> when click on script boundry, take care of the next cursor
|
|
; update, has to do with the split carret stuff. This was fixed
|
|
; in SetKeyboard2Font and ClickKeyboard2Font.<31f-YDS-8/27/91>
|
|
; <31e> find where the click was (to define the right script).<31e-YDS-8/27/91>
|
|
; <31d> Support for a single carret, this supports the styled
|
|
; TE part.<31d-YDS-8/27/91>
|
|
; <31c> Added support for a single carret, it will expand & shrink
|
|
; the the right part of a cursor to show only "one" cursor,
|
|
; depending on the language, so we will gwt a moving cursor
|
|
; (when switching scripts). this supports the unstyled TE part.<31c-YDS-8/27/91>
|
|
; <31b> using the byte after the TwoByteCharBuffer in teDispatchH for
|
|
; fixes <31c> and <31d> (lastScript), so change the place it clears
|
|
; so only a word will be cleared there (instead of a long).<31b-YDS-8/27/91>
|
|
; <31a> Fixing Hebrew/Arabic AppleLink bug that causes a big cursor:
|
|
; the right way! this fix is in four places.<31a-YDS-8/27/91>
|
|
; <30> 4/3/91 SMB jdr,#86089: (also, pke) Fixing appl-crashing bug in
|
|
; NewRomanFindLine - should be clearing the high word of d0 before
|
|
; doing a long operation. Shows up when applications use
|
|
; TEHitTestHook and have multiple styles on a line.
|
|
; <29> 2/14/91 SMB pke,#70628: Unfortunately, forced to remove support for Forward
|
|
; Delete that was added in <20>. Conditionalizing it out so it can
|
|
; be added again later. See <29>.
|
|
; <28> 2/14/91 SMB pke,#82817: After Dark and Chooser string clipping bug -
|
|
; NewRomanFindLine's dependency on _NPixel2Char takes into account
|
|
; the caret width when determining linebreaks. This 1 pixel
|
|
; difference caused strings that were 1 pixel too long to no
|
|
; longer completely display since the linebreak occured in a
|
|
; different place. The problem was that the measurement occured on
|
|
; the character boundary (after the final character of the string)
|
|
; and the leading edge value returned was F. TextEdit deals with
|
|
; these results by backing up one character to guarantee that all
|
|
; characters completely display when drawn. In the case of calling
|
|
; _NPixel2Char this is not necessary since it will still return
|
|
; the correct results and TextEdit will behave correctly based on
|
|
; these results. So, to fix this problem we no longer subtract one
|
|
; for the caret width before calling _(N)Pixel2Char.
|
|
; <27> 2/14/91 SMB pke,#DTS FT: Quit trashing a4 across Hook calls!
|
|
; <26> 2/11/91 SMB pke,#SMB-2/9/91-1: TextEdit didn't always erase characters when
|
|
; deleting them. Another symptom of this same bug is that TextEdit
|
|
; didn't line break at a CR. The problem was that when TE looked
|
|
; ahead for blanks at the end of a line in NewRomanFindLine, it
|
|
; skipped over blanks, CRs and any other character whose value was
|
|
; <=$20. Now it checks each breaking character for a CR and once
|
|
; found, forces a line break there.
|
|
; <25> 2/11/91 SMB jdt,#TEBug.ReCaLines: KanjiTalk bug fix in ReCalLines - need to
|
|
; back up 2 bytes for correct redrawing of double-byte text.
|
|
; <24> 2/11/91 SMB pke,#OYDBB002: Fixed the MathCad (application) bug in
|
|
; NewRomanFindLines by ckecking for a dummy style run at the end
|
|
; of the StyleRun array whose startChar = endChar.
|
|
; <23> 2/1/91 SMB pke,#HIG-JS-048,#81519,#82169: In NewRomanFindLine: testing for
|
|
; a blank at a line break before calling TE's FindWord routine.
|
|
; Fixed problem with styles in balloons: was comparing a final
|
|
; result to the linestart in d6, but it was modified for styles,
|
|
; so needed to compare to actual value saved in lineStart(a6).
|
|
; Fixed performance problem: change in algorithm caused unstyled
|
|
; TE to call TextWidth on the entire document (pinned to each
|
|
; lineStart) when determining line breaks. Major slowdown! Are now
|
|
; calling _NPixel2Char instead of _TextWidth & _Pixel2Char in TE's
|
|
; Pixel2Char routine (TEHitTestHook). Should make TE FAST(er)!
|
|
; Renamed leftSide to leadingEdge in P2CFrame and added
|
|
; WidthRemaining member (see TextEditPriv.a).
|
|
; <22> 1/22/91 SMB (pke) Re-fixing bug #68221. The previous fix required calling
|
|
; OutlineMetrics for the whole font in order to get an ascent &
|
|
; height in TextEdit. This wasn't acceptable due to reformatting
|
|
; problems. So, the code to support OutlineMetrics has been
|
|
; removed and we are now turning off PreserveGlyph before drawing
|
|
; in order to draw squished characters when their ascent or
|
|
; descent is larger than the font's metrics. GetFontInfo will
|
|
; still be used to get ascent & height, as in the past, and we
|
|
; will be backwards compatible although not pretty.
|
|
; <21> 1/18/91 SMB (pke) Fixed bug # 62963 - No longer preserving a3/a4 across
|
|
; DumpBuffer routine. Saving a3 caused a dangling ptr and it's not
|
|
; necessary to save a4. Also, added a call to DumpBuffer in
|
|
; TEDispose in case an app never calls TEIdle (which empties the
|
|
; buffer). Changed _NewHandle call in GetHandle to allocate the
|
|
; handle in the System heap in order to prevent orphaning the
|
|
; handle when an application quit without emptying the text
|
|
; buffer. • Also fixed a linebreaking bug in Pixel2Char - wasn't
|
|
; calling DoubleByte with the correct offset (was using the offset
|
|
; for the line not the offset w/in the whole text buffer thus
|
|
; far.)
|
|
; <20> 1/14/91 SMB (jdt) • Fixed bug #66732 & #57858: if the scrap handle parameter
|
|
; (newStyles) in SetStylScrap was NIL should do nothing and exit.
|
|
; • Fixed bug #58512: Must lock scrap handle in InsRsrved before
|
|
; calling PstStylGuts since PstStylGuts expects to use the handle
|
|
; again after moving memory. Also fixes bug #65043. • Fixed bug
|
|
; #77962: TE was determining line breaks by measuring words rather
|
|
; than style runs for a Roman-only system. This was causing
|
|
; drawing to be significantly different than the measuring when
|
|
; FractEnable was on or a scaled font was used. Rewrote code (now
|
|
; called NewRomanFindLine) to do the right thing! • fjs fixed bug
|
|
; #70628: adding forwardDeleteChar support in TEKey so that this
|
|
; function key on the extended keyboard works. • Fixed bug #67699:
|
|
; StdTxMeas did not detect overflow when measuring long lines, so
|
|
; the widths returned to TE in this case were small, causing TE to
|
|
; write all the text on one line. StdTxMeas was modified to keep
|
|
; the last count and width before the overflow. This info is used
|
|
; to call _Pixel2Char to get the correct character offset for line
|
|
; breaking. • Fixed bug #66900: TextBox did not clip text
|
|
; correctly for long words due to the incorrect use of _P2C's
|
|
; LeadingEdge flag. See changes in TE's P2C and DoSearch. • Fixed
|
|
; bug #68221: did not calculate the ascent & descent of an outline
|
|
; font correctly if preserveGlyph is true. Now calling
|
|
; OutlineMetrics for this. See routine GetOutlineMetrics and the
|
|
; routines calling it, TextBox & GetSize. • Fixed Finder bugs
|
|
; #80728 & 75607: in StdEntry, for unstyled text, save the
|
|
; grafport's font info before setting the TERec's style info into
|
|
; the grafport.
|
|
; <19> 12/15/90 SMB (gbm) KT bug: Only draw line in ReCalLines when wordRedraw is <1.
|
|
; Added support for another gestalt selector, gestaltTE5, for the
|
|
; new TextWidthHook.
|
|
; <18> 10/30/90 SMB Fix text buffering bugs: must preserve register containing
|
|
; ExpandMem ptr around a call to another procedure. Also, moved
|
|
; code that dumps the buffer in SetFont2Keyboard after determing
|
|
; that synchronizing was necessary. Then, must test for an empty
|
|
; buffer in TEBufferText after the SetFont2Keyboard call and after
|
|
; a full buffer has been dumped. Using hasBufferingFix conditional
|
|
; for these changes. Added TextWidthHook to dispatch table and the
|
|
; internal interface which uses the hook, TETextWidthHook to hook
|
|
; out the TextWidth calls to keep our developers happi(er)!.
|
|
; Renamed nTEWidthHook to ScriptChar2Pixel. Using hasTextWidthHook
|
|
; conditional for these changes. Moved frame for TextBox into
|
|
; TextEditPriv.a Added teFUseTextServices to comment although TE
|
|
; doesn't use it. This allows an application to disable inline
|
|
; input. The teFInlineInput bit will be used to enable the
|
|
; features added for Inline Input. This bit is set by the inline
|
|
; input service and may also be set by a developer who desires
|
|
; these features even when inline input is inactive.
|
|
; <17> 9/13/90 BG Removed <15>. 040s are behaving more reliably now.
|
|
; <16> 9/11/90 SMB Fix teCROnly bug that crashes the system: pre-incrementing
|
|
; caused us to compare one too many in the text and then the +1 to
|
|
; point beyond the CR caused the line breaks to be one off. Moved
|
|
; InlineInput test into TESetSelect instead of ClickKeyboard,
|
|
; since never want to call KeyScript while doing inline. If in
|
|
; Inline, then not hilighting to the EOLs anymore, only to edge of
|
|
; text (see InvrtRectangle). Modified highlighting code to modify
|
|
; the middle rectangle line by line in order to call highHook for
|
|
; Inline. Moved HiliteFrame into TextEditPriv.a.
|
|
; <15> 7/25/90 BG Added some EclipseNOPs for flakey 040s.
|
|
; <14> 7/25/90 SMB NEEDED for SS-6.0.5, SIXPACK & 7.0: Fixed Hebrew/Arabic
|
|
; scrolling down bug - caused selRect's top & bottom values to be
|
|
; negative which caused a BIG caret to be drawn. Fixed in
|
|
; CaretInsideRun.
|
|
; <13> 7/10/90 SMB NEEDED for 7.0 & SIXPACK: Must export GestaltTEVersion.
|
|
; <12> 7/10/90 SMB NEEDED for 7.0 & SIXPACK: Oops! Moved GestaltTEVersion back into
|
|
; here for SIXPACK+ builds from TextEditInit.a.
|
|
; <11> 6/22/90 SMB NEEDED for 7.0 & SIXPACK: Moved TEGlobalInit, GestaltTEVersion
|
|
; and its vectors to TextEditInit.a. Exported routine labels for
|
|
; TextEditInit.a. NEEDED for SS-6.0.5, SIXPACK & 7.0: fixed Arabic
|
|
; line end bug for unstyled text, where the system slowed down
|
|
; because was reading off the end of the line starts.
|
|
; <10> 6/11/90 SMB NEEDED FOR SIXPACK & 7.0: Added Inline Input bit to
|
|
; TEFeatureFlag and support for it in ClickKeyboard2Font.
|
|
; <9> 5/29/90 DDG NEEDED FOR SIXPACK: Changed all the sixpack conditionals from
|
|
; six-point-oh-seven to six-point-oh-six.
|
|
; <8> 4/27/90 SMB NEEDED for SIXPACK - Fixed old bug for old FindWord: when using an
|
|
; application's teWordBreak routine must save d1!
|
|
;*********** End of SS-6.0.4 f4 (for KanjiTalk 6.0.4 only!) changes ******************************************************
|
|
; <7> 3/20/90 SMB NEEDED for 6.0.5 and SS-6.0.4 - Added call to SetKeyboard2Font
|
|
; in TEKey (rather than DelGuts, see 1/16/90) for script systems;
|
|
; whenever backspacing over a script boundary the keyscript wasn't
|
|
; updated. Bug #59422. - In TEBufferText, must set d0 to the
|
|
; current position before calling SetFont2Keyboard (in case of a
|
|
; kbd change while buffering)
|
|
; <6> 2/18/90 SMB NEEDED in 6.0.5 - DoSearch didn't work correctly if the
|
|
; TEHitTestHook had been replaced. We needed to check a
|
|
; terminating condition when hooked out: the high word of d0 was
|
|
; set T if found a char offset.
|
|
;*********** End of domestic 6.0.5 changes; SS-6.0.4, SS-6.0.5 and 7.0 changes still occurring ***************************
|
|
; <5> 2/13/90 SMB NEEDED for 6.0.5 - Fixed broken TEWidthHook by putting back in
|
|
; the old C2P code and adding a new hook nTEWidthHook for the SMgr
|
|
; compatible C2P.
|
|
; <4> 1/30/90 SMB NEEDED FOR 6.0.5 - multiple bugs fixed: see history below.
|
|
; 1/30/90 smb - Fix in TEKey so that when the current position is at a line end and
|
|
; the height of the current line is > the height of the next line, the
|
|
; down arrow will put the caret on the next line. Bug #53697.
|
|
; 1/30/90 smb - Fix to PtToLine to leave the line # negative when going up on the
|
|
; top line. Makes DoFind do the right thing. Fixes bug 35646: up-arrow
|
|
; key doesn't get to beginning of text.
|
|
; 1/29/90 smb - No longer call SetFont2Keyboard for DumpBuffer.
|
|
; - Added patch to DoCaret to pin the caret in view when
|
|
; blanks exceed the edge of the view rect.
|
|
; 1/26/90 smb - Before synchronizing the font to the keybd, dump the text buffer: user
|
|
; could change the keyboard in the middle of buffering. (see TEBufferText and
|
|
; SetFont2Keyboard)
|
|
; 1/25/90 smb - Call HideCaret for up & down arrows to erase the old caret before
|
|
; setting teLftCaret in TEKey. Fixes bug #52887!
|
|
; - Fixed up arrow bug, #51967, that caused the caret to move up multiple
|
|
; lines according to the size of the largest font on the current line.
|
|
; - If zero width in DoSearch, want to branch ow this one pixel difference
|
|
; causes the caret to display on the wrong line ending. Roman fix.
|
|
; Bugs #58921,59247.
|
|
; 1/24/90 smb - Found bug in DoSearch where needed to setup a2 as current line again.
|
|
;*********** End of SS-6.0.4 f3 (for Arabic and Hebrew 6.0.4 only!) changes **********************************************
|
|
;*********** Did not add humane scrolling or move the equates (see 1/22-1/23 comments) for SS-6.0.4! *********************
|
|
; 1/23/90 - Changed FindWord branch for linebreaking to 'bge' instead of 'bgt'.
|
|
; emt - Added humane scrolling (slower) to DefClikProc (also see TEClick).
|
|
; 1/22/90 - Moved private equates and frames into TextEditPriv.a.
|
|
; 1/16/90 SMB NEEDED FOR SS-6.0.4 and 6.0.5 - (added 1/22/90 to Scripts604 build)
|
|
; Added call to SetKeyboard2Font in DelGuts for Script Systems:
|
|
; whenever backspacing over a script boundary the keyscript wasn't
|
|
; updated. Bug #59422.
|
|
; Reorg beginning of FindWord in order to be compatible with applications
|
|
; using incorrect char breaking algorithms for Script Systems.
|
|
; <3> 1/16/90 SMB NEEDED FOR 6.0.5 - Fixed bug in TEGetPoint, added double-byte
|
|
; buffer at end of dispatch record, fixed bug in r-to-l processing
|
|
; of caret that showed up when scrolling down.
|
|
; 1/15/90 smb Fixed Hebrew/Arabic scrolling down bug - caused selRect's top & bottom
|
|
; values to be negative which caused a BIG caret to be drawn. Fixed in
|
|
; CaretInsideRun.
|
|
; 1/9/90 smb Using private space in TEDispatchRec for buffering of a double-byte
|
|
; char rather than using ExpandMem as a global buffer which can affect
|
|
; any active TE record. This fixes a bug seen in KanjiTalk (AppleShare)
|
|
; when an application uses two TE records. Buffering in one record can
|
|
; be dumped into the other record due to the global storage space not
|
|
; knowing which record it applies to.
|
|
; 1/8/90 smb NEEDED FOR 6.0.5: bug 58823, TEGetPoint returned incorrect values
|
|
; when there's no text in the TERec.
|
|
; <2> 1/4/90 PKE NEEDED FOR 6.0.5 (smb's changes from SS-6.0.4b23 to SS-6.0.4f1):
|
|
; •<15Dec89smb> Set the offset parameter to non-zero for
|
|
; StyledLineBreak for unstyled text. •<17Dec89smb> Preserve
|
|
; register d2 in HiliteMiddle. ALSO: Changed conditionals from
|
|
; (Scripts604 | SysVers >= $700) to (Scripts604 | SysVers >=
|
|
; $605). Updated header to BBS format.
|
|
; <1> 12/18/89 CCH Adding for the first time into BBS.
|
|
; BBS versions above:
|
|
;___________________________________________________________________________________________________
|
|
; EASE versions below:
|
|
; <3.2> 12/11/89 smb See history of bug fixes below dated Nov. 22, 1989 -> Dec. 7,
|
|
; 1989.
|
|
; 12/7/89 smb Fixed problem with setting the boundaries in ChkBounds. Also set
|
|
; boundary in DoDraw based on WordRedraw rather than teSysJust.
|
|
; • Corrected test of teForceLeft in iTEGetPoint.
|
|
; • Fixed bug of a large cursor (#52888) due to RomanFindLine (really
|
|
; StylMeasure & P2C) incorrectly increasing the char count due to
|
|
; an invalid leftSide flag set in TE's P2C. This caused ReCalLines
|
|
; to read beyond the end of the line heights record. Fixed by
|
|
; setting a flag which said to ignore the leftSide flag if TextWidth
|
|
; did the measuring in P2C.
|
|
; 12/6/89 smb Unconditionalized code in VisibleLength to fix a LR line w/ R
|
|
; justification display bug. Mark was right!
|
|
; • Set flags in caret display code to indicate when in the middle
|
|
; of a style run but on a line end (see CaretInsideRun).
|
|
; • Fixed bug in {hit-down on,cursor movement to} a script boundary
|
|
; to set the keyboard to the preceeding style run rather than the
|
|
; succeeding one. (see calls to ClickKeyboard2Font).
|
|
; • In BufferChar & DumpBuffer backed up one offset posn to get
|
|
; previous style run for SetFont2Keybaord call.
|
|
; 12/5/89 smb Fixed LR highlighting bug at line ends; in InvrtRectangle.
|
|
; 12/3/89 smb Added a new keyboard/font synchronization routine to be used
|
|
; when doing a hit-down which allows a Roman keyboard with a
|
|
; non-Roman font, specifically because KanjiTalk wants to enter
|
|
; Roman text from a Japanese font.
|
|
; • Fixed potential bug in TESetStyle: must test the doFont bit in
|
|
; the mode since it's possible for the mode to be an additive
|
|
; combination of styles.
|
|
; • Use application font for SetFont2Keyboard rather than system
|
|
; font.
|
|
; • Have to use emBufferPtr for a flag to indicate when I
|
|
; unsynchronize the font & keyboard in ClickKeyboard2Font. These
|
|
; will be used to keep SetFont2Keyboard from synchronizing the
|
|
; font & keyboard when trying to paste a character in this
|
|
; unsynchronized situation.
|
|
; • Also had to add a call to ClickKeyboard2Font from TESetSelect in
|
|
; order for horizontal cursor movement to work correctly in this
|
|
; new unsynchronized situation.
|
|
; 11/26/89 smb More cursor movement pinning, this time in GetStyleEnd. Also,
|
|
; need to use the high caret rectangle in TEKey rather than always
|
|
; using the teSelRect!
|
|
; 11/22/89 smb In CursorMovement had to pin the style run to the line end for
|
|
; correct position.
|
|
; <3.1> 11/21/89 smb See history of bug fixes below dated Oct. 4, 1989 -> Nov. 20,
|
|
; 1989.
|
|
; 11/20/89 smb Added a test in ptchGetRLPosition because when processing a CR
|
|
; entered at the EOD, the current line (a2) is the next line. This
|
|
; causes TE to look beyond the end of the lineStarts array.
|
|
; 11/17/89 smb Bug in DumpBuffer for unstyled textEdit: screwed up stack since
|
|
; was popping the stack w/o doing the push! Now doing the push as
|
|
; well!
|
|
; 11/16/89 smb Fixed TrimMeasure for unstyled TE. Also moved the firstStyleRun
|
|
; and secondStyleRun to the top of the the FmtOrderFrame.
|
|
; 11/13/89 smb Bug fix for buffering 2 byte text on Kanji! see DumpBuffer and
|
|
; TEBufferText.
|
|
; 11/8/89 smb Moved secondStyleRun and firstStyleRun from SharedFrame to
|
|
; FmtOrderFrame since TextFrame needs this info for XTrimMeasure
|
|
; changes.
|
|
; 11/6/89 smb Fixed buffering bug in BufferChar & TEKey; must set emBufferLen
|
|
; non-zero when buffer the 1st byte of a 2-byte character.
|
|
; 11/1/89 smb Adding call to GetStylesInOrder in order to call VisibleLength
|
|
; for a line's style runs. We need to traverse the style runs in
|
|
; display order but backwards!
|
|
; 10/31/89 smb Fixed TETrimMeasure to call VisibleLength at the appropriate
|
|
; times for unstyled text: LineRect uses the line direction and
|
|
; justification to determine when to call it.
|
|
; 10/26/89 smb Bug fix in FindWord for Chinese Script System: clear
|
|
; fwLeadingEdge flag!
|
|
; 10/16/89 smb Added updating of outlined region in TEUpdate.
|
|
; 10/6/89 smb Had to clear (a2) in iTEFeatureFlag so that the return result
|
|
; was set right for an initial state of clear (vs. set).
|
|
; 10/4/89 smb Removed LRTextFlag since it's based on WordRedraw. Will tst
|
|
; WordRedraw instead!
|
|
; <3.0> 10/12/89 smb Checked in fix below dated 10/3/89.
|
|
; 10/3/89 smb Fixed the caret display in TEActivate and TEDeactivate for
|
|
; outline highlighting. Put in old DoHilite code for Roman systems
|
|
; for HyperCard outlining.
|
|
; <2.9> 9/26/89 smb Checked in fixes below dated 8/31/89-9/19/89, plus: Saving the
|
|
; bit in the upper byte of the ExpandMemRec.emBufferLen word.
|
|
; 9/19/89 smb Adding Outline Hilighting to TEActivate/TEDeactivate.
|
|
; 9/17/89 smb Fixed TEKey to turn off and reset the text buffering bit around
|
|
; the StdEntry call.
|
|
; 9/15/89 smb Must move newTEFlags into a data reg for modulo 32 bit ops
|
|
; (bset,bclr,btst).
|
|
; 9/14/89 smb Added calls to dump the text buffer in StdEntry and TeKey.
|
|
; 9/12/89 smb Fixed up DumpBuffer and TeFeatureFlag code.
|
|
; 9/6/89 smb Removed call to SetFont2Keyboard in TEKey since I added it to
|
|
; BufferChar.
|
|
; 9/5/89 smb Complete rewrite of SetFont2Keyboard.
|
|
; 9/2/89 smb Fixed bug #52736, CursorMovement should jump 2 bytes for Kanji
|
|
; on a RL line. Had to also add call to SetFont2Keyboard in
|
|
; BufferChar since changing the styled teRec's initial kbd setting
|
|
; (from Roman to Japanese) before entering Kanji text caused the
|
|
; character to display incorrectly. It was using the initial
|
|
; setting in the style run array, rather than synchronizing the
|
|
; font to the current keyboard before displaying.
|
|
; 8/31/89 smb Fixed TEKey bug: when returning from BufferChar should branch
|
|
; signed rather than unsigned. Also fixing bug in SetFont2Keyboard
|
|
; to always modify the Rsrved font if it exists. Both fixes for
|
|
; bug #51962.
|
|
; <2.8> 8/30/89 smb NEEDED FOR 604 Script Systems AND BIG BANG ...(see additional
|
|
; comments below dated 7/31/89 - 8/29/89)
|
|
; 8/29/89 smb Fixed Roman RL hiliting. Wasn't hiliting correctly for line
|
|
; ends. See MeasureWidth. (added to SS-6.0.4 and 7.0 PTCH!)
|
|
; 8/25/89 smb Fixed Kanji word dragging bug, #51603, by comparing the char
|
|
; offset to the Left anchor and setting the leadingEdgeFlag
|
|
; accordingly. (added to SS-6.0.4 and 7.0 PTCH!)
|
|
; 8/19/89 smb Fixed another unlocked handle bug. Similar to bug #51602. Made
|
|
; d3StyleRun(a6) and d4StyleRun(a6) offsets rather than pointers.
|
|
; See OnSameLine. (added to 6.0.4 PTCH!)
|
|
; 8/10/89 smb Added one more fix in teKey for arrow keys to work after a
|
|
; hit-down on the R. end of a line. (added to 6.0.4 PTCH!)
|
|
; 8/8/89 smb Added Gestalt function. (added to 6.0.4 PTCH!)
|
|
; 8/7/89 smb Fixed bug #51640 - the hyphenation bug - the right way in
|
|
; FindWord. When RecalLines calls FindWord on a Roman system
|
|
; should use the old FindWord code. (not added to 6.0.4 PTCH!)
|
|
; 8/5/89 smb Fixed multiple cursor bug, #51602 - was saving a ptr to the
|
|
; styleRun array in a2StyleRun(a6) (see teGetFormatOrder) when the
|
|
; handle to the styleRec wasn't locked! Oh-Dopey-Me! ANY memory
|
|
; movement could cause this bug! Fixed in GetNextDisplayStyle,
|
|
; DoSearch, TEGetFormatOrder by saving it as an offset, and then
|
|
; restoring it to a ptr when I need it. This is just for styled
|
|
; text. I save it as a pointer for unstyled text since I create it
|
|
; myself (see GetFormatOrdering). (added to 6.0.4 PTCH!) Fixed bug
|
|
; #51961 - striking an up/down arrow key after a hitdown at either
|
|
; line end caused the caret to display at the opposite end of the
|
|
; line rather than the previous line. This bug occurred because
|
|
; teKey was inappropriately setting teLftCaret to T. It should
|
|
; only be set initially if the key was not a cursor key. (added to
|
|
; 6.0.4 PTCH!)
|
|
; 8/4/89 smb Fixed Roman line breaking bug, #51677 - must incr to the next
|
|
; char posn in StylMeasure when the LeftSide flag from P2C is
|
|
; False. RomanFindLine expects the result back to be a LeftSide
|
|
; hit, not a rightSide hit! (added to 6.0.4 PTCH!)
|
|
; 8/2/89 smb Added SMgr VisibleLength code. (added to 6.0.4 PTCH!)
|
|
; 8/1/89 smb In yesterday's fix I had a bug in swapping d2 around a test of
|
|
; the CCs. Fixed by saving d2 and restoring it w/ a "movem" which
|
|
; won't affect my CCs!
|
|
; 7/31/89 smb Fixed an Arabic highlighting bug that occured by having an
|
|
; arabic word followed by a long Roman word that forced a
|
|
; linewrap. The problem was that code was added to TE's C2P to use
|
|
; TextWidth for hit-test on line ends rather than SMgr C2P.
|
|
; However, it should still use SMgr C2P for hiliting and it
|
|
; wasn't. So, fixed it so it would! (not added to 6.0.4 PTCH!)
|
|
; <2.7> 7/25/89 smb NEEDED FOR 604 Script Systems AND BIG BANG … (see comments below
|
|
; dated 7/17/89 - 7/24/89)
|
|
; 7/24/89 smb ConcatStyles should only be called in DelGuts for a styled
|
|
; record. Oops! NOT ADDED TO 604 AURORA PTCH: Cleanup of nEqu.d
|
|
; file: renamed nStyle to nStyles, as it should be.
|
|
; 7/21/89 smb Added ConcatStyles to DelGuts - when it deletes a style it
|
|
; doesn't check to see if the two adjacent styles are the same.
|
|
; Found this in Arabic.
|
|
; 7/20/89 smb Before using an existing NullStyle in SetFont2Keyboard must make
|
|
; sure the font's script is the same as the keyScript. Otherwise,
|
|
; use script's default font.
|
|
; 7/19/89 smb Fixed Roman FindWord hyphenation bug. Problem was occurring
|
|
; because RecalLines used the SMgr-compatible FindWord for
|
|
; determining a word boundary but when it called FindLine for the
|
|
; line break, FindLine used the oldFindLine code (RomanFindLine)
|
|
; which used the old FindWord code. This inconsistency caused
|
|
; RecalDraw to only redraw the second line where the word
|
|
; following the hyphen was to be displayed. It needed to also
|
|
; redraw the first line where the first half of the hyphenated
|
|
; word existed. There was also a problem with "where" the second
|
|
; part of the hyphenated word was being displayed on the next
|
|
; line. Because performance dictated the need to use the old
|
|
; FindLine code for Roman systems, we can't easily fix these
|
|
; problems. The best and easiest fix for this is to always use the
|
|
; old FindWord for all of Roman word breaking needs. Removed code
|
|
; from RomanFindLine that said the caller of FindWord was
|
|
; RomanFindLine. It's no longer necessary.
|
|
; 7/18/89 smb TEInit fix: replaced d1 w/ d3 for WordRedraw determination, and
|
|
; fixed loop incremental. Replaced call to AltSetRsrved in
|
|
; SetFont2Keyboard to SetRsrved. Changed in v2.2.
|
|
; 7/17/89 smb NOT ADDED TO 604 AURORA PTCH: Cleanup of branching in DoMeasure.
|
|
; NOT ADDED TO 604 AURORA PTCH: Faster clearing of d0's high word
|
|
; in FindLine.
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 6.0.4 patches and 7.0 ptch0 from here up ;;;;;;;;;;;;;;;;;;;;
|
|
; <2.6> 7/13/89 smb NEEDED FOR AURORA! (see comments below dated 7/3/89-7/12/89)
|
|
; 7/12/89 smb Misc. cleanup after code review.
|
|
; 7/10/89 smb Cleaned up TEFeatureFlag routine, and added another feature bit,
|
|
; teFForceScriptFont (to be used in SetFont2Keyboard for Script
|
|
; Systems).
|
|
; 7/7/89 smb Fixed bugs for Arabic and Kanji.
|
|
; 7/5/89 smb Fixed dummy run bug in DupStyle - had fixed in PstStylGuts but
|
|
; then I broke inserting a style in the middle of another style,
|
|
; and in fixing this discovered an easier fix to the original bug!
|
|
; 7/3/89 smb Moved vector initialization above SMgr init code in TEInit in
|
|
; order to boot script systems before they are enabled. (They were
|
|
; calling TENew, and since vectors weren't initialized it was
|
|
; crashing.)
|
|
; <2.5> 7/9/89 smb Moved include of ScriptPriv.a back into casm statement! V2.4
|
|
; broke my ROM build. Since ROMS and System files are built from
|
|
; this file, I had to modify the System patch file for TE instead.
|
|
; <2.4> 7/8/89 smb Moved include statement for ScriptPriv.a out of a casm statement
|
|
; for Big Bang build.
|
|
; <2.3> 6/30/89 smb NEEDED FOR AURORA! Mucho worko accompli! (see comments below
|
|
; dated 6/19/89 - 6/30/89)
|
|
; 6/30/89 smb Fixed bug in TEInit code for setting wordRedraw in order to use
|
|
; on Script Systems.
|
|
; 6/29/89 smb Fixed signed/unsigned bugs. Added vectors. Misc. clean up,
|
|
; performance improvements, and bug fix.
|
|
; 6/24/89 smb Fixed problem of a dummy run being created in DupStyle when only
|
|
; one style was being pasted. For more than one style, fixed the
|
|
; problem by calling ConcatRuns in teStyleInsert, InsRsrved,
|
|
; DelGuts, and PasteGuts. Cleared out ExpandMem space that I use.
|
|
; Misc. bug fix and clean up.
|
|
; 6/23/89 smb Fixed many direction bugs: teSysJust and wordRedraw problems.
|
|
; 6/20/89 smb Fixed Arabic lineEnd bugs in C2P. Was breaking highlighting and
|
|
; hitdown.
|
|
; 6/19/89 smb Fixed obscure measuring bugs for Arabic in DoMeasure and
|
|
; GetWidth. Was breaking display of two adjacent Roman fonts on an
|
|
; Arabic SIS w/ RL line direction.
|
|
; <2.2> 6/13/89 smb Check-in (see comments below dated 5/30/89-6/12/89)
|
|
; 6/12/89 smb Fixed FindLine to work w/ Peter's correct version of
|
|
; StyledLineBreak. Fixed script run boundary bug in FindWord.
|
|
; Added TEFeatureFlag interface and activated buffering code (was
|
|
; casm'd out.
|
|
; 6/8/89 smb Fixed RomanFindLine to call the old FindWord code rather than
|
|
; the SMgr FindWord code.
|
|
; 6/7/89 smb Modified CaretDisplay code for RL text by calling new
|
|
; GetDirection rather than GetStyleDirection.
|
|
; 6/5/89 smb Finally found the style run bug: problem was caused by
|
|
; subtracting two pointers to get a length; one of the pointer had
|
|
; the high byte set; fixed by calling StripAddress. Fixed for
|
|
; other guilty code!
|
|
; 5/30/89 smb Added direction of font to high-order byte of stFace in the
|
|
; array of stElements for performance. Also added TEFeatureFlag
|
|
; interface for outline highlighting and text buffering.
|
|
; <2.1> 5/30/89 smb Check in (see comments below dated 5/16/89-5/23/89)
|
|
; 5/23/89 smb Fixing FindWord problems for double-byte text by replacing a
|
|
; huge piece of logic with some simple statements for determining
|
|
; the leadingEdge flag for SMgr's FindWord. Also fixed some bugs
|
|
; in FindLine for MultiScript and Kanji systems.
|
|
; 5/17/89 smb Must lock the StScrpHandle for SetStylScrap to work correctly:
|
|
; see bug #36986.
|
|
; 5/16/89 smb Had to reset A2 to selStart(a3) in TECopy after a NewHandle
|
|
; call, which may have invalidated the pointer to the teRecord
|
|
; (upon which A2 was based!). See bug #46036.
|
|
; <2.0> 5/13/89 smb Added back in mods for v1.8. Also fixed more bugs: see comments
|
|
; below dated 5/12/89-5/13/89.
|
|
; 5/13/89 smb In TE's P2C had to test if pixelWidth passed in was = to
|
|
; TextWidth's result; if so, done. Exit w/o calling SMgr's P2C.
|
|
; Fix for bugs #47756,48159.
|
|
; 5/12/89 smb Had to save a1 in FindLine before calling GetEnvirons since
|
|
; RecalLines depended on it. Also added FindLineRegs to old
|
|
; FindLine for this.
|
|
; <1.9> 5/5/89 smb Backed out v1.8!
|
|
; <1.8> 5/5/89 smb Check in (see comments below dated 5/2/89-5/5/89)
|
|
; 5/5/89 smb Added the old FindLine code back in for Roman text: performance
|
|
; hit!
|
|
; 5/4/89 smb Bug fix in DoSearch: hit-test on line ends wasn't correct for
|
|
; Arabic SIS. Fix for HyperCard bug 47857: clicking at the left of
|
|
; a line was placing the cursor at the end of the previous line.
|
|
; Needed to add a test for CR in order to fix this.
|
|
; 5/2/89 smb Changed branch condition after test of teCROnly. Fix for bug
|
|
; 39276: changed add operation in TECustomHook from a long op to a
|
|
; word op.
|
|
; <1.7> 3/29/89 smb Misc. bugs fixed: see comments below dated 3/17/89-3/21/89
|
|
; 3/21/89 smb Bug fix: should be a word op and not a long op!
|
|
; 3/19/89 smb Bug when number of lines in a teRec is zero, but lineStarts
|
|
; array still contains values from previous times. Either first
|
|
; two words in array should be zeroed or should always test for
|
|
; teNLines(a3) before accessing these words. (in RecalLines)
|
|
; 3/17/89 smb Another TEFindLine bug in CRonly mode: branching on exit to the
|
|
; wrong label.
|
|
; <1.6> 3/15/89 smb Double-byte char fix in BufferText.
|
|
; 3/15/89 smb Fixed teCROnly bug in FindLine - was returning one character too
|
|
; soon.
|
|
; 3/13/89 smb Broke out the common part of TextFrame, SharedFrame, and Cursor
|
|
; Frame and created FmtOrderFrame. Bug fix for Cobra II! Left
|
|
; cursor key at the beginning of a teRecord wraps to the end of
|
|
; the teRecord! Fix in DoubleByte.
|
|
; 3/12/89 smb More synch'ing problems: must use nullStyle if it exists in
|
|
; SetFont2Keyboard; Also fixed a bug in TeKey for
|
|
; SetFont2Keyboard, to use the style of the char previous to the
|
|
; selection start/end. This will handle the case of being on a
|
|
; format boundary.
|
|
; 3/10/89 smb Fixed problem in synch'ing Font 2 Keyboard: needed a pointer to
|
|
; ExpandMemRec.emNewFont for SetRsrved.
|
|
; 3/6/89 smb Performance enhancements; called FixFormatEnd for problem of
|
|
; last style run in record.
|
|
; 3/4/89 smb Fixed bug in BufferChar; wasn't saving 1st byte of double byte
|
|
; char in the correct place in ExpandMem.
|
|
; <1.5> 2/22/89 smb Removed casm flags from code in RangeRect since included all
|
|
; configurations!
|
|
; <1.4> 2/19/89 smb Removed rom casms (see comment below) and removed extraneous
|
|
; routines not being used due to my new code. If needed can back
|
|
; up a version or two.
|
|
; 2/17/89 smb Removed Rom casms that I added yesterday.
|
|
; <1.3> 2/17/89 smb Check in; see comment below.
|
|
; 2/16/89 smb Fixed bug in TEInit: reset a0 w/ ExpandMem address after calling
|
|
; StripAddress. Also adding Rom casms for pre-Cobra II roms to use
|
|
; TE code that's not Script Manager compatible,
|
|
; <Not(NuMac|HcMac|MacPP)>. Also fixed bug in TEBufferText,
|
|
; although it's code not being used yet.
|
|
; <1.2> 2/15/89 SMB Merged System File version with Rom version + added code to make
|
|
; TE Script Manager compatible (see non-EASE comments below dated
|
|
; 31Aug88SMB and later)
|
|
; <1.1> 11/10/88 CCH Fixed Header.
|
|
; <1.0> 11/9/88 CCH Adding to EASE.
|
|
;___________________________________________________________________________________________________
|
|
; old EASE versions:
|
|
; <1.7> 11/2/88 GGD Got rid of machine specific conditionals in favor of feature
|
|
; based conditionals.
|
|
; <1.6> 10/27/88 PKE added script manager support in teinit.
|
|
; <•1.5> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles
|
|
; <1.4> 9/6/88 BBM changed routine names, so they would not conflict with mpw
|
|
; includes.
|
|
; <1.3> 5/2/88 RWW Fixed last-minute System Tools 6.0 bugs - caretHook was never
|
|
; being called, and Pixel2Char was being called directly in one
|
|
; place instead of TEHitTestHook.
|
|
; <•1.2> 3/25/88 RWW Fixed bug in iTEGetHeight when no characters in buffer.
|
|
; <•1.1> 3/16/88 RWW Roll-in of System Tools changes
|
|
; <1.0> 2/11/88 BBM Adding file for the first time into EASE…
|
|
;___________________________________________________________________________________________________
|
|
; non-EASE/pre-EASE versions:
|
|
; 2/13/89 smb Fixed bug in FindLine, where I wasn't adding the finalLength to
|
|
; the overall length of the line.
|
|
; 2/1/89 smb Modified TeKey for textBuffering, but casm for a later build.
|
|
; Also defined new bits in the newTEFlags field (long) in the
|
|
; TEDispatchRec: bit 0 = teFAutoScr (already being used as such,
|
|
; just made a constant) and bit 1 = teFBuffText. Added ExpandMem
|
|
; calls, and removed equates that have been moved to ToolEqu.a.
|
|
; Added ExpandMemRec in place of with/endwith pair around all uses
|
|
; of ExpandMem fields.
|
|
; 1/25/89 smb Modified SMgr calls for MPW 3.0 Equates.
|
|
; 1/24/89 smb Fixed a bug in hiliting for unstyled text. Was wiping out my
|
|
; fake style run array when I hilited the left end of the line,
|
|
; and before I used it for the right end of the line.
|
|
; 1/21/89 smb Removed ChkBounds fixes since didn't appear to be working with
|
|
; them.
|
|
; 1/20/89 smb Modified CursorMovement to remove unneccessary code and to
|
|
; branch correctly.
|
|
; 1/18/89 smb CodeReview mods: added FreeFmtOrderArray. Modified ChkBounds,
|
|
; added R-to-L test for TrimMeasure, and reorganized
|
|
; formatOrdering code.
|
|
; 12/21/88 smb Fixed teDrawHook bug: at entry, a4 was not the handle to the
|
|
; teRecord as documented. Replaced Lo3Bytes code in FindWord with
|
|
; _StripAddress. Added code to keep the high caret in view
|
|
; (TESelView+) when split cursors occur.
|
|
; 12/13/88 smb Modified GetRLPosition routine to correctly display split
|
|
; cursors. The rule is to display the high cursor at the script
|
|
; run whose direction corresponds to the line direction
|
|
; (downstream flow), and the low cursor at the script run whose
|
|
; direction is opposite of the line direction (upstream flow).
|
|
; 12/9/88 smb Added new conditionals and creating one file for Rom and System
|
|
; File builds.
|
|
; 12/5/88 smb Modified teHiliteText to work correctly for mixed directional
|
|
; text. Must pin not only to style run but also current line.
|
|
; Results from SM HiliteText vary due to line direction; Modified
|
|
; PixelWidths to call C2P with the offsets returned. Cleanup all
|
|
; this new code for unstyled text. Fixed FindLine bug that caused
|
|
; a crash when adding new styles that forced a line wrap.
|
|
; 11/29/88 smb Fixed FindLine code to use the correct parameters for script
|
|
; changes when calling StyledLineBreak. Added a routine,
|
|
; ConcatRuns, to clean up the styleRun array. A null run (not
|
|
; entry) was being added to the array the first time a style was
|
|
; added to the teRec (this is after the default run is set up.)
|
|
; Also fixed a bug in SetOneStyle. Was creating the initial run
|
|
; with a length of teLength rather than teLength+1.
|
|
; 10/25/88 smb In DoMeasure, changed test for reverse order from TESysJust to
|
|
; WordRedraw. Added code for caret positioning. Also synched the
|
|
; keyboard to the font and the font to the keyboard.
|
|
; 10/25/88 smb Find correct WordRedraw value in TEInit; fixed GetWidth to
|
|
; measure with TextWidth when trying to measure a whole line or a
|
|
; complete style run, otherwise to measure with Char2Pixel. This
|
|
; fixed the problem of the selRect falling outside the right edge
|
|
; of the view rectangle when TESysJust is set R->L. (23Sept) Fixed
|
|
; the selection problem in Pixel2Char when TESysJust is set R->L.
|
|
; Rewrote highlighting code now that I can see the right results
|
|
; for display and hiliting. (25Oct) GetFormatOrder was added to
|
|
; display style runs correctly on a line.
|
|
; 8/31/88 SMB ALTAIR enhancements: changes made to FindLine, FindWord, and
|
|
; DoHilite to call SMgr routines to get the job done. Also added a
|
|
; new routine GetCurScript to return the current script at a given
|
|
; character position for a styled teRec. Renamed routines (by
|
|
; adding an 'i' for internal) due to MPW name collisions in the
|
|
; rom.
|
|
; <S508> 8/2/88 RWW S508 revisited, since it got copied over. Figured out a much
|
|
; simpler method of handling the problem (handle being
|
|
; dereferenced over a call to InstallIntDispatch which could
|
|
; thrash the heap) involving only a one line change - calling
|
|
; MyNewHandle instead of _NewHandle.
|
|
; 6/27/88 SMB ALTAIR Changes: Incorporate changes to support different script
|
|
; systems in order to be SMgr compatible. East Asian support and
|
|
; left-dominant Middle Eastern complete. Changes made in:TEInit,
|
|
; Pixel2Char, Char2Pixel, TeKey, MeasureIt. Added DoubleByte and
|
|
; BufferChar.
|
|
; <S425> 3/16/88 RWW Fixed bug in TEContinuousStyle and changed the way it handles
|
|
; face attributes
|
|
; <PMAB387> 2/10/88 DBG Fixed bug in TEDispose where dispatch vector was not getting
|
|
; released for unstyled TE records.
|
|
; <PMAB381> 2/4/88 RWW Took out some redundancies and moved autoscroll flag from its
|
|
; position in "teFlags" (née teRecBack) to the new dispatch
|
|
; record. Ooops. It acted as a high bit set in the new handle to
|
|
; the TEDispatchRec
|
|
; <C971> 11/4/87 RWW Yanked SetEraseFlag and associated logic. Only bought us about
|
|
; 10% - not enough to get excited over. Added TECustomHook to give
|
|
; a high end way to stuff new internal dispatch table addresses
|
|
; <C971> 11/3/87 RWW Added new internal dispatch table to (quasi-) support tabs. We
|
|
; won't officially support tabs, but these hooks will make the job
|
|
; a lot simpler for those who need it. (It used to be a lot easier
|
|
; to hook in tab support than it is now that styles have to be
|
|
; reckoned with.)
|
|
; <C971> 10/30/87 RWW Added some hysteresis to lineStarts hack, to try to prevent some
|
|
; heap thrashing from constant SetHandleSize calls
|
|
; <C971> 10/29/87 RWW Changed fail test in SetGuts to masking uninteresting bits Added
|
|
; doToggle functionality to SetGuts, StyleGuts, SetRsrved,
|
|
; CheckMatch
|
|
; <C971> 10/28/87 RWW Changed branches to optimal form. Those patches marked
|
|
; "<C971/RWW102887>NO" are for new ROMs and total replacement
|
|
; patches only. (There were an awful lot of word branches where
|
|
; shorts would do!) Added SetStyleScrap
|
|
; <C971> 10/27/87 RWW Changed references to faces to be byte instead of word length
|
|
; <C971> 10/26/87 RWW InitRsrved had some strangeness in it Added TESetEraseFlag and
|
|
; TEContinuousStyle. Added in code to check for erase flag before
|
|
; performing _EraseRect's
|
|
; <C971> 10/23/87 RWW Broke out some common code, trying not to reinvent the wheel:
|
|
; AnyNullStyle, GetTrueStyle, GetOneStyle Changed GetStylScrap to
|
|
; return a proper scrap record, even if there is no selection
|
|
; range. Prevents apps from having to special case insertion
|
|
; points Rewrote most of TEGetHeight to properly sort and pin
|
|
; start/end Added conditional inclusion of TEDispatch'ed routine
|
|
; addresses so I can find them without a Cray
|
|
; <C971> 10/22/87 RWW Patched ReCalLines to properly shrink lineStarts array
|
|
; <C971> 10/21/87 RWW Added conditional equates to make RAM-based testing easier
|
|
; <C971> 10/19/87 RWW Fixed 0 length bug in TEStylInsert
|
|
; <C971> 10/12/87 RWW Did some personal cleanup. Added new equates for new structures.
|
|
; Changed Bcc's and Bcs's to more logical forms. Began comparing
|
|
; various patches against this source to resolve differences.
|
|
;
|
|
;------------------------------ System 6.0 from here up ----------------------------
|
|
;
|
|
; <C914> 10/29/87 rwh Port to Modern Victorian
|
|
; <C905> 10/13/87 MSH Port to HcMac (Laguna). No color on this machine
|
|
; <C858> 6/4/87 MBK Fixed problems of TEStylInsert destroying the StScrpHandle,
|
|
; style duplication problem in PstStylGuts, and TEGetPoint
|
|
; returning incorrect offset when text ends in CR. Removed
|
|
; conditionals around bug fixes.
|
|
; <C854> 5/21/87 MBK Changed TECalText delta to 8001, fixed Pixel2Char disposhandle
|
|
; problem, fixed find style problem in PstStylScrap, fixed
|
|
; GetLineHites to work with fixed height, fixed recal deletion
|
|
; problem, restored input parameter order of TEGetHeight.
|
|
; <C851> 4/27/87 MBK Miscellaneous bug fixes (search on 851 to get more detailed
|
|
; descriptions); added code to handle setting styles on null
|
|
; selections.
|
|
;
|
|
; ** BETA 8 from here up **
|
|
;
|
|
; <C815> 2/13/87 MBK Fixed StdEntry to set the Grafport's txMode from TERec.teMode.
|
|
; Fixed RangeRect to set pnLoc correctly for compatibility with
|
|
; old applications. Fixed FindLine to check for a CR at the end of
|
|
; a string of unwrapped blanks.
|
|
; <C788> 2/11/87 MBK Fixed TEStylInsert to get the input parameters in the correct
|
|
; order.
|
|
; <C766> 2/5/87 MBK Fixed CopyStyle to lock my style handle before calling PutScrap.
|
|
; Fixed DelGuts to relock text handle after munging. Removed call
|
|
; to StdEntry from TEStylInsert because TEDispatch does it.
|
|
;
|
|
; ** BETA 6 from here up **
|
|
;
|
|
; <C734> 1/30/87 MBK I changed PutStylScrap to TEStylInsert, which unlike
|
|
; PutStylScrap will insert the text as well as the style info.
|
|
; Fixed StyleGuts to check for point sizes <= 0 when an addSize is
|
|
; done. It now converts such values to 1. Modified TEGetHeight to
|
|
; subtract 1 from startLine because GetLineHites wants it 0-based.
|
|
; SetStylHandle fixed to dispose of old style handle before
|
|
; setting new one.
|
|
;
|
|
; ** BETA 5 from here up **
|
|
;
|
|
; <C719> 1/29/87 MBK I removed the C717 change to SetHiteAscent. The ptr there was
|
|
; not an offset from styleTab, it was an addr on the stack.
|
|
; <C717> 1/28/87 MBK Made changes in GetDefStyle, DoDraw, MeasureIt, StylMeasure,
|
|
; SetHiteAscent, and SetStyle to protect unlocked pointers from
|
|
; memory reallocation. Added startLine and endLine input to
|
|
; TEGetHeight. Added RecalDraw to PutStylScrap.
|
|
;
|
|
; ** BETA 4 from here up **
|
|
;
|
|
; <C676> 1/23/87 MBK Added GetStylScrap, PutStylScrap, TEGetPoint, and TEGetHeight.
|
|
;
|
|
; ** BETA 3 from here up **
|
|
;
|
|
; <C622> 1/13/87 MBK Changed to clear the color highlight bit only if a highlight
|
|
; hook has not been installed (this was a problem with
|
|
; highlighting in the hex editor of ResEdit). Modified DoErase to
|
|
; erase the previous character if the mode is XOR, otherwise
|
|
; redrawing it will wipe it out (this was a problem in NetTrek).
|
|
; Modified StylMeasure to lock the style Record so that
|
|
; dereferenced pointer doesn't end up pointing to garbage. Also
|
|
; fixed Pixel2Char to do a signed comparison on the stack space.
|
|
; This bug was discovered by tEx, when the RAM cache was set high.
|
|
; <C597> 1/6/87 MBK Restore A3 ptr after RGBForeColor call in StdExit, in case TERec
|
|
; gets moved.
|
|
; <C574> 12/30/86 MBK Fixed SetStyle to save D2 on the stack because _RGBForeColor
|
|
; destroys it. Fixed Pixel2Char to restore D0 from D1 if NewPtr
|
|
; has to be called.
|
|
; <C513> 12/12/86 MBK Changed to clear bit in HiliteMode instead of setting bit in
|
|
; pnMode for color hilighting. Fixed selection bug in Pixel2Char.
|
|
; <C485> 12/4/86 MBK Set the error code in D0 before calling SysError. Fixed bug in
|
|
; which carets left on the screen were not getting erased (in
|
|
; Mac3D).
|
|
; <C475> 12/2/86 MBK Set the high bit of the pnMode before highlighting, to use the
|
|
; new background color highlighting method.
|
|
; <C454> 11/21/86 MBK Fixed bug in RangeRect that caused selection to be off in
|
|
; MultiPlan. Fixed special case in which line redraw did not work,
|
|
; in RecalLines.
|
|
; <C440> 11/19/86 MBK Fixed SetLineHite to take the line height from the only style
|
|
; when text length is 0 (instead of using the system font as a
|
|
; default). Fixed RecalLines to consider the next character the
|
|
; start of the next line if the width of the viewRect is less than
|
|
; the width of a single character. Fixed styleGuts to access
|
|
; FmDefaultSize as a byte, not a word. Fixed RecalLines bug in
|
|
; which lines are not recalibrated when text is typed over a
|
|
; single CR.
|
|
;
|
|
;--------------------------------- ROM 77 from here up ----------------------------
|
|
;
|
|
; <C393> 11/10/86 MBK Fixed CopyStyle and InsertRecal to reset ptr values after a
|
|
; memory allocation call (the ptrs were pointing to trash).
|
|
; <C381> 11/8/86 MBK Made all changes resulting from code review.
|
|
; <C229> 10/29/86 MBK Fixed 2 register preservation problems. Fixed InsertRecal memory
|
|
; overload problem. Redesigned method of updating line heights.
|
|
; <C207> 10/16/86 MBK Fixed problem in which CR at bottom of ViewRect did not cause
|
|
; scrolling (cleaned up DefClikProc, which fixed the problem seen
|
|
; in the Poke program). Changed Pixel2Char not to expect a buffer
|
|
; ptr as input, and to allocate the space itself on the stack.
|
|
; Added StylTextBox. Changed scrpStartChar to a LONGINT. Changed
|
|
; TECopy and TEPaste not to touch the desk scrap if the TERec is
|
|
; an old one (since David G. mentioned a lot of old applications
|
|
; may need to preserve the desk scrap for Undo). Changed DoHilite
|
|
; back to what it was (except with middle lines being highlighted
|
|
; as a block for speed) because the International version was just
|
|
; too slow; this means I also removed the HiliteText hook.
|
|
; Modified RecalDraw to adjust the redraw selection according to
|
|
; changes in line height.
|
|
; <C182> 10/6/86 MBK Changed colorBit to clrBit since colorBit is a Quickdraw Trap
|
|
; already. Modified DoHilite to always measure from start of line,
|
|
; to fix highlighting problem with scaled fonts. Got rid of
|
|
; special code in PasteStyle to prevent style duplication, And
|
|
; just call ConcatStyles at the end. Added DoErase to fix italics
|
|
; erase problem. Removed code to shrink style runs array in
|
|
; ConcatStyles. Fixed problem of not clearing flag bits in ptrs
|
|
; before doing operations on an address. Changed color from
|
|
; LONGINT to RGBColor, and added Ernie's RGBForeColor and
|
|
; GetForeColor to handle this for the Alladin world.
|
|
; <C139> 9/10/86 MBK Fixed TEGetStyle to return the grafport settings for records
|
|
; without style. Made addSize OR'able in StyleGuts. Fixed "index
|
|
; expected in D0" bug in DoSearch. Added DoMeasure, ChkBounds, and
|
|
; made FindLine call Pixel2Char for International. Fixed
|
|
; word-wrapping with spaces. Put local equates back in this file
|
|
; and put the rest of the equates in nToolEqu.a. Got rid of scrp
|
|
; equates, since they were the same as the st- equates.
|
|
; <C105> 9/3/86 MBK Renamed TEGetStyle to GetStylHandle and TEFindStyle to
|
|
; TEGetStyle. Added SetStylHandle. Added TEDispatch to handle All
|
|
; style traps (except TEStylNew) with only 1 real trap for them
|
|
; all. Made the following changes for International: added the
|
|
; Pixel2Char, Char2Pixel, and HiliteText hooks; modified doSearch
|
|
; and doDraw to test TESysJust and perform their functions
|
|
; backwards if it's set; totally rewrote DoHilite. Added
|
|
; NextLineRect to speed up DoDraw. Rewrote stages 2 and 3 of Recal
|
|
; for speed. Added new feature of Not resetting the line heights
|
|
; in Recallines if the high bit of the line height already stored
|
|
; is set. Changed the TESetStyle and TEReplaceStyle input modes to
|
|
; be OR'able. Also combined the body of these 2 routines for
|
|
; efficiency. Added stuff to compute distance to be auto-scrolled
|
|
; for TERecs with style, in DefClikProc. Changed BSET and BCLR of
|
|
; handles to _HLock and _HUnlock.
|
|
; <C95> 8/4/86 MBK Fixed the scrolling problem in SelView; Modified Recallines to
|
|
; take into account changes in point size.
|
|
; <C94> 7/29/86 MBK Added 3 more traps (TEReplaceStyle, TEGetOffset, TEFindStyle);
|
|
; renamed TEGetStyle to TEFindStyle (TEGetStyle now returns the
|
|
; style handle); fixed selection bug, the problem was in
|
|
; ScanMeasure and DoSearch. Fixed bug in CharByChar. Started
|
|
; fixing recalibration problem.
|
|
; <C78> 7/17/86 MBK removed equates to an external file; added four new traps
|
|
; (TEStylNew, TEStylPaste, TESetStyle, TEGetStyle); added the
|
|
; following new routines: SetOneStyle, GetDefStyle, ScanMeasure,
|
|
; GetLineHites, GetHite, CopyStyle, DeleteStyle, DecStyleCount,
|
|
; StylMeasure, SetLineHite, PasteStyle, MakeRoom, DupStyle,
|
|
; FindStyle, CompareStyles, AddStyle, ExtendStyle, FindLineHite,
|
|
; GetCurStyle, GetNumStyles, GetStyle, RecalstStarts,
|
|
; SetHiteAscent, SetStyle, ConcatStyles, ChangeStyle, and
|
|
; FindFeature; modified the following routines: TESetText,
|
|
; LineRect, PinDisplay, StdEntry, TECopy, DelGuts, RecalDraw,
|
|
; FindLine, RecalLines, SetLineArray, TEPaste, InsGuts, TEKey,
|
|
; TEPinScroll and TESelView.
|
|
;
|
|
;--------------------------------- ROM 76 from here up ----------------------------
|
|
;
|
|
; 2/19/86 BBM Made some modifications to work under MPW
|
|
; 1/14/86? EHB In PasteGuts, call SelSort and get sel length for preflight Fix
|
|
; longize bug in the beginning of DoSearch Added cursor key
|
|
; support to TEKey
|
|
;
|
|
;--------------------------------- Lonely Heifer ROMs from here up ----------------------------
|
|
;
|
|
; 11/5/85 EHB Moved label to make WordRedraw fix work right
|
|
; 11/3/85 SC Fixed special case D3=0 in DoCaret
|
|
; 11/1/85 EHB If WordRedraw=0->draw normal, if >0 -> draw word, if <0 -> draw
|
|
; line
|
|
; 10/31/85 EHB Fast TextBox was scanning 0 len strings for CR's
|
|
; 10/31/85 EHB In RecalDraw, draw whole words if WordRedraw (new lowMem) is
|
|
; TRUE
|
|
; 10/30/85 EHB In DoFind, set up D3/D4 with selStart/selEnd before calling
|
|
; DoText
|
|
; 10/1/85 EHB Set up D2 for all calls to CallBreak (identifies caller)
|
|
; 10/1/85 EHB Added hooks for TrimMeasure, FindWord, and FindLine.
|
|
; 7/26/85 EHB Added ShowCaret to end of TEPinScroll (needed for null scroll)
|
|
; 7/16/85 SC PinDisplay has new entry point for TEUpdate compatability
|
|
; Refresh changed to take A0 pointing to an update rect not D0/D1,
|
|
; calls PinA0Rect.
|
|
; 6/15/85 SC Undid "teLftClick not a byte, now the tefLeftClk bit in teFlags"
|
|
; had to drop back to old one for compatibility. TERecback is now
|
|
; the TEFlags
|
|
; 6/15/85 SC DoText must return ThePort in A0 for compatibility
|
|
; 6/10/85 SC CharbyChar had a BLT that should've been a BLE (It gets there by
|
|
; a BGE so it should stay in loop if BLE).
|
|
; 6/10/85 SC DoText links a stack frame/DoBye and findDone UNLK
|
|
; 6/10/85 SC In rangeRect, stuff the rect.left in TempRect and set pen to
|
|
; right for compatibility with old DoText
|
|
; 6/10/85 SC DoSearch returns in D0 as before
|
|
; 6/7/85 EHB Fast TextBox shouldn't catch zero strings else no
|
|
; EraseRect(oops)
|
|
; 5/23/85 SC Dropped port save/restore font
|
|
; 5/21/85 SC Added negative length to Fast TextBox
|
|
; 5/20/85 SC SelView called before caret view in DelGuts and PasteGuts;
|
|
; should be after (leaves carets behind in Dialogs)
|
|
; 5/20/85 SC CleanupSel saved teTextH flags twice!!
|
|
; 5/20/85 SC DoSearch longize D3-D4 (Thanks Bill and Larry)
|
|
; 5/20/85 SC Fast TextBox didn't catch zero string length case (oops)
|
|
; 5/18/85 SC Made DefClikProc obey autoScroll bit
|
|
; 5/18/85 SC LineWidth didn't handle the line past teLength correctly
|
|
; 5/18/85 SC Merged LineWidth and TrimMeasure
|
|
; 5/18/85 SC Made trim measure skip wordBreak code and only trim chars <=
|
|
; space. This should truly measure only the black characters And
|
|
; not the word break chars now. (Deja Vu - did this on 3 May but a
|
|
; bug in FindLine made it LOOK as though it didn't work so I undid
|
|
; it on 9-May)
|
|
; 5/18/85 SC New routine PinDisplay replaces pin code in Hilite and Refresh
|
|
; 5/18/85 SC Put back DoText funnel for compatibility
|
|
; 5/18/85 SC Dropped printable trim in FindLine @ end
|
|
; 5/15/85 SC Multiple standard entries with stack peel amount in D1. Does a
|
|
; preflight and then escapes if the preflight fails
|
|
; 5/13/85 SC Save/Restore text stuff in std entry/exit and made setlinarray
|
|
; avoid calling _GethandleSize(done once in stdEntry)
|
|
; 5/13/85 SC Added preflight routine to check memory. Called from pasteguts,
|
|
; insertGuts, and TextBox. Did similar to TENew
|
|
; 5/12/85 SC New local proc MungeSetup to do common munger stuff
|
|
; 5/12/85 SC Use D5 in recallines to hold telength
|
|
; 5/11/85 SC Added TEAutoView trap to enable/disable the auto scrolling
|
|
; 5/11/85 SC Local proc Scroll broken out for use by TEScroll and TEPinScroll
|
|
; 5/11/85 SC Use _XMunger instead of _Munger
|
|
; 5/11/85 SC Reinstated teSelPoint, it's in documentation
|
|
; 5/11/85 SC Completely trashed DoText, OffsetStuff, DoFormat and replaced
|
|
; them with a clean versions of DoFind, DoHilite, DoDraw, DoCaret.
|
|
; This was to clean up the scaled fonts problem, the direct pen
|
|
; adjustment and general mayhem With the old DoText.
|
|
; 5/9/85 SC Made a local CalText proc to avoid StdEntry
|
|
; 5/9/85 SC StdEntry/Exit save restore teTextH flags
|
|
; 5/9/85 SC Made SelView local proc
|
|
; 5/9/85 SC Dropped trim measure black stuff
|
|
; 5/9/85 SC teLftClick not a byte, now the tefLeftClk bit in teFlags
|
|
; 5/8/85 SC Added TEPinScroll which does a pinned scroll (Not upward
|
|
; compatible so I couldn't include in real scroll, but it is used
|
|
; by the default click proc and TEScrollView
|
|
; 5/8/85 SC Added TEScrollView which insures selection is visible before
|
|
; doing something. Called from TEKey, TEPaste, TECut, TEIdle, etc.
|
|
; 5/8/85 SC Added default click proc for auto scrolling
|
|
; 5/7/85 SC Undo refresh hilite stuff, moved similar stuff to Hilite
|
|
; 5/6/85 SC DoFormat had an extra measure for left justify that was not
|
|
; needed
|
|
; 5/6/85 SC DoText used TempRect, use stack frame instead
|
|
; 5/5/85 SC Longized all the 0(A0,DX.L) and call to _TextWidth and _DrawText
|
|
; 5/5/85 SC Made StdEntry/Exit use LINK instructions not SP based
|
|
; 5/5/85 SC Fixed up recalLines to reduce flashiness
|
|
; 5/5/85 SC Dropped teSelPoint usage, get off stack frame instead of
|
|
; TeHandle
|
|
; 5/5/85 SC Tricks played with A0 and teCarOn, teCarAct in DrawCaret,
|
|
; cleaned up for readability.
|
|
; 5/5/85 SC TESetSelect trashed teSelPoint, cleaned up code a bit
|
|
; 5/4/85 SC SkipLoop in TrimMeasure could go negative
|
|
; 5/4/85 SC Dropped DelGuts and InsGuts call from PasteGuts and made a
|
|
; combined inline call for munger speed. Could make DelGuts and
|
|
; InsGuts inline since only 1 caller, but left that for another
|
|
; day
|
|
; 5/4/85 SC Changed D2 usage in TEClick to D5 long sign bit
|
|
; 5/3/85 SC Made trim measure skip wordBreak code and only trim chars <=
|
|
; space. This should truly measure only the black characters And
|
|
; not the word break chars now.
|
|
; 5/3/85 SC Dropped forROM and for44T compile switches for readability
|
|
; 5/3/85 SC New version of FindLine, cleaner and fixes bugs. Still
|
|
; inefficient because it measures whole line repeatedly, but
|
|
; faster quickdraw fixes this.
|
|
; 5/3/85 SC Fixed the <CR>-in-1st-char bug with word select. FindWord would
|
|
; abort if the left char scan got to the beginning, but it
|
|
; wouldn't check if the 0th char was a break character or not
|
|
; 1/25/85 EHB Fixed Refresh to only hilight visible part of selection
|
|
; 1/25/85 EHB Added Capp's TextBox fix
|
|
; 1/24/85 EHB Added patch in RecalDraw
|
|
; 1/23/85 LAK Adapted for new equate files.
|
|
; 1/16/85 EHB Fixed center/right justify in TextBox fix
|
|
;
|
|
;-----------------------------------------------------------------------
|
|
;
|
|
; 9/12/83 Made InvertHook push the rectangle
|
|
; 9/9/83 Fixed caret activate problem w/ inactive records Dropped
|
|
; background stuff(Finally gave up) Added global word break for
|
|
; Europe.
|
|
; 9/4/83 Fixed First char select bug in DoText
|
|
; 8/25/83 Fixed Insert D7 bug
|
|
; 8/25/83 Fixed unwind bug in stdexit
|
|
; 8/21/83 Added DoText and recal hooks
|
|
; 8/19/83 Added system double/caret times
|
|
; 8/17/83 Fixed Rony bug in RecalDraw
|
|
; 8/8/83 Dropped pinrects and used extended rects in DoText to save code
|
|
; 8/7/83 Reinstated total dobackgnd from recal(FUCK!)
|
|
; 8/6/83 Dropped total dobackgnd from recal(I guess addition IS
|
|
; communitive)
|
|
; 8/5/83 Fixed a bug in FindLine Fixed bug in Recaline (now waits for
|
|
; whole text to finish) Optimized dobackgnd to always stop at end
|
|
; 8/3/83 Cleaned up TEKey a bit Cleaned up refresh a bit Changed all
|
|
; indices to unsigned (BGE's) Added idle proc for scroll and key
|
|
; Addes TEInsert Fixed the Bryan Stearns memorial 1-char bug in
|
|
; RecalDraw Added hilite hook for MicroSoft and other bizarre
|
|
; things Added caret hook too SetSelect uses longs Added
|
|
; TESetJust, TEGetText
|
|
; 8/2/83 Code review changes: added std2Offset constant stdEntry points
|
|
; to param via A2 changed #7 to #Lock moved epilog4 flags trick in
|
|
; lock/unlock in stdentry/exit cleaned up selection safety chk in
|
|
; stdentry used grafGlobals(A5) instead of 0(A5) cleaned up(Ha!)
|
|
; TEClick Changed DoFind to handle top and pin H to DestRect
|
|
; switched end checks for teFind in DoText Changed and commented
|
|
; selsort- now returns A2^ to selStart callers of selSort now use
|
|
; A2 Shortened rect stuff in RecalDraw CallBreak uses reg
|
|
; arguments instead of stack
|
|
; 7/23/83 New Today
|
|
;
|
|
;<<<END HISTORY>>> <- This is to make the end of these comments easy to find with MPW.
|
|
;___________________________________________________________________________________________________
|
|
; To Do:
|
|
; Remove extraneous code from NewRomanFindLine. Marked with (XX).
|
|
; There may be a measuring bug using TextWidth, due to StdTxMeas' use of pnLoc. TE doesn't seem to
|
|
; initialize the pnLoc to 0 before it measures w/ TextWidth.
|
|
;___________________________________________________________________________________________________
|
|
; Useful MPW commands
|
|
;
|
|
; '/<RWW[0-9]«6»>[¬NO]/'
|
|
;
|
|
;Set teversion 'SMgrTE';Export teversion
|
|
;Delete -i "{SystemFolder}TEPatcher"
|
|
;rez -o "{SystemFolder}TEPatcher" "{RIncludes}"Types.r TEPatcher.r
|
|
;SetFile "{SystemFolder}TEPatcher" -t INIT -c tept -a B
|
|
; Set opt "-d OnNuMac=0,OnMvMac=0,OnMacPP=0,OnHcMac=0,forR0M=0"
|
|
;Asm {opt} TEPatcher.a -o TEPatcher.a.o -d &RWWDebug -i {MyIncludes}
|
|
;link -rt INIT=0 -o "{SystemFolder}TEPatcher" TEPatcher.a.o ShowINIT.a.o
|
|
;___________________________________________________________________________________________________
|
|
|
|
|
|
Blanks On
|
|
String AsIs
|
|
|
|
If &TYPE('&RWWDebug') = 'UNDEFINED' Then
|
|
If &TYPE('InsideTEPatch') = 'UNDEFINED' Then ; <S383>
|
|
LOAD 'StandardEqu.d'
|
|
INCLUDE 'ScriptPriv.a'
|
|
INCLUDE 'TextEditPriv.a' ; <1/9/90smb>
|
|
INCLUDE 'fontPrivate.a' ; <20>
|
|
EndIf ; <S383>
|
|
EndIf
|
|
|
|
IF &TYPE('Scripts604') = 'UNDEFINED' THEN
|
|
Scripts604 EQU 0
|
|
ENDIF
|
|
IF &TYPE('SysVers') = 'UNDEFINED' THEN
|
|
SysVers EQU 0
|
|
ENDIF
|
|
IF &TYPE('forLocalizability') = 'UNDEFINED' THEN ; <32>
|
|
forLocalizability EQU 1 ; <32>
|
|
ENDIF ; <32>
|
|
|
|
INCLUDE 'GestaltEqu.a' ; <18Aug89smb>
|
|
; *************************************************************************************************
|
|
; *************************************************************************************************
|
|
; *************************************************************************************************
|
|
|
|
TextEdit Proc Export
|
|
|
|
Export TextBox
|
|
Export TEActivate
|
|
Export TEClick
|
|
Export TECopy
|
|
Export TECut
|
|
Export TEDeactivate
|
|
Export TEDelete
|
|
Export TEInit
|
|
Export TENew
|
|
Export TEDispose
|
|
Export TEKey
|
|
Export TEPaste
|
|
Export TEIdle
|
|
Export TEUpdate
|
|
Export TEInsert
|
|
Export TESetText
|
|
Export TECalText
|
|
Export TESetSelect
|
|
Export TEScroll
|
|
Export TESetJust
|
|
Export TEGetText
|
|
Export TEAutoView
|
|
Export TEPinScroll
|
|
Export TESelView
|
|
|
|
Export TEStylNew
|
|
Export TEGetOffset
|
|
|
|
Export TEDispatch
|
|
|
|
; exported for debugging use
|
|
|
|
Export DoMeasure
|
|
Export MeasureIt
|
|
Export HideCaret
|
|
Export DoFind
|
|
Export DoCaret
|
|
Export DoText
|
|
Export DoHilite
|
|
Export DoSearch
|
|
Export RangeRect
|
|
Export PrepLine
|
|
Export LineRect
|
|
Export xGetWidth
|
|
Export xteGetFormatOrder
|
|
Export xDoErase
|
|
Export DoDraw
|
|
Export ChkBounds
|
|
Export xCaretDisplay
|
|
Export xGetRLPosition
|
|
Export xOnSameLine
|
|
Export iTESetStyle
|
|
Export xSetKeyboard2Font
|
|
Export xSetFont2Keyboard
|
|
Export xCursorMovement
|
|
Export xTEBufferText
|
|
Export xDumpBuffer
|
|
Export iTEFeatureFlag
|
|
Export xConcatRuns ; <11>
|
|
Export xStyleGuts ; <11>
|
|
Export xBufferChar ; <11>
|
|
Export xTestRunDirection ; <11>
|
|
Export xPixelWidths ; <11>
|
|
Export xInvrtRectangle ; <11>
|
|
Export xHiliteLineEnds ; <11>
|
|
Export xMeasureWholeRun ; <11>
|
|
Export xMeasureWidth ; <11>
|
|
Export xGetCurScript ; <11>
|
|
Export xGetStylesInOrder ; <11>
|
|
Export xGetDirection ; <11>
|
|
Export xSetDirection ; <11>
|
|
Export xCaretInsideRun ; <11>
|
|
Export xOnLineEnd ; <11>
|
|
Export xGetLRPosition ; <11>
|
|
|
|
; hooks to be stored in the trap table
|
|
|
|
Export XTrimMeasure
|
|
Export XFindWord
|
|
Export XFindLine
|
|
Export XReCalLines
|
|
|
|
Export vPixel2Char
|
|
Export vChar2Pixel
|
|
|
|
; sets up vectors to be used for patching TextEdit and clears ExpandMem TE globals <28June89smb>
|
|
Export GestaltTEVersion ; <13>
|
|
Export TEGlobalInit ; <13>
|
|
;-------------------------------------------------------------------------------------------------
|
|
|
|
AddrTable DC.W iTEStylPaste-AddrTable ; 0
|
|
DC.W iTESetStyle-AddrTable ; 1
|
|
DC.W iTEReplaceStyle-AddrTable ; 2
|
|
DC.W iTEGetStyle-AddrTable ; 3
|
|
DC.W iGetStylHandle-AddrTable ; 4
|
|
DC.W iSetStylHandle-AddrTable ; 5
|
|
DC.W iGetStylScrap-AddrTable ; 6
|
|
DC.W iTEStylInsert-AddrTable ; 7
|
|
DC.W iTEGetPoint-AddrTable ; 8
|
|
DC.W iTEGetHeight-AddrTable ; 9
|
|
|
|
; ** <C971/RWW102687> New entry points
|
|
DC.W iTEContinuousStyle-AddrTable ; 10
|
|
DC.W iSetStylScrap-AddrTable ; 11
|
|
DC.W iTECustomHook-AddrTable ; 12
|
|
DC.W iTENumStyles-AddrTable ; 13
|
|
DC.W iTEFeatureFlag-AddrTable ; 14
|
|
|
|
;-------------------------------------------------------------------------------------------------
|
|
|
|
; Add new vectors <28June89smb>
|
|
; EMVectorTable contains the offset in ExpandMemRec which holds the routine address
|
|
; and the offset to the routine from here.
|
|
|
|
EMVectorTable
|
|
with ExpandMemRec
|
|
dc.w vDoErase, xDoErase-EMVectorTable
|
|
dc.w vCaretDisplay, xCaretDisplay-EMVectorTable
|
|
dc.w vGetLRPosition, xGetLRPosition-EMVectorTable
|
|
dc.w vGetRLPosition, xGetRLPosition-EMVectorTable
|
|
dc.w vOnLineEnd, xOnLineEnd-EMVectorTable
|
|
dc.w vCaretInsideRun, xCaretInsideRun-EMVectorTable
|
|
|
|
dc.w vSetDirection, xSetDirection-EMVectorTable
|
|
dc.w vGetDirection, xGetDirection-EMVectorTable
|
|
|
|
dc.w vGetStylesInOrder, xGetStylesInOrder-EMVectorTable
|
|
dc.w vteGetFormatOrder, xteGetFormatOrder-EMVectorTable
|
|
|
|
dc.w vGetWidth, xGetWidth-EMVectorTable
|
|
dc.w vGetCurScript, xGetCurScript-EMVectorTable
|
|
|
|
dc.w vOnSameLine, xOnSameLine-EMVectorTable
|
|
dc.w vMeasureWidth, xMeasureWidth-EMVectorTable
|
|
dc.w vMeasureWholeRun, xMeasureWholeRun-EMVectorTable
|
|
dc.w vHiliteLineEnds, xHiliteLineEnds-EMVectorTable
|
|
dc.w vInvrtRectangle, xInvrtRectangle-EMVectorTable
|
|
dc.w vPixelWidths, xPixelWidths-EMVectorTable
|
|
|
|
dc.w vTEBufferText, xTEBufferText-EMVectorTable
|
|
dc.w vDumpBuffer, xDumpBuffer-EMVectorTable
|
|
|
|
dc.w vCursorMovement, xCursorMovement-EMVectorTable
|
|
dc.w vTestRunDirection, xTestRunDirection-EMVectorTable
|
|
|
|
dc.w vBufferChar, xBufferChar-EMVectorTable
|
|
|
|
dc.w vSetFont2Keyboard, xSetFont2Keyboard-EMVectorTable
|
|
dc.w vSetKeyboard2Font, xSetKeyboard2Font-EMVectorTable
|
|
|
|
dc.w vStyleGuts, xStyleGuts-EMVectorTable
|
|
dc.w vConcatRuns, xConcatRuns-EMVectorTable
|
|
dc.w 0,0
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEGlobalInit
|
|
; <27June89smb>
|
|
;
|
|
; To be called from StartInit, in order to assign vectors
|
|
; and clear expandMem globals only once.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEGlobalInit
|
|
movem.l a2/a3,-(sp)
|
|
; <SM8>
|
|
Lea XDoText,A0 ; set up doText hook <SM8>
|
|
Move.L A0,TEDoText ; <SM8>
|
|
Lea XReCalLines,A0 ; set up recal hook <SM8>
|
|
Move.L A0,TERecal ; <SM8>
|
|
Lea DefWordBrk,A0 ; get default word break <SM8>
|
|
Move.L A0,TEWdBreak ; <SM8>
|
|
; <SM8>
|
|
; initialize expandMem with my TE vectors
|
|
lea EMVectorTable,a0 ; base address of vector table
|
|
move.l a0,a1
|
|
move.l ExpandMem,a2 ; get pointer to expandMem
|
|
VectorLoop
|
|
move.l (a1)+,d0 ; get routine offset from EMVectorTable
|
|
beq.s LoopXit
|
|
lea 0(a0,d0.w),a3 ; get routine address
|
|
swap d0 ; get expandMem offset (vector place holder)
|
|
move.l a3,0(a2,d0.w) ; load into expandMem
|
|
bra.s VectorLoop
|
|
LoopXit
|
|
movem.l (sp)+,a2/a3
|
|
|
|
; when TextEdit 3.0 is ptch0, need this code
|
|
move.l #gestaltTextEditVersion, d0 ; <8Aug89smb>
|
|
lea GestaltTEVersion, a0
|
|
_NewGestalt
|
|
rts
|
|
|
|
;----------------------------------------------------------------------
|
|
; PROCEDURE GestaltTEVersion
|
|
; <8Aug89smb>
|
|
; The following Gestalt Function is an interface using the Gestalt
|
|
; mechanism to determine the current version of TextEdit.
|
|
;
|
|
; FUNCTION GestaltTEVersion ( gestaltSelector: OSType;
|
|
; VAR gestaltResult: Longint;): OSErr;
|
|
;
|
|
; The versions for the gestaltTextEditVersion selector are:
|
|
; gestaltUndefSelectorErr = old styled TextEdit (pre-MacIIci TE)
|
|
; All the following versions of TE are based on the SMgr-compatible version:
|
|
; gestaltTE1 (1) = MacIIci ROM/PTCH 67c
|
|
; gestaltTE2 (2) = 604 Script Systems PTCH 67c (Script bug fixes for MacIIci)
|
|
; gestaltTE3 (3) = 604 Script Systems ptch0/parallels Big Bang (for MacII, MacSE, Mac+)
|
|
; gestaltTE4 (4) = Big Bang ptch0/PTCH 67c
|
|
; gestaltTE5 (5) = TextWidthHook available in System 7
|
|
;
|
|
; THE OBVIOUS: since this is here for the MacIIci ROM patch, we have
|
|
; hardcoded the ONLY value that is appropriate to be returned! sigh.
|
|
;_________________________________________________________________________________
|
|
|
|
GestaltTEVersion
|
|
|
|
move.l (sp)+,a0 ; return address
|
|
move.l (sp)+,a1 ; address of result
|
|
move.l #gestaltTE5, (a1) ; <19>
|
|
adda.w #4,sp ; pop the selector type
|
|
move.w #noErr,(sp) ; it always works
|
|
jmp (a0)
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEInit
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEInit
|
|
|
|
MoveQ #0,D0
|
|
Move D0,TEScrpLength ; save in global space
|
|
_NewHandle
|
|
Move.L A0,TEScrpHandle ; Save in global space
|
|
|
|
Lea XDoText,A0 ; set up doText hook
|
|
Move.L A0,TEDoText
|
|
Lea XReCalLines,A0 ; set up recal hook
|
|
Move.L A0,TERecal
|
|
Lea DefWordBrk,A0 ; get default word break
|
|
Move.L A0,TEWdBreak
|
|
|
|
IF 0 THEN
|
|
;IF &TYPE('&SMgrINIT') <> 'UNDEFINED' THEN ;<1Feb89smb> added for Init testing of ExpandMem
|
|
; only necessary for Init's before Cobra II and 6.0.4.
|
|
ENDIF
|
|
|
|
; Defensive reset in case an application changed teSysJust contrary to system default.
|
|
;
|
|
; Now, we just reset it for Roman-only systems (because TE in such a system cannot currently <32>
|
|
; handle R-L direction; we will fix this eventually). For other scripts, the Text Control <32>
|
|
; Panel lets users choose the default line direction, so we don't want to override it. <32>
|
|
WITH smgrRecord,scriptRecord
|
|
GetSMgrCore a0 ; load SMgr globals pointer.
|
|
IF 1 THEN ; <32>
|
|
move.b smgrEnabled(a0),d0 ; how many scripts enabled? <32>
|
|
ble.s @bail ; if 0 (or neg!), can't initialize <32>
|
|
subq.b #1,d0 ; Roman-only? <32>
|
|
bne.s @doneSetSysJust ; if not, don't reset <32>
|
|
clr.w TESysJust ; Roman-only, force to L-R (else TE screws up) <32>
|
|
@doneSetSysJust ; <32>
|
|
ELSE ; (keep old code for reference for a while) <32>
|
|
tst.b smgrEnabled(a0) ; script manager disabled?
|
|
beq.s @bail ; yes -> bail out.
|
|
move.w smgrSysScript(a0),d0 ; get system script code.
|
|
lsl.w #2,d0 ; script code is long offset.
|
|
move.l smgrEntry(a0,d0.w),a0 ; load system script entry.
|
|
move.b scriptJust(a0),d0 ; load script just.
|
|
ext.w d0 ; sign extend just.
|
|
move.w d0,TESysJust ; set global just.
|
|
ENDIF ; <32>
|
|
endWith ;
|
|
|
|
;<2Feb89smb>
|
|
; initialize NewStyle params for SetRsrved call in SetFont2Keyboard (flag.b, textStylePtr.l, mode.w)
|
|
move.l ExpandMem,a0
|
|
lea ExpandMemRec.emNewStyle(a0),a0 ; changed from add to lea <12July89smb>
|
|
move.b #$FF,(a0) ; flag.b
|
|
move.w #1,6(a0) ; mode.w
|
|
|
|
; Find correct WordDraw value. Used for redrawing for line calculation
|
|
; after character input. A WordDraw value of:
|
|
; 0 = redraw the char in front of the inputted char,
|
|
; 1 = redraw the word in front of the inputted char,
|
|
; FF = redraw the whole line.
|
|
; To set the correct value walk through the scripts (32 of them!),
|
|
; <OR> in 1 for each double-byte script and <OR> in FF for each right-left script.
|
|
move.b #0,WordRedraw ; default case
|
|
move.l d3,-(sp) ; save <18July89smb>
|
|
moveq #0,d3 ; init d3; for d3 := 0 to 32 do
|
|
@WordRedrawLoop
|
|
clr.l -(sp) ; allocate return
|
|
move.w d3,-(sp) ; script number
|
|
move.w #smScriptRedraw,-(sp) ; verb
|
|
_GetScript ; if disabled, will return zero.
|
|
move.l (sp)+,d0 ; values are 0, 1, FF
|
|
or.b d0,WordRedraw ; add it in: 1 ++ x, FF ++ x
|
|
; if all FFs, then dont need to go further-so check for negative
|
|
bmi.s @WRLoopXit
|
|
addq.w #1,d3 ; next script to check <18July89smb>
|
|
cmpi.w #32,d3 ; beyond last script? <18July89smb>
|
|
bls.s @WordRedrawLoop ; keep going until done w/ scripts
|
|
@WRLoopXit
|
|
move.l (sp)+,d3 ; restore <18July89smb>
|
|
|
|
; Get number of scripts installed <9Nov88smb>
|
|
clr.l -(sp)
|
|
move.w #smEnabled,-(sp) ; verb
|
|
_GetEnvirons
|
|
move.l (sp)+,d0
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
move.b d0,ExpandMemRec.emScriptsInstalled(a0) ; total number of installed scripts
|
|
|
|
; guarantee default WordBreak address is 32-bit clean <21Dec88smb>
|
|
lea DefWordBrk,a1
|
|
move.l a1,d0
|
|
_StripAddress
|
|
move.l ExpandMem,a0 ; <16Feb89smb> StripAddress wipes out a0!
|
|
move.l d0,ExpandMemRec.emCleanWordBrk(a0)
|
|
|
|
@bail
|
|
Rts
|
|
ErrorXit
|
|
_SysError
|
|
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEGetText( h: TEHandle ): Handle;
|
|
;
|
|
; Returns the text handle
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEGetText
|
|
Bsr StdEntry
|
|
Move.L teTextH(A3),(A2) ; return the text handle
|
|
Bra epilog4
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEDispose( h: TEHandle )
|
|
;
|
|
; ** <C207/13oct86/MBK> ** Added code to dispose of style
|
|
; related handles if this TERec has style.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEDispose
|
|
Link A6,#0
|
|
MoveM.L D2-D7/A2-A4,-(SP) ; save stdregs
|
|
Move.L 8(A6),A4 ; Pop handle into A4
|
|
Move.L (A4),A3 ; Dereference into A3
|
|
|
|
; dump text buffer before exiting (cleanup!) <21>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <21>
|
|
btst #teFTextBuffering,d0
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
Move.L teTextH(A3),A0 ; get rid of text
|
|
_DisposHandle
|
|
|
|
; Following lines moved here from within "styled" section below.
|
|
Move.L teDispatchH(A3),A0 ; Added to (quasi-) support tabs <C971/RWW110387><PMAB387/DBG021088>
|
|
_DisposHandle ; <PMAB387/DBG021088>
|
|
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl.S @0 ; more to dispose if so
|
|
|
|
Move.L teStylesH(A3),A2 ; get style handle
|
|
Move.L (A2),A2 ; dereference
|
|
Move.L styleTab(A2),A0 ; handle to distinct styles
|
|
_DisposHandle
|
|
|
|
Move.L lhTab(A2),A0 ; handle to line heights
|
|
_DisposHandle
|
|
|
|
Bsr.S DisposRsrved ; dispose of reserved handle
|
|
|
|
Move.L teStylesH(A3),A0 ; get rid of itself
|
|
_DisposHandle
|
|
|
|
@0 Move.L A4,A0 ; get rid of itself
|
|
_DisposHandle
|
|
|
|
MoveQ #4,D0
|
|
Bra Std2Exit
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DisposRsrved;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to dispose of the nullStyle handle.
|
|
;----------------------------------------------------------------------
|
|
DisposRsrved
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullStyle(A0),A0 ; get reserved handle
|
|
Move.L A0,-(SP) ; save this handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullScrap(A0),A0 ; get handle to scrap for null selection
|
|
_DisposHandle ; get rid of null scrap handle
|
|
Move.L (SP)+,A0 ; get back nullStyle handle
|
|
_DisposHandle ; get rid of nullStyle handle
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TextBox( Text: Ptr; Length: LONGINT; r: Rect; style: INTEGER );
|
|
; 18 14 10 8
|
|
;
|
|
;moved following equates to TextEditPriv.a <18>
|
|
;TBJust Equ 8
|
|
;TBBox Equ 10
|
|
;TBLength Equ 14
|
|
;TBText Equ 18
|
|
;----------------------------------------------------------------------
|
|
;TETextBox ; comment out for now <45>
|
|
TextBox
|
|
Link A6,#0
|
|
MoveM.L D2-D7/A2-A4,-(SP) ; save StdRegs on stack
|
|
|
|
Tst.W TBJust(A6) ; “left” justified? <C971/RWW110987>
|
|
Bne.S @05 ; no => skip this <C971/RWW110987>
|
|
|
|
Move.W TESysJust,TBJust(A6) ; he meant, “default justification” <C971/RWW110987>
|
|
IF NOT forLocalizability THEN ; <39-YDS-1/30/92> don't set to 0 for #teForceLeft !!!
|
|
@05 Cmp.W #teForceLeft,TBJust(A6) ; _real_ left justification? <C971/RWW110987>
|
|
Bne.S @08 ; no => skip this <C971/RWW110987>
|
|
Clr.W TBJust(A6) ; clear justification <C971/RWW110987>
|
|
@08 ; <C971/RWW110987>
|
|
ELSE
|
|
@05
|
|
ENDIF
|
|
|
|
; here's Capp's code to make TextBox fast for drawing single lines
|
|
; Added EHB 25-Jan-85.
|
|
|
|
Move.L TBText(A6),A0 ; see if any CR's in text
|
|
Move.L TBLength(A6),D0 ; get length
|
|
Blt tbExit ; escape if illegal string <C971/RWW102887>NO
|
|
Beq.S NoZeroScan ; => don't scan NIL strings <EHB 31-Oct-85>
|
|
@0
|
|
Cmp.B #returnChar,(A0)+
|
|
Beq UseRealOne
|
|
SubQ.L #1,D0
|
|
Bne.S @0
|
|
|
|
; no carriage returns, try in rect
|
|
|
|
NoZeroScan
|
|
subq #2,sp ; see how big it is?
|
|
move.l TBText(a6),-(sp) ; pass text
|
|
clr.w -(sp)
|
|
move TBLength+2(a6),-(sp) ; pass length (low word)
|
|
_TextWidth
|
|
move.w (sp)+,d3 ; save it
|
|
Move.L TBBox(A6),A0 ; point to rect
|
|
Move right(A0),D0
|
|
Sub left(A0),D0
|
|
SubQ #2,D0
|
|
Cmp D3,D0
|
|
Ble.W UseRealOne
|
|
|
|
Move.L A0,-(SP) ; erase the rect
|
|
_EraseRect
|
|
|
|
SubQ #8,SP
|
|
Move.L SP,-(SP)
|
|
_GetFontInfo
|
|
|
|
IF forLocalizability THEN ; see <41> <41-YDS-2/6/92>.we are in
|
|
; an un styled record, give the hight of the assoc
|
|
; font or the script font (the bigger)
|
|
Subq #2,sp ; make room on stack
|
|
_FontScript ; get the script
|
|
Move.W (SP)+, D4 ; into D4
|
|
Beq.W @DoNothing ; it roman ! do nothing
|
|
Subq #4,sp ; make room on stack, will use it later
|
|
Move.W D4, -(SP) ; push script number on stack for later
|
|
Move.L GrafGlobals(A5),A3 ; get graf globals and then thePort
|
|
Move.L thePort(A3),A3 ;
|
|
Move.W txFont(A3),D5 ; get the font face <42-YDS-4/2/92>
|
|
Cmp.W #sysFont, D5 ; is it system font ?
|
|
Beq.S @SystemFont ; yes
|
|
Cmp.W #applFont, D5 ; is it app font ?
|
|
Beq.S @AppFont ; yes
|
|
Subq #4,sp ; make room on stack for result
|
|
Move.W D4, -(SP) ; push script # on stack
|
|
Move.W #smScriptSysFond, -(SP) ; push verb
|
|
_GetScript ; get the system pref fond id
|
|
Move.L (SP)+, D0 ; take result font
|
|
Cmp.W D5, D0 ; are you sure it's not system font ?
|
|
Beq.S @SystemFont ; it is !
|
|
Subq #4,sp ; make room on stack for result
|
|
Move.W D4, -(SP) ; push script # on stack
|
|
Move.W #smScriptAppFond, -(SP) ; push verb
|
|
_GetScript ; get the application pref fond id
|
|
Move.L (SP)+, D0 ; take result font
|
|
Cmp.W D5, D0 ; are you sure it's not application font ?
|
|
Beq.S @AppFont ; it is !
|
|
@OtherFont Move.W #smScriptFntBase ,-(SP) ; we have result space & script # on stack allready
|
|
Bra.S @GetTheFont ; so push the right verb
|
|
@SystemFont Move.W #smScriptSysBase ,-(SP) ; we have result space & script # on stack allready
|
|
Bra.S @GetTheFont ; so push the right verb
|
|
@AppFont Move.W #smScriptAppBase ,-(SP) ; we have result space & script # on stack allready
|
|
@GetTheFont _GetScript ; so push the right verb
|
|
Move.L (SP)+, D0 ; get the associated font
|
|
Tst.W D0 ; we have to test, since only the word counts <42-YDS-4/2/92>
|
|
Beq.S @DoNothing ; no associated font ? bail out !
|
|
Move.W D0, txFont(A3) ; set the font to the assoc font
|
|
SubQ #8,SP ; space on stack
|
|
Move.L SP,-(SP) ; push addres
|
|
_GetFontInfo ; get the assoc font info
|
|
Move.W D5, txFont(A3) ; restore port font
|
|
Move.W (SP), D0 ; get assoc font ascent
|
|
Cmp.W 8(SP), D0 ; compare with script font ascent
|
|
Bgt.S @3 ; used to be '@1' by mistake <43-YDS-4/19/92>
|
|
Move.W D0, 8(SP) ; let the bigger one win !
|
|
@3 AddQ #8,SP ; strip stack
|
|
@DoNothing
|
|
ENDIF
|
|
|
|
Move (SP)+,D0 ; get ascent
|
|
AddQ #6,SP ; skip rest
|
|
Move.L TBBox(A6),A0 ; point to rect
|
|
Move.L (A0),-(SP) ; push topleft
|
|
Add D0,(SP) ; go down ascent
|
|
AddQ #1,2(SP) ; indent 1 for TE compatibility
|
|
_MoveTo
|
|
|
|
Tst.W TBJust(A6) ; look at justification
|
|
Beq.S @2 ; if left go do it
|
|
IF forLocalizability THEN ; <39-YDS-1/30/92> don't forget to check
|
|
Cmp.W #teForceLeft,TBJust(A6) ; for #teForceLeft (if we had 0, we had set
|
|
Beq.S @2 ; it allready to system justification)
|
|
ENDIF
|
|
|
|
; assume centered
|
|
Move.L TBBox(A6),A0 ; point to rect
|
|
Move right(A0),D0 ; calc width
|
|
Sub left(A0),D0
|
|
Sub D3,D0 ; subtract text width
|
|
SubQ #1,D0 ; caret space TE compatibility
|
|
|
|
Tst.W TBJust(A6) ; look at justification
|
|
Bmi.S @1 ; if right skip right shift
|
|
AsR #1,D0 ; divide by two
|
|
@1
|
|
Move D0,-(SP) ; move over
|
|
Clr -(SP) ; dv = 0
|
|
_Move
|
|
@2
|
|
|
|
;----------------------------------------------- <22>
|
|
; Turn PreserveGlyph off before drawing, but save its previous setting <22>
|
|
clr.w -(sp) ; boolean result <22>
|
|
_GetPreserveGlyph ; <22>
|
|
; leave result on stack
|
|
tst.w (sp) ; preserve or squash? (byte result but cleared word)
|
|
beq.s @IsFalse ; <22>
|
|
move.b #0,-(sp) ; set PreserveGlyph FALSE <22>
|
|
_SetPreserveGlyph ; <22>
|
|
@IsFalse
|
|
;----------------------------------------------- <22>
|
|
|
|
Move.L TBText(A6),-(SP) ; pass text
|
|
Clr -(SP)
|
|
Move TBLength+2(A6),-(SP) ; pass length (low word)
|
|
_DrawText
|
|
|
|
;----------------------------------------------- <22>
|
|
; Restore PreserveGlyph
|
|
; previous PreserveGlyph value still on stack
|
|
_SetPreserveGlyph ; <22>
|
|
|
|
;----------------------------------------------- <22>
|
|
|
|
tbExit
|
|
Bra.S Go14Exit ; go to standard exit
|
|
|
|
; end of TextBox patch <EHB 25-Jan-85>
|
|
|
|
UseRealOne
|
|
; watch out for wierd (SP) offsets
|
|
SubQ #4,SP ; make room for return handle
|
|
Move.L TBBox(A6),-(SP) ; pass rect to init code
|
|
Move.L (SP),-(SP) ; pass rect twice
|
|
Move.L (SP),-(SP) ; pass rect twice
|
|
_EraseRect
|
|
_TENew
|
|
Move.L (SP)+,A4 ; save handle
|
|
|
|
Move.L (A4),A0 ; dereference
|
|
Move.W TBJust(A6),teJust(A0) ; and set style
|
|
|
|
Move.L TBLength(A6),D0 ; get length
|
|
Beq.S noTextBox
|
|
|
|
Move.L TBText(A6),-(SP) ; pass text pointer
|
|
Move.L D0,-(SP) ; pass text length
|
|
Move.L A4,-(SP) ; pass tehandle
|
|
|
|
_TESetText
|
|
|
|
Move.L TBBox(A6),-(SP) ; pass rect to update
|
|
Move.L A4,-(SP) ; pass tehandle
|
|
_TEUpdate ; and draw it
|
|
|
|
noTextBox
|
|
Move.L A4,-(SP) ; pass tehandle
|
|
_TEDispose ; and dispose it
|
|
Go14Exit
|
|
MoveQ #14,D0
|
|
Bra Std2Exit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TESetText( text: Ptr; l: Length; h: TEHandle );
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Makes the text passed in, the current text to edit
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TESetText
|
|
Bsr StdEntry
|
|
|
|
Move.L (A2)+,D0 ; get length passed
|
|
|
|
Move D0,teSelStart(A3) ; save as selection
|
|
Move D0,teSelEnd(A3)
|
|
Move D0,teLength(A3) ; save as length
|
|
|
|
Move.L teTextH(A3),A0 ; handle to stuff into
|
|
Move.L D0,-(SP)
|
|
_HUnlock ; and unlock it
|
|
Move.L (SP)+,D0
|
|
Move.L (A2)+,A0 ; set up ptr
|
|
Move.L teTextH(A3),A1 ; handle to stuff into
|
|
_PtrToXHand
|
|
|
|
Move.L teTextH(A3),A0 ; handle to stuff into
|
|
_HLock ; relock it
|
|
|
|
Bsr.S SetOneStyle ; set GrafPort's style <C971/RWW102887>NO
|
|
|
|
Bsr CalText ; go do it
|
|
noText
|
|
go12
|
|
Bra epilog12
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetOneStyle
|
|
;
|
|
; ** Added 6/2/83 by MBK **
|
|
;
|
|
; Called by TESetText to set the entire body of the new text
|
|
; to a single style, which is taken from the GrafPort by
|
|
; default.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
SetOneStyle
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; quit if no style
|
|
|
|
; Set style handle to minimum size (i.e., 1 style for entire text)
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
MoveQ #teStylSize,D0 ; size of record with 1 style
|
|
Bsr.S MySetHandleSize ; reset handle size <C971/RWW102887>NO
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
; Reset StyleRec's handle size to just 1 StyleRec
|
|
Move.L styleTab(A0),A0 ; handle to StyleRec's
|
|
MoveQ #stRecSize,D0 ; size of 1 style record
|
|
Bsr.S MySetHandleSize ; reset handle size <C971/RWW102887>NO
|
|
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; dereference to A0
|
|
|
|
Move.W teLength(A3),D0 ; get length of text
|
|
addq.w #1,d0 ; increment for dummy character <23Nov88smb>
|
|
Bsr.S GetDefStyle ; store default style in StyleRec <C971/RWW102887>NO
|
|
|
|
@0 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE MySetHandleSize
|
|
;
|
|
; ** <C381/7nov86/MBK> **
|
|
;
|
|
; MySetHandleSize unlocks the TEHandle and the text handle, attempts
|
|
; to set the input handle size, calls system error if there is one,
|
|
; And otherwise relocks TEHandle and the text handle.
|
|
;
|
|
; Entry:
|
|
; D0: requested handle size
|
|
; A0: a handle
|
|
; A3: Ptr to TERec
|
|
; A4: Handle to TERec
|
|
;
|
|
; Exit:
|
|
; A3: Could have a different value if memory was shifted
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
MySetHandleSize
|
|
MoveM.L D0/A0,-(SP) ; save input
|
|
Move.L teTextH(A3),A0 ; text handle
|
|
_HUnLock ; unlock it
|
|
MoveM.L (SP)+,D0/A0 ; restore input
|
|
|
|
_SetHandleSize ; do it
|
|
Bne.S badExit ; fly away if system error
|
|
|
|
MoveM.L D0/A0,-(SP) ; save input
|
|
Move.L teTextH(A3),A0 ; text handle
|
|
_HLock ; lock that too
|
|
MoveM.L (SP)+,D0/A0 ; restore input
|
|
|
|
Rts
|
|
|
|
badExit
|
|
Move.W #dsMemFullErr,D0 ; memory full error ** <C485/03dec86/MBK> **
|
|
|
|
_SysError ; go away and never come back
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetDefStyle
|
|
;
|
|
; ** Added 6/2/86 by MBK **
|
|
;
|
|
; GetDefStyle gets the default style for this TERec (taken
|
|
; from its GrafPort) and stores it in the styleRec pointed
|
|
; to by A0.
|
|
;
|
|
; Entry:
|
|
; D0: length of text
|
|
; A0: dereferenced TEStylesH
|
|
; A3: Ptr to TERec
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetDefStyle
|
|
Move.W #1,nRuns(A0) ; always 1 style to start
|
|
Move.W #1,nStyles(A0) ; # of STElements <24July89smb> changed to nStyles
|
|
Lea runs(A0),A1 ; point to start of style array
|
|
Clr.L (A1)+ ; start offset and index
|
|
Move.W D0,(A1)+ ; 1 beyond the end
|
|
Move.W #$FFFF,(A1) ; make it no style
|
|
|
|
Move.L styleTab(A0),A0 ; handle to StyleRec's
|
|
Move.L (A0),A0 ; dereference
|
|
Move.W #1,stCount(A0) ; so set count to 1
|
|
|
|
Bsr GetSize ; get ascent & hite <C971/RWW102887>NO
|
|
|
|
; Dereference the handle again. GetSize calls GetFontInfo, which could
|
|
; move memory around.
|
|
Move.L teStylesH(A3),A0 ; style handle
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L styleTab(A0),A0 ; handle to StyleRec's
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
Move.W D0,stAscent(A0) ; save in ascent ** <C207/10oct86/MBK> **
|
|
Move.W D1,stHeight(A0) ; save in line height ** <C207/10oct86/MBK> **
|
|
|
|
; Get the font, face, size and color and save away
|
|
Move.L teGrafPort(A3),A1 ; get this port
|
|
Move.W txFont(A1),stFont(A0) ; save the font
|
|
Move.W txFace(A1),stFace(A0) ; save the face
|
|
|
|
; set the direction of the font in the high bit of the high-order byte <30May89smb>
|
|
move.l a0,-(sp)
|
|
move.w stFont(a0),d1
|
|
lea stFace+1(a0),a0
|
|
Bsr SetDirection
|
|
move.l (sp)+,a0
|
|
|
|
Move.W txSize(A1),stSize(A0) ; save the size
|
|
Pea stColor(A0) ; place to store color ** <C182/6oct86/MBK> **
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; are we on a color system? (as per Jerome) <C971/RWW112487>
|
|
Bnz.S @1 ; Nope <C971/RWW112487>
|
|
_GetForeColor ; <C971/RWW112487>
|
|
Bra.S @2 ; <C971/RWW112487>
|
|
@1 Bsr GetForeColor ; <C971/RWW112487>
|
|
@2
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
_GetForeColor ; for Ikki ** <C182/6oct86/MBK> **
|
|
Else
|
|
Bsr GetForeColor ; for Alladin ** <C182/6oct86/MBK> **
|
|
EndIf
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetSize
|
|
;
|
|
; ** <C207/10oct86/MBK> **
|
|
;
|
|
; Get ascent and line height from current font.
|
|
;
|
|
; Exit:
|
|
; D0: ascent
|
|
; D1: line height (= ascent + descent + leading!)
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetSize
|
|
Move.L A0,-(SP) ; calling routines need this
|
|
|
|
; Get line height, etc. for font
|
|
SubQ #8,SP ; make room for font info stuff
|
|
Move.L SP,-(SP) ; push address
|
|
_GetFontInfo
|
|
|
|
IF forLocalizability THEN ; see <41> <41-YDS-2/6/92>.if we are in
|
|
; an un styled record, give the hight of the assoc
|
|
; font or the script font (the bigger)
|
|
Tst.W teSize(a3) ; is it styled ?
|
|
Bmi.W @NoAssocFont ; if yes, don't do anything
|
|
Move.L D3, -(SP) ; save d3 on stack for now
|
|
Subq #2,sp ; make room on stack
|
|
_FontScript ; get the script
|
|
Move.W (SP)+, D3 ; into D3
|
|
Beq.W @DoNothing ; it roman ! do nothing
|
|
Subq #4,sp ; make room on stack, will use it later
|
|
Move.W D3, -(SP) ; push script number on stack for later
|
|
Cmp.W #sysFont, teFont(A3) ; is it system font ?
|
|
Beq.S @SystemFont ; yes
|
|
Cmp.W #applFont, teFont(A3) ; is it app font ?
|
|
Beq.S @AppFont ; yes
|
|
Subq #4,sp ; make room on stack for result
|
|
Move.W D3, -(SP) ; push script # on stack
|
|
Move.W #smScriptSysFond, -(SP) ; push verb
|
|
_GetScript ; get the system pref fond id
|
|
Move.L (SP)+, D0 ; take result font
|
|
Cmp.W teFont(A3), D0 ; are you sure it's not system font ?
|
|
Beq.S @SystemFont ; it is !
|
|
Subq #4,sp ; make room on stack for result
|
|
Move.W D3, -(SP) ; push script # on stack
|
|
Move.W #smScriptAppFond, -(SP) ; push verb
|
|
_GetScript ; get the application pref fond id
|
|
Move.L (SP)+, D0 ; take result font
|
|
Cmp.W teFont(A3), D0 ; are you sure it's not application font ?
|
|
Beq.S @AppFont ; it is !
|
|
@OtherFont Move.W #smScriptFntBase ,-(SP) ; we have result space & script # on stack allready
|
|
Bra.S @GetTheFont ; so push the right verb
|
|
@SystemFont Move.W #smScriptSysBase ,-(SP) ; we have result space & script # on stack allready
|
|
Bra.S @GetTheFont ; so push the right verb
|
|
@AppFont Move.W #smScriptAppBase ,-(SP) ; we have result space & script # on stack allready
|
|
@GetTheFont _GetScript ; so push the right verb
|
|
Move.L (SP)+, D0 ; get the associated font
|
|
Tst.W D0 ; test the low word <42-YDS-4/2/92>
|
|
Beq.S @DoNothing ; no associated font ? bail out !
|
|
Move.L (SP)+, D3 ; restore D3, we need a fresh stack
|
|
Move.L teGrafPort(A3),A0 ; get thePort
|
|
Move.W D0, txFont(A0) ; set the font to the assoc font
|
|
SubQ #8,SP ; space on stack
|
|
Move.L SP,-(SP) ; push addres
|
|
_GetFontInfo ; get the assoc font info
|
|
Move.L teGrafPort(A3),A0 ; get the port
|
|
Move.W teFont(A3),txFont(A0) ; restore the font
|
|
Move.W (SP)+, D0 ; get assoc font ascent
|
|
Cmp.W 6(SP), D0 ; compare with script font ascent
|
|
Bgt.S @1
|
|
Move.W D0, 6(SP) ; let the bigger one win !
|
|
@1 Move.W (SP)+, D0 ; get assoc font descent
|
|
Cmp.W 6(SP), D0 ; compare with script font ascent
|
|
Bgt.S @2
|
|
Move.W D0, 6(SP) ; let the bigger one win !
|
|
@2 AddQ #2,SP ; skip max wid
|
|
Move.W (SP)+, D0 ; get assoc font leading
|
|
Cmp.W 6(SP), D0 ; compare with script font ascent
|
|
Bgt.S @3
|
|
Move.W D0, 6(SP) ; let the bigger one win !
|
|
@3 Bra.S @NoAssocFont ; back to normal !
|
|
@DoNothing
|
|
Move.L (SP)+, D3 ; restore D3,
|
|
@NoAssocFont
|
|
ENDIF
|
|
|
|
Move (SP)+,D0 ; get ascent
|
|
Move D0,D1
|
|
Add (SP)+,D1 ; add descent
|
|
AddQ #2,SP ; skip max wid
|
|
Add (sp)+,d1 ; add leading
|
|
|
|
move.l (sp)+,a0
|
|
Rts
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TECalText{ ( h: TEHandle ) };
|
|
;
|
|
; When the user installs his own text handle/rectangle in the record,
|
|
; this routine should be called to calibrate the line array to it
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
CalText
|
|
Move.L teSelStart(A3),-(SP) ; save selStart/End
|
|
|
|
Clr teSelStart(A3) ; recall from beginning
|
|
|
|
; The delta must be 32,767 for the recalibration to work correctly when the insert length
|
|
; is 32,767 and the text length is 0. (an arbitrarily large negative number won't do).
|
|
Move #$8001,D7 ; fake delta(large - number)
|
|
|
|
Clr.L teLines(A3) ; insure total recal
|
|
|
|
Bsr ReCalLines ; redo the line stuff
|
|
|
|
Move.L (SP)+,teSelStart(A3) ; restore selStart/End
|
|
|
|
Rts
|
|
|
|
TECalText
|
|
Bsr StdEntry
|
|
|
|
Bsr.S CalText ; <C971/RWW102887>NO
|
|
epilog4
|
|
MoveQ #4,D0
|
|
;fall into std exit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Std Exit assumes original argument is good
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
StdExit
|
|
Move.L inHandle(A6),A4 ; Place handle into A4
|
|
Bra.S RealExit
|
|
|
|
; ** <C105/29aug86/MBK> ** For style routines, which also have a routine
|
|
; selector on the top of the stack
|
|
|
|
StdExit2 Move.L inHandle+2(A6),A4 ; Place handle into A4
|
|
|
|
RealExit Move.L (A4),A3 ; re-dereference it
|
|
|
|
Move D0,D4 ; save strip amount
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.B saveTH(A6),D0 ; get the text handle flags
|
|
_HSetState ; set up the handle
|
|
|
|
Move.L saveClip(A6),-(SP)
|
|
Move.L (SP),-(SP)
|
|
_SetClip ; restore caller's clip
|
|
_DisposRgn ; and dispose of our copy
|
|
|
|
Move.L A4,A0 ; get the handle
|
|
Move.B saveHandle(A6),D0 ; get the handle's flags
|
|
_HSetState ; restore the handle
|
|
|
|
Pea saveColor(A6) ; set foreground color ** <C182/6oct86/MBK> **
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; are we on a color system? (as per Jerome) <C971/RWW112487>
|
|
Bnz.S @1 ; Nope <C971/RWW112487>
|
|
_RGBForeColor ; <C971/RWW112487>
|
|
Move.L (A4),A3 ; <C971/RWW112487>
|
|
Bra.S @2 ; <C971/RWW112487>
|
|
@1 Bsr RGBForeColor ; <C971/RWW112487>
|
|
@2
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
_RGBForeColor ; for Ikki ** <C182/6oct86/MBK> **
|
|
Move.L (A4),A3 ; restore ptr just in case ** <C597/06jan87/MBK> **
|
|
Else
|
|
Bsr RGBForeColor ; for Alladin ** <C182/6oct86/MBK> **
|
|
EndIf
|
|
Move.L teGrafPort(A3),A0 ; restore GrafPort stuff
|
|
Move.W saveSize(A6),txSize(A0) ; restore Grafport's size
|
|
Move.W saveFace(A6),txFace(A0) ; restore Grafport's face
|
|
Move.W saveFont(A6),txFont(A0) ; restore Grafport's font
|
|
|
|
Move.L savePort(A6),-(SP) ; restore port to user's passed
|
|
_SetPort
|
|
|
|
Move D4,D0 ; restore strip amount
|
|
Std2Exit
|
|
MoveM.L (SP)+,D2-D7/A2-A4 ; restore regs
|
|
Unlk A6
|
|
|
|
Move.L (SP)+,A0 ; remove return add
|
|
Add D0,SP ; strip parameters
|
|
Jmp (A0)
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TESetSelect{ ( selStart, selEnd: LONGINT; h: TEHandle ) };
|
|
;
|
|
; Sets the current select range
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TESetSelect
|
|
Bsr StdEntry
|
|
|
|
Bsr ClearRsrved ; clear out reserved style
|
|
|
|
Bsr HideCaret
|
|
Bsr HiLite
|
|
|
|
Move 14(A6),teSelEnd(A3) ; Jam the selection end
|
|
Move 18(A6),teSelStart(A3) ; jam selStart
|
|
Bsr CleanUpSel ; sort and clean up selection
|
|
|
|
; set the current font in the grafort so can synch the keyboard to the font <10Nov88smb>
|
|
tst.w teSize(a3) ; if unstyled, can't synch keyboard to font <1Dec88smb>
|
|
bpl.s @NoSynch
|
|
|
|
move.w teSelStart(a3),d0
|
|
beq.s @BufferStart ; <6Dec89smb>
|
|
sub.w #1,d0 ; backup one to get previous style <6Dec89smb>
|
|
@BufferStart
|
|
move.w d0,d3 ; save offset position <6Dec89smb>
|
|
bsr GetCurStyle
|
|
bsr SetStyle
|
|
move.w d3,d0 ; <6Dec89smb>
|
|
IF hasInlineInput THEN ; <16>
|
|
; if inline input is on then don't unsynchronize the keyboard! <16>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d1 ; move into reg for modulo 32 bit ops
|
|
btst #teFInlineInput,d1 ; is this Inline Input feature desired?
|
|
bne.s @NoSynch ; yes, so don't unsynch!
|
|
ENDIF ; <16>
|
|
bsr ClickKeyboard2Font ; <3Dec89smb>
|
|
;; Bsr SetKeyboard2Font ; synch keyboard to font <10Nov88smb>
|
|
@NoSynch
|
|
Bsr ShowCaret
|
|
Bsr HiLite
|
|
|
|
Bsr SelView ; insure selection is visible
|
|
|
|
Bra go12
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TENew{ ( destRect, viewRect: Rect ): TEHandle };
|
|
;
|
|
; Called when creating an unstyled TERecord.
|
|
;----------------------------------------------------------------------
|
|
TENew
|
|
Link A6,#0
|
|
MoveM.L D2-D7/A2-A4,-(SP) ; Save regs
|
|
|
|
Clr.L 16(A6) ; return NIL
|
|
|
|
MoveQ #teRecSize,D0 ; Allocate a record
|
|
_NewHandle ,CLEAR
|
|
Bne badExit ; escape if error <C971/RWW102887>NO
|
|
|
|
Move.L A0,A4 ; save handle
|
|
|
|
_HLock ; get object handle and lock it
|
|
Move.L (A4),A3 ; dereference it
|
|
|
|
MoveQ #0,D0 ; get text handle
|
|
_NewHandle
|
|
Bne badExit ; escape if error <C971/RWW102887>NO
|
|
Move.L A0,teTextH(A3)
|
|
|
|
; Dest and view rect must be together in record
|
|
Lea teDestRect(A3),A0 ; point to rects in beginning
|
|
Move.L 12(A6),A2 ; Get dest rectangle arg
|
|
Move.L (A2)+,(A0)+ ; save away in record
|
|
Move.L (A2)+,(A0)+
|
|
Move.L 8(A6),A2 ; Get view rectangle arg
|
|
Move.L (A2)+,(A0)+ ; save away in record
|
|
Move.L (A2)+,(A0)+
|
|
|
|
; Get line height, etc. for font
|
|
Bsr GetSize ; get ascent & hite ** <C207/10oct86/MBK> **
|
|
Move.W D0,teAscent(A3) ; save in ascent ** <C207/10oct86/MBK> **
|
|
Move.W D1,teLineHite(A3) ; save in line height ** <C207/10oct86/MBK> **
|
|
|
|
; Get the font and face and save away
|
|
Move.L GrafGlobals(A5),A2 ; get lisagraf globals and then
|
|
Move.L thePort(A2),A2 ; thePort
|
|
Move.L A2,teGrafPort(A3) ; save this port
|
|
Move.L txFont(A2),teFontStuff(A3) ; save the font/face
|
|
Move.L txFont+4(A2),teFontStuff+4(A3) ; save the mode/size
|
|
|
|
; set the direction of the font in the high bit of the high-order byte <30May89smb>
|
|
move.l a0,-(sp) ; save
|
|
move.w teFontStuff(a3),d1 ; font
|
|
lea teFace+1(a3),a0 ; store direction here
|
|
Bsr SetDirection
|
|
move.l (sp)+,a0
|
|
|
|
Move.L TEWdBreak,teWordBreak(A3) ; Set global word breaker
|
|
|
|
Lea DefClikProc,A0 ; setup default click proc
|
|
Move.L A0,teClikProc(A3)
|
|
|
|
Bsr.S InstallIntDispatch ; install new internal dispatch tbl <C971/RWW110387>
|
|
|
|
Move.L teTextH(A3),A0 ; need to unlock text handle <S555/RWW080488>
|
|
_HUnlock ; MyNewHandle locked it <S555/RWW080488>
|
|
|
|
Move.L A4,A0 ; set up for HUnlock
|
|
_HUnlock
|
|
Move.L A4,16(A6) ; return handle
|
|
|
|
MoveQ #8,D0
|
|
Bra Std2Exit ; <C971/RWW102887>NO
|
|
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ClearRsrved;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to set the style count to 0 whenever
|
|
; the selection is changed.
|
|
;----------------------------------------------------------------------
|
|
|
|
ClearRsrved
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl.S @0 ; this hdl isn't there if not
|
|
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullStyle(A0),A0 ; get reserved handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullScrap(A0),A0 ; get handle to scrap for null selection
|
|
Move.L (A0),A0 ; deref
|
|
Move.W #0,scrpNStyles(A0) ; indicate no style
|
|
@0 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; InstallIntDispatch
|
|
; <C971/RWW110387>
|
|
;
|
|
; Added this code to (quasi-) support tabs
|
|
;
|
|
;----------------------------------------------------------------------
|
|
InstallIntDispatch
|
|
moveq #intDispSize,d0
|
|
bsr MyNewHandle ; Replaces next two lines <S508/RWW080288>
|
|
; _NewHandle ; <S508/RWW080288>
|
|
; bne badExit ; <S508/RWW080288>
|
|
|
|
move.l a0,teDispatchH(a3) ; install it in the record
|
|
move.l (a0),a0
|
|
|
|
lea XEOLHook,a1
|
|
move.l a1,EOLHook(a0)
|
|
|
|
lea XDRAWHook,a1
|
|
move.l a1,DRAWHook(a0)
|
|
|
|
;;<2/8/90smb> Lea Char2Pixel,A1
|
|
lea OldChar2Pixel,a1 ; install old routine here <2/8/90smb>
|
|
move.l a1,WIDTHHook(a0)
|
|
|
|
lea Pixel2Char,a1 ; <C971/RWW111887>
|
|
move.l a1,HITTESTHook(a0) ; <C971/RWW111887>
|
|
|
|
clr.l newTEFlags(a0) ; <PMAB381/RWW020488>
|
|
|
|
clr.l newTEFlags+4(a0) ; <1/9/90smb> storage for double-byte char
|
|
|
|
; added for SMgr's C2P interface <2/8/90smb>
|
|
lea Char2Pixel,a1 ; install SMgr-compatible routine here <2/8/90smb>
|
|
move.l a1,nWIDTHHook(a0) ; <2/8/90smb>
|
|
|
|
IF hasTextWidthHook THEN ; <17>
|
|
; added so developers can hook the TextWidth calls in TextEdit <18>
|
|
lea OldChar2Pixel,a1 ; install TextWidth routine as the default for the hook <18>
|
|
move.l a1,TextWidthHook(a0) ; <18>
|
|
ENDIF ; <17>
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEStylNew{ ( destRect, viewRect: Rect ): TEHandle };
|
|
; ** Added 5/23/86 by MBK **
|
|
;
|
|
; TEStyleNew sets txSize to -1 and stores a handle to the
|
|
; style information in txFont, txFace. The LineHeight and
|
|
; FontAscent fields are set to -1.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;TEStyleNew ; comment out for now <45>
|
|
TEStylNew
|
|
Link A6,#0
|
|
MoveM.L D2-D7/A2-A4,-(SP) ; Save regs
|
|
|
|
Clr.L 16(A6) ; return NIL
|
|
|
|
MoveQ #teRecSize,D0 ; Allocate a record
|
|
_NewHandle ,CLEAR
|
|
Bne badExit ; escape if error <C971/RWW102887>NO
|
|
|
|
Move.L A0,A4 ; save handle
|
|
|
|
_HLock ; get object handle and lock it
|
|
Move.L (A4),A3 ; dereference it
|
|
|
|
MoveQ #0,D0 ; get text handle
|
|
_NewHandle
|
|
Bne badExit ; escape if error <C971/RWW102887>NO
|
|
Move.L A0,teTextH(A3)
|
|
|
|
; Dest and view rect must be together in record
|
|
Lea teDestRect(A3),A0 ; point to rects in beginning
|
|
Move.L 12(A6),A2 ; Get dest rectangle arg
|
|
Move.L (A2)+,(A0)+ ; save away in record
|
|
Move.L (A2)+,(A0)+
|
|
Move.L 8(A6),A2 ; Get view rectangle arg
|
|
Move.L (A2)+,(A0)+ ; save away in record
|
|
Move.L (A2)+,(A0)+
|
|
|
|
; Set size to -1 to indicate this is a stylish record & allocate handle to style
|
|
Move.W #-1,teSize(A3) ; set style flag (Go style)
|
|
MoveQ #teStylSize,D0 ; min size is for 1 style descriptor
|
|
Bsr MyNewHandle ; get handle to style info ** <C381/7nov86/MBK> **
|
|
Move.L A0,teStylesH(A3) ; former txFont location
|
|
|
|
; Get Style Handle for storing font, face, size, and color
|
|
MoveQ #stRecSize,D0 ; size of style descriptor
|
|
Bsr MyNewHandle ; get StyleHandle <C971/RWW102887>NO
|
|
Move.L teStylesH(A3),A2 ; handle to style info
|
|
Move.L (A2),A2 ; dereference
|
|
Move.L A0,styleTab(A2) ; store handle to styles array
|
|
|
|
; Get handle to array of largest line height on each line
|
|
MoveQ #4,D0 ; Make room for one entry in line height array
|
|
Bsr MyNewHandle ; allocate handle to line hites <C971/RWW102887>NO
|
|
Move.L A0,A1 ; save handle
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L A1,lhTab(A0) ; store line hites handle
|
|
|
|
; Save the GrafPort and save default style from GrafPort
|
|
Move.L GrafGlobals(A5),A1 ; get lisagraf globals and then
|
|
Move.L thePort(A1),A1 ; thePort
|
|
Move.L A1,teGrafPort(A3) ; save this port
|
|
Move.W txMode(A1),teMode(A3) ; save the mode
|
|
|
|
MoveQ #1,D0 ; length of text + 1
|
|
Bsr GetDefStyle ; save default style in StyleRec
|
|
|
|
; Store one entry in line height array
|
|
Move.L teStylesH(A3),A0 ; style handle
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L lhTab(A0),A1 ; handle to line height table
|
|
Move.L (A1),A1 ; dereference
|
|
Move.L styleTab(A0),A0 ; handle to StyleRec's
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
Move.W stAscent(A0),2(A1) ; save ascent
|
|
Move.W stHeight(A0),(A1) ; save line height
|
|
|
|
Move.W #$FFFF,teAscent(A3) ; won't be used unless somebody
|
|
Move.W #$FFFF,teLineHite(A3) ; sets the ascent and line height
|
|
|
|
Move.L TEWdBreak,teWordBreak(A3) ; Set global word breaker
|
|
|
|
Lea DefClikProc,A0 ; setup default click proc
|
|
Move.L A0,teClikProc(A3)
|
|
|
|
|
|
Bsr InstallIntDispatch ; install new internal dispatch tbl <C971/RWW110387>
|
|
Bsr.S InitRsrved ; init reserved handle
|
|
|
|
Move.L teTextH(A3),A0 ; need to unlock text handle ** <C381/7nov86/MBK> **
|
|
_HUnlock ; MyNewHandle locked it ** <C381/7nov86/MBK> **
|
|
|
|
Move.L A4,A0 ; set up for HUnlock
|
|
_HUnlock
|
|
Move.L A4,16(A6) ; return handle
|
|
|
|
MoveQ #8,D0
|
|
Bra Std2Exit ; <C971/RWW102887>NO
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE InitRsrved;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to create the nullStyle handle.
|
|
;----------------------------------------------------------------------
|
|
InitRsrved
|
|
Move.L A2,-(SP) ; save reg
|
|
MoveQ #nullStSize,D0 ; size of reserved handle
|
|
Bsr.S MyNewHandle ; NewHandle with error checking
|
|
Move.L teStylesH(A3),A2 ; get style handle
|
|
Move.L (A2),A2 ; deref
|
|
Move.L A0,nullStyle(A2) ; store new handle
|
|
; <S508/RWW062388> MyNewHandle could thrash the heap. Gotta save this handle for later.
|
|
Move.L A0,-(SP) ; Save off the handle <S508/RWW062388>
|
|
|
|
MoveQ #scrpRecSize+2,D0 ; size of scrap handle
|
|
; what? AddQ #2,D0 ; include room for # of styles <C971/RWW102687>
|
|
Bsr.S MyNewHandle ; NewHandle with error checking
|
|
; <S508/RWW062388> This pulls off the nullStyle handle we saved a few lines ago.
|
|
; not needed. Move.L nullStyle(A2),A2 ; get reserved handle
|
|
Move.L (SP)+,A2 ; Retrieve nullStyle handle <S508/RWW062388>
|
|
Move.L (A2),A2 ; deref
|
|
Move.L A0,nullScrap(A2) ; store new scrap handle
|
|
|
|
; what? Move.L nullScrap(A2),A0 ; get handle to scrap for null selection <C971/RWW102687>
|
|
Move.L (A0),A0 ; deref
|
|
Move.W #0,scrpNStyles(A0) ; indicate no style
|
|
|
|
Move.L (SP)+,A2 ; restore reg
|
|
Rts
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE MyNewHandle
|
|
; ** <C381/7nov86/MBK> **
|
|
;
|
|
; MyNewHandle unlocks the TEHandle and the text handle, attempts
|
|
; to allocate memory for a handle, calls system error if there is one,
|
|
; And otherwise relocks TEHandle and the text handle.
|
|
;
|
|
; Entry:
|
|
; D0: requested handle size
|
|
; A3: Ptr to TERec
|
|
; A4: Handle to TERec
|
|
;
|
|
; Exit:
|
|
; A0: the handle
|
|
; A3: Could have a different value if memory was shifted
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
MyNewHandle
|
|
Move.L D0,-(SP) ; save input
|
|
Move.L teTextH(A3),A0 ; text handle
|
|
_HUnlock ; make it easy to get memory
|
|
Move.L A4,A0 ; TEHandle
|
|
_HUnlock ; make it easy to get memory
|
|
Move.L (SP)+,D0 ; get the input
|
|
_NewHandle ; do it
|
|
Bne badExit ; fly away if system error
|
|
|
|
Move.L A0,-(SP) ; save handle
|
|
Move.L A4,A0 ; get TEHandle
|
|
_HLock ; relock it
|
|
Move.L (A4),A3 ; reset TEPtr
|
|
Move.L teTextH(A3),A0 ; text handle
|
|
_HLock ; lock that too
|
|
Move.L (SP)+,A0 ; restore handle
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEUpdate( r: Rect; h: TEHandle )
|
|
;
|
|
; Redraws the entire object sected by r
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEUpdate
|
|
Bsr StdEntry
|
|
|
|
Move.L (A2)+,A0 ; get rect
|
|
Bsr Refresh
|
|
|
|
; if window is active, don't bother with outlining. <16Oct89smb>
|
|
tst.b teActive(a3)
|
|
beq.s @TestOutline
|
|
|
|
Bra epilog8
|
|
|
|
@TestOutline
|
|
; if outlining is on, redraw outline! <16Oct89smb>
|
|
with OutlineFrame
|
|
link a6,#OutlineFrameSz ; only link if outlining
|
|
move teSelStart(a3),d0 ; is this a selection point?
|
|
cmp teSelEnd(a3),d0
|
|
bne.s @drawRegion ; fall through for caret processing
|
|
|
|
; is outlining desired?
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq.s @drawRegion ; outline bit not on
|
|
; if caret on invert it
|
|
tst.b teCarOn(a3)
|
|
beq.s @noDraw
|
|
bsr DrawIt
|
|
@noDraw
|
|
; turn on flag in case off - want to display an outlined caret
|
|
st teCarOn(a3) ; will be turned off in HideCaret
|
|
@drawRegion
|
|
bsr InitOutline
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq.s @noOutline ; outline bit not on
|
|
st teActive(a3) ; flag as active for hiliting
|
|
bsr HideCaret ; hide the caret
|
|
bsr.s HiLite ; Frame new region
|
|
sf teActive(a3) ; flag as inactive
|
|
sf paintFlag(a6) ; don't paint region!
|
|
bsr TEOutlineHilite
|
|
@noOutline
|
|
unlk a6
|
|
Bra epilog8
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; A local cover for do find called from TEClick
|
|
;
|
|
; This takes a character index in D6 and expands it into D0,D1
|
|
; For character select mode, it simply copies it into D0,D1, but
|
|
; for word select, it locates the surrounding word and returns
|
|
; D0,D1 pointing to the word start and end(Respectively)
|
|
; Long at D5 negative if word select
|
|
;
|
|
;----------------------------------------------------------------------
|
|
ClickExpand
|
|
Move D6,D0 ; default for no-word select
|
|
Move D6,D1 ;
|
|
Tst.L D5 ; see if word select (if negative)
|
|
Bpl.S byebye
|
|
Bsr FindWord ; find word @D0
|
|
byebye
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE HiLite;
|
|
;
|
|
; A3 is dereferenced object
|
|
;
|
|
; Now this pins the selStart and selEnd to the viewRect lines
|
|
;
|
|
;----------------------------------------------------------------------
|
|
HiLite
|
|
Tst.B teActive(A3) ; don't do if not active
|
|
Beq.S byebye
|
|
|
|
MoveM teSelStart(A3),D3-D4 ; disp start is D3, disp end is D4
|
|
|
|
MoveQ #teHighlight,D7 ; set mark mode
|
|
Bra DoText ; Remove old selection
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEClick( pt: Point; extend: BOOLEAN; h: TEHandle );
|
|
;
|
|
; Uses:
|
|
; D6 as a character index corresponding to the current mouse point
|
|
; D5 a copy of the previous D6
|
|
; D5 long sign minus if word select
|
|
; A2 anchor left point for hilighting selection
|
|
; A4 anchor right for hilighting selection (bad! bad! bad!) <27>
|
|
; a4 teHandle across other TE routines <27>
|
|
; D0 for left of word at click spot
|
|
; D1 for right of word at click spot
|
|
; D3 split dispStarts for left and right piece of highlight
|
|
; D4 split dispEnds for left and right piece of highlight
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEClick
|
|
Bsr StdEntry
|
|
Bsr ClearRsrved ; clear out reserved style
|
|
|
|
; Find the new point and get index of it in D6
|
|
Move.L 14(A6),teSelPoint(A3) ; pass selPoint
|
|
Bsr DoFind ; juggle dispStart/End and do find
|
|
|
|
Bsr HideCaret ; Remove caret
|
|
|
|
SubQ #4,SP ; make room for the tickCount
|
|
_TickCount
|
|
Move.L (SP)+,D0 ; Ticks in D0
|
|
|
|
Sub.L teClikTime(A3),D0 ; see if double click
|
|
add.l d0,teClikTime(a3) ; Update click time for click proc. <4>
|
|
|
|
Cmp.L DoubleTime,D0 ; 1/2 second click time
|
|
Sle D5 ; D5 = 0 if single click
|
|
Cmp teClikLoc(A3),D6 ; see if same location
|
|
Seq D1
|
|
And.B D1,D5 ; D5 ST if double click
|
|
RoR.L #8,D5 ; get switch in high D5
|
|
|
|
Move D6,teClikLoc(A3) ; double click only if not moved
|
|
|
|
; synch the keyboard to the font <10Nov88smb>
|
|
tst.w teSize(a3) ; if unstyled, try synch keyboard even if we don't
|
|
IF forLocalizability THEN ; have all info <31g-YDS-8/27/91>
|
|
bmi.w @Styled ; styles !!!
|
|
tst.w teLength(A3) ; do we have text at all ?
|
|
beq.w @NoSynch ; don't synch if no text !!!
|
|
|
|
IF 0 THEN ; now using 'itlb' flag in CubeE <45>
|
|
; 6.1 : synch only r->l, for 7.0 synch for double byte
|
|
;; tst.b WordRedraw ; is it a R->L script ? <34>
|
|
;; bge.w @NoSynch ; don't synch. <34>
|
|
; Really want to synchronize for unstyled text in ALL scripts. However, this will cause problems for <34>
|
|
; input methods, so we will skip this code in this case. (WordRedraw only indicates the <34>
|
|
; types of scripts installed and not the current one…) <34>
|
|
subq #2,sp ; result space for Font2Script & GetScript <34>
|
|
move.w teFont(a3),-(sp) ; app font id <34>
|
|
_Font2Script ; it's a non-roman char so get script font <34>
|
|
move.w (sp)+,d0 ; <34>
|
|
beq @UseFont ; if Roman then always synchronize <34>
|
|
cmp.w #smEastEurRoman,d0 ; Extended Roman? <38>
|
|
beq @NoSynch ; If so, never synchronize <38>
|
|
subq #4,sp ; result space <34>
|
|
move.w d0,-(sp) ; script <34>
|
|
move.w #smScriptRedraw,-(sp) ; <34>
|
|
_GetScript ; <34>
|
|
move.l (sp)+,d1 ; <34><37>
|
|
tst.b d1 ; leave in d1 for later <34><37>
|
|
bgt @NoSynch ; if double-byte script don't synchronize <34>
|
|
; otherwise, we have a single-byte non-Roman font <34>
|
|
; IF SysVers > $610 THEN
|
|
; move.l teDispatchH(a3),a0 ;
|
|
; move.l (a0),a0
|
|
; move.l newTEFlags(a0),d0 ; move into reg the flags
|
|
; btst #teFInlineInput,d0 ; are we in an inline input window ?
|
|
; bne.w @NoSynch ; yes, don't synch keyboard.
|
|
; ENDIF
|
|
|
|
ELSE ; now using 'itlb' flag in CubeE <45>
|
|
|
|
; optimize for Roman-only: do not have to synch font & kbd <50>
|
|
with smgrRecord ; <50>
|
|
GetSMgrCore a0 ; load SMgr globals pointer. <50>
|
|
cmp.b #1,smgrEnabled(a0) ; how many scripts enabled? <50>
|
|
beq @NoSynch ; skip synchronization for Roman-only system <50>
|
|
endwith ; <50>
|
|
|
|
subq #6,sp ; result space for Font2Script & GetScript <45>
|
|
move.w teFont(a3),-(sp) ; app font id <45>
|
|
_Font2Script ; get script font <45>
|
|
; script left on stack ; <45>
|
|
move.w #smScriptFlags,-(sp) ; now get script-specific flags <45>
|
|
_GetScript ; <45>
|
|
move.l (sp)+,d0 ; <45>
|
|
and.l #(1<<smsfSynchUnstyledTE),d0 ; leave only the synchronize bit <45>
|
|
beq @NoSynch ; 0=> do not synchronize <45>
|
|
; otherwise synchronize
|
|
ENDIF ; now using 'itlb' flag in CubeE <45>
|
|
|
|
|
|
move.w d6,d3 ; don't trash d6
|
|
tst.b teLftClick(a3) ; check if the click was on the previos char.
|
|
bne.s @2 ; else sub 1
|
|
sub.w #1,d3 ; see the char we clicked (from 0 !!!)
|
|
@2
|
|
; Check char to determine how to synch
|
|
move.l teTextH(a3),a2 ; handle to text <37>
|
|
move.l (a2),a0 ; ptr to text <37>
|
|
move.b 0(a0,d3.w),d0 ; get character <37>
|
|
cmp.b #$20,d0 ; control char? <37>
|
|
blo @NoSynch ; if so, don't synch <37>
|
|
move.b d1,-(sp) ; save scriptRedraw <37>
|
|
subq #2,sp ; room for return
|
|
move.l a0,-(sp) ; push text ptr on stack <37>
|
|
move.w d3,-(sp) ; offset on stack
|
|
_CharType ; what char is it
|
|
move.w (sp)+,d0 ; take result
|
|
move.b (sp)+,d1 ; recover scriptRedraw <37>
|
|
|
|
; Mask off what interested in: the Type ($000F) and the Direction ($2000) <34>
|
|
; Want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman letter <34>
|
|
; which can be smCharAscii (1) or smCharEuro (7) or smCharPunct (0). <34>
|
|
;
|
|
; New approach. Different behavior for bidi and non-bidi scripts, because of caret <37>
|
|
; requirements for bidi scripts. <37>
|
|
bne.s @doBidi ; check scriptRedraw for bidi <37>
|
|
; For non-bidirectional scripts, set keyboard to Roman for Roman letters, <37>
|
|
; sync to font for script letters, dont sync for anything else. <37>
|
|
and.w #smcTypeMask,d0 ; isolate info we need <37>
|
|
cmp.w #smCharPunct,d0 ; non-letter? <37>
|
|
beq.s @NoSynch ; if so, don't synch keyboard <37>
|
|
cmp.w #smCharAscii,d0 ; low-ASCII Roman? <37>
|
|
beq.s @isRoman ; if so, go set keyboard <37>
|
|
cmp.w #smCharEuro,d0 ; Extended ASCII Roman? <37>
|
|
beq.s @isRoman ; if so, go set keyboard <37>
|
|
bra.s @UseFont ; otherwise, sync keyboard to font <37>
|
|
; For bidirectional scripts, don't synch control chars (stripped out above) or low-ASCII <37>
|
|
; (L-R) digits; synch other L-R chars to Roman, and everything else to font script. <37>
|
|
@doBidi ; <37>
|
|
and.w #smcTypeMask+smcClassMask+smcRightMask,d0 ; isolate info we need <37>
|
|
cmp.w #smCharPunct+smPunctNumber+smCharLeft,d0 ; is char a low-ASCII digit? <37>
|
|
beq.s @NoSynch ; if so, don't synch <37>
|
|
and.w #smcRightMask,d0 ; now just check direction <37>
|
|
beq.s @isRoman ; if left-right, sync to Roman <37>
|
|
|
|
; Otherwise, synch the font to the script of the character <34>
|
|
@UseFont
|
|
subq #2,sp ; room for return
|
|
move.w teFont(a3),-(sp) ; app font id
|
|
_Font2Script ; it's a non-roman char so get script font
|
|
; leave script on stack
|
|
bra.s @SetKbd
|
|
|
|
@isRoman move.w #smRoman,-(sp) ; we think it is roman
|
|
@SetKbd
|
|
move.w (sp), d0 ; script param on the stack
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0 ;
|
|
move.b d0, lastScript(a0) ; push script number used to highlight (d0) to lastScript
|
|
_KeyScript ; set keyboard
|
|
bra.s @NoSynch
|
|
ELSE
|
|
bpl.s @NoSynch
|
|
ENDIF
|
|
|
|
@Styled move.w d6,d0
|
|
beq.s @BufferStart ; <6Dec89smb>
|
|
IF forLocalizability THEN ; <31e-YDS-8/27/91>
|
|
tst.b WordRedraw ; do we have a R->L script
|
|
bge.s @BufferStart ; no, take the prev allways
|
|
tst.b teLftClick(a3) ; check if the click was on the previos char.
|
|
bne.s @BufferStart ; else sub 1;
|
|
ENDIF
|
|
sub.w #1,d0 ; backup one to get previous style <6Dec89smb>
|
|
@BufferStart
|
|
move.w d0,d3 ; save offset position <6Dec89smb>
|
|
bsr GetCurStyle ; returns ptr to current style in a0
|
|
bsr SetStyle ; set the font in the grafport
|
|
move.w d3,d0 ; char offset needed in ClickKeyboard2Font <6Dec89smb>
|
|
bsr ClickKeyboard2Font ; sink up! <3Dec89smb>
|
|
;; bsr SetKeyboard2Font ; sink up!
|
|
@NoSynch
|
|
|
|
; D6 now contains the character location at which to look
|
|
;
|
|
; Find out if we want an extended selection or a normal one
|
|
; For an extended selection, fake out the loop below by fooling it into thinking
|
|
; we've already entered it "normally" but with the old selection already
|
|
; hilighted, etc.
|
|
|
|
move.l a4,-(sp) ; preserve teHandle for hook calls <27>
|
|
; <27>
|
|
Tst.B 12(A6) ; see if extend flag is on
|
|
Beq.S notExtended
|
|
|
|
MoveM teSelStart(A3),D0-D1 ; get old selection
|
|
Cmp D6,D0 ; chk side of new loc
|
|
Bhs.S useRight
|
|
Move D0,A2 ; save anchor left
|
|
Move D0,A4 ; and anchor right
|
|
Bra.S goToIt
|
|
useRight
|
|
Move D1,A2 ; save anchor left
|
|
Move D1,A4 ; and anchor right
|
|
goToIt
|
|
Move D6,D5
|
|
Bra.S goSelect
|
|
|
|
notExtended
|
|
; a4 ok here due to bra to this point <27>
|
|
Bsr HiLite ; Remove old selection
|
|
MoveQ #teWordSelect,D2 ; say "ClickExpand, word selection" <EHB 01Oct85>
|
|
Bsr ClickExpand ; <C971/RWW102887>NO
|
|
; D0/D1 now contain the "bounds" of this click
|
|
MoveM D0-D1,teSelStart(A3)
|
|
Move D0,A2 ; save anchor left
|
|
Move D1,A4 ; and anchor right
|
|
Move D6,D5 ; save "old" D6
|
|
; remember whether initial click was to left or right of character
|
|
Move.B teLftClick(A3),teLftCaret(A3)
|
|
|
|
move.l a4,-(sp) ; save current use of a4 across calls <27>
|
|
move.l 4(sp),a4 ; restore teHandle <27>
|
|
Bsr ShowCaret ; feedback to user
|
|
Bsr HiLite
|
|
move.l (sp)+,a4 ; restore TEClick's use of a4 <27>
|
|
|
|
waitLoop
|
|
Move.L teClikProc(A3),D0 ; call the click proc
|
|
Beq.S noClikProc
|
|
Move.L D0,A0
|
|
Jsr (A0)
|
|
Beq done1 ; if returns zero abort drag <SM7> CSS
|
|
|
|
noClikProc
|
|
Clr -(SP) ; make room for result
|
|
_WaitMouseUp ; see if button still down
|
|
Tst.b (SP)+ ; pop result, only check significant byte <36>
|
|
Beq.S done1
|
|
|
|
Pea teSelPoint(A3) ; pass address for point
|
|
_GetMouse
|
|
|
|
move.l a4,-(sp) ; save current use of a4 across calls <27>
|
|
move.l 4(sp),a4 ; restore teHandle <27>
|
|
Bsr.S DoFind ; juggle dispStart/End and do find
|
|
move.l (sp)+,a4 ; restore TEClick's use of a4 <27>
|
|
|
|
Cmp D6,D5 ; see if change
|
|
Beq.S waitLoop
|
|
|
|
move.l a4,-(sp) ; save current use of a4 across calls <27>
|
|
move.l 4(sp),a4 ; restore teHandle <27>
|
|
Bsr HideCaret
|
|
move.l (sp)+,a4 ; restore TEClick's use of a4 <27>
|
|
|
|
; There was a change so highlight only the new part. This is a really tricky part...
|
|
; The thing we're trying to do is highlight only the part that changes of the
|
|
; selection which is being dragged out in this loop
|
|
|
|
goSelect
|
|
MoveQ #teWordDrag,D2 ; say "ClickExpand, word dragging"
|
|
Bsr ClickExpand ; Get new points
|
|
|
|
Lea teSelEnd(A3),A0 ; point between selStart/End
|
|
|
|
Cmp D6,A4 ; see if less than anchor right
|
|
Blo.S notToLeft ; skip if not to left of anchor
|
|
Move -(A0),D3 ; save previous left
|
|
Move D0,(A0)+ ; save new left (in teSelStart!)
|
|
Move D0,D4 ; save dispEnd too
|
|
Swap D3
|
|
Swap D4
|
|
Move A4,D3 ; save other dispStart
|
|
Move (A0),D4 ; save other dispEnd (old teSelEnd)
|
|
Move A4,(A0)
|
|
Bra.S hiliteIt
|
|
|
|
|
|
notToLeft
|
|
Cmp D6,A2 ; see if greater than anchor left
|
|
Bhi.S keepWaiting ; skip if not to right of anchor
|
|
Move (A0),D3 ; save previous right
|
|
Move D1,(A0) ; save new right
|
|
Move D1,D4 ; save dispEnd too
|
|
Swap D3
|
|
Swap D4
|
|
Move -(A0),D3 ; save other dispEnd
|
|
Move A2,D4 ; save other dispStart
|
|
Move A2,(A0)+
|
|
|
|
|
|
hiliteIt
|
|
move.l a4,-(sp) ; save current use of a4 across calls <27>
|
|
move.l 4(sp),a4 ; restore teHandle <27>
|
|
MoveQ #teHighlight,D7 ; set mark mode
|
|
Bsr DoText ; do one half
|
|
|
|
Swap D3 ; get other dispStart/End
|
|
Swap D4 ; and hilight too
|
|
Bsr DoText ; and other half
|
|
move.l (sp)+,a4 ; restore TEClick's use of a4 <27>
|
|
|
|
keepWaiting
|
|
Move D6,D5 ; save new end
|
|
|
|
Bra.S waitLoop ; continue on
|
|
done1
|
|
move.l (sp)+,a4 ; restore teHandle for the last time <27>
|
|
Bsr ShowCaret ; redisplay caret
|
|
|
|
; ** <C139/23Sep86/MBK> ** Save tick count at the end of TEClick so that
|
|
; extra TextEdit computing time will not be counted between clicks
|
|
|
|
SubQ #4,SP ; make room for the tickCount
|
|
_TickCount
|
|
Move.L (SP)+,teClikTime(A3) ; remember click time
|
|
|
|
epilog10
|
|
MoveQ #10,D0
|
|
Bra StdExit
|
|
|
|
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoFind
|
|
;
|
|
; Take the teSelPoint(A3) and return D6 w/corresponding char index
|
|
;
|
|
; Exit
|
|
; D6 contains the selection index returned from DoText
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
DoFind
|
|
|
|
; find out which text line it's on
|
|
|
|
Move teSelPoint+v(A3),D0 ; i:=(selPoint.v-destRect.top)
|
|
Bsr PtToLine ; line index in D0
|
|
Bge.S southPole ; below the last line
|
|
|
|
Add D0,D0 ; double D0
|
|
Bpl.S noPole ; default if i < 0 is D6 = 0
|
|
northPole
|
|
MoveQ #0,D6 ; if above point to beginning
|
|
Rts
|
|
southPole
|
|
Move teLength(A3),D6 ; return index(t):=length
|
|
Rts
|
|
noPole
|
|
MoveM teLines(A3,D0),D3-D4 ; dispStart := lines[i]
|
|
MoveQ #teFind,D7 ; set find mode
|
|
Bsr DoText ; return index(t) in D0
|
|
Move D0,D6 ; return in D6
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Pixel2Char
|
|
; ** Added 6/18/86 MBK **
|
|
;
|
|
; Entry:
|
|
; D0.W: length of block (style run)
|
|
; D1.W: pixel width relative to start of block
|
|
; D2.W: slop
|
|
; A0: ptr to start of block
|
|
;
|
|
; Exit:
|
|
; D0 (low word) pixel width to character offset in block
|
|
; (high word) boolean = TRUE (0001) if offset corresponding to
|
|
; the given pixel width was found
|
|
; D1.W: character offset
|
|
; D2.W: flagged (0001) if hit on leading edge of char
|
|
;
|
|
; Must preserve A2 for DoSearch.
|
|
;----------------------------------------------------------------------
|
|
Pixel2Char
|
|
Move.L JPixel2Char,-(SP) ; call the Pixel2Char Routine
|
|
Rts
|
|
|
|
vPixel2Char
|
|
with P2CFrame
|
|
link a6,#locals
|
|
move.l a0,textPtr(a6) ; save for result
|
|
move.w d1,pixelWidth(a6) ; save for SMgr P2C (and width used for 7.0)
|
|
|
|
; use NPixel2Char now for a faster and more powerful hit-test routine! <23>
|
|
subq #2,sp
|
|
move.l a0,-(sp) ; pass text ptr to buffer
|
|
and.l #$0000FFFF,d0 ; want length as a longint
|
|
move.l d0,-(sp)
|
|
swap d2 ; here's the slop
|
|
clr.w d2 ; as a FIXED
|
|
move.l d2,-(sp)
|
|
move.w d1,txtWidth(a6) ; save for result
|
|
swap d1 ; pass de pixel width
|
|
clr.w d1 ; as a FIXED
|
|
move.l d1,-(sp)
|
|
pea leadingEdge(a6) ; leadingEdge is a var
|
|
pea widthRemaining(a6) ; width remaining is a var & FIXED
|
|
move.w #smOnlyStyleRun,-(sp) ; default style run position
|
|
move.l #$00010001,d0 ; default 1/1 scaling
|
|
move.l d0,-(sp) ; push numer
|
|
move.l d0,-(sp) ; push denom
|
|
_NPixel2Char
|
|
move.w (sp)+,d1 ; returns the char offset
|
|
move.w txtWidth(a6),d0 ; return initial width for a hit
|
|
moveq #0,d2 ; must clear since DoSearch tests it
|
|
tst.w widthRemaining(a6) ; is there a hit? (FIXED result)
|
|
bmi.s @SetLEFlag ; yep
|
|
sub.w widthRemaining(a6),d0 ; return actual measured width
|
|
|
|
@SetLEFlag
|
|
; indicate to DoSearch that SMgr's P2C used hence leadingEdge flag is valid
|
|
bset #16,d2 ; flag that P2C used
|
|
move.b leadingEdge(a6),d2 ; renamed from leftSide <23>
|
|
bne.s @finis ; bra if leadingEdge is T since whole character fits <20>
|
|
; decrement if LeadingEdge is F to be sure whole character will display <20>
|
|
; backup correctly for either single or double byte text
|
|
movem.l d0/d2/d3/d6,-(sp) ; <20>
|
|
move.l textPtr(a6),a0 ; pointer to text measured <21>
|
|
move.l teTextH(a3),a1 ; <21>
|
|
move.l (a1),a1 ; <21>
|
|
suba.l a1,a0 ; offset of this text <21>
|
|
move.w a0,-(sp) ; save for decrement <21>
|
|
move.w d1,d6 ; DoubleByte wants offset here <21>
|
|
add.w a0,d6 ; current position <20>
|
|
move.w #-1,d3 ; incremental direction to move <20>
|
|
bsr DoubleByte ; <20>
|
|
move.w d6,d1 ; new position <20>
|
|
sub.w (sp)+,d1 ; restore as an offset w/in this text <21>
|
|
movem.l (sp)+,d0/d2/d3/d6 ; <20>
|
|
@finis
|
|
unlk a6
|
|
rts
|
|
endWith
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoSearch
|
|
; ** Rewritten 6/18/86 MBK **
|
|
;
|
|
; Used to determine hit-test of a character
|
|
; <4May89smb> gave DoSearch a face-lift
|
|
; On Entry:
|
|
; d3 start offset
|
|
; d4 end offset
|
|
; a3 ptr to teRecord
|
|
;
|
|
; On Exit:
|
|
; d0 character offset where hit
|
|
; leftSide (leading Edge!) set for knowing where the caret should appear
|
|
;----------------------------------------------------------------------
|
|
DoSearch
|
|
|
|
; ** <C139/10Sep86/MBK> ** Modified to call Preamble to get A2; the index
|
|
; is in D0, but don't use it since it's not
|
|
; documented in Inside Mac
|
|
|
|
with TextFrame,TEFormatOrder
|
|
Bsr Preamble ; get A2 from D3
|
|
|
|
Move (A2),D3 ; set left anchor <14Jan86>
|
|
Move D3,D4 ; init char counter
|
|
|
|
Bsr LineRect ; set rLine to A2 line
|
|
|
|
Move (A2),D7 ; set left anchor
|
|
sf teLftClick(A3) ; assume false for later! <4May89smb>
|
|
|
|
Move.W teSelPoint+h(A3),D5 ; get h coord
|
|
Sub.W teSelRect+left(A3),D5 ; subtract justification
|
|
|
|
; set d0 and teLftClick(a3) if at left of selRect <4May89smb>
|
|
ble @BailToLeft ; special case on left of whole line
|
|
;;<1/25/90smb> if zero width, want to branch ow this one pixel difference causes the
|
|
;;<1/25/90smb> caret to display on the wrong line ending. (Roman fix)
|
|
;;<1/25/90smb> blt @BailToLeft ; special case on left of whole line <16Aug89smb>
|
|
|
|
Move teSelRect+left(A3),teSelRect+right(A3); init right side to left
|
|
Move.W #UnboundLeft,teSelRect+left(A3); bogus left
|
|
|
|
Move.W 2(A2),D6 ; end of line
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bmi.S @StyledRecord
|
|
|
|
st useOldMethod(a6)
|
|
MoveQ #1,D2 ; just 1 style
|
|
Move.W D3,D1 ; start of line
|
|
Move.W D6,D0 ; whole line
|
|
Bra @DoMeasure
|
|
|
|
@StyledRecord
|
|
sf useOldMethod(a6) ; flag for getting style runs <28Sept88smb>
|
|
; determine if display order is different from backin-store order <28Sept88smb>
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
bge.s @getStyleOld ; nope, only L->R directional text
|
|
|
|
Move.W D3,D0 ; start offset
|
|
Move.W D6,D1 ; end of selection
|
|
bsr GetStylesInOrder ; <15Nov88smb>
|
|
; tests whether any styles to process <15Nov88smb>
|
|
bge.s @GetStyleHandle ; <15Nov88smb>
|
|
bra @NoMoreStyles ; done <15Nov88smb>
|
|
|
|
@getStyleNew
|
|
; get next style using the results from getFormatOrder <28Sept88smb>
|
|
;; <5Aug89smb> movea.l a2StyleRun(a6),a0
|
|
; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!)
|
|
; Get to posn in styleRun array via the Style Handle and saved offset <5Aug89smb>
|
|
move.l teStylesH(a3),a0 ; <5Aug89smb>
|
|
move.l (a0),a0 ; deref <5Aug89smb>
|
|
add.l a2StyleRun(a6),a0 ; add in offset to desired posn in the array <5Aug89smb>
|
|
move.w fmtOrderingIndex(a6),d0 ; index (0-d2) into array for next style run
|
|
;; mulu #2,d0 ; index into fmtOrdering array
|
|
lsl.w #1,d0 ; index into fmtOrdering array <28June89smb>
|
|
lea.l fmtOrderingPtr(a6),a1 ; get ptr to array of format runs ordering <15Nov88smb>
|
|
move.l (a1),a1 ; dereference for ordering <15Nov88smb>
|
|
move.w 0(a1,d0.w),d0 ; index of next style run
|
|
;; mulu #stStartSize,d0 ; offset in styleRun array from d3 style run
|
|
lsl.w #lnStStartSize,d0 ; offset in styleRun array from d3 style run <28June89smb>
|
|
lea.l 0(a0,d0.w),a0 ; next style run
|
|
addq #1,fmtOrderingIndex(a6) ; incr the style run counter
|
|
subq #1,d2 ; dec the style counter
|
|
bge.s @GetStyleHandle
|
|
bra @NoMoreStyles ; done
|
|
|
|
@getStyleOld
|
|
st useOldMethod(a6)
|
|
Move.W D3,D0 ; get selection start!!!
|
|
Move.W D6,D1 ; end of line
|
|
Bsr GetCurStyle ; get its style <7Oct88smb>
|
|
Bsr GetNumStyles ; # of styles between offsets <7Oct88smb>
|
|
Move.W D0,D2 ; preserve # of styles
|
|
|
|
@GetStyleHandle
|
|
Move.L A0,A2 ; preserve ptr to current style
|
|
Move.L teStylesH(A3),A0 ; handle to style info ** <C381/6nov86/MBK> **
|
|
_HLock ; lock it up ** <C381/6nov86/MBK> **
|
|
Move.L A2,A0 ; restore style ptr ** <C381/6nov86/MBK> **
|
|
|
|
@StyleLoop
|
|
Move.L A0,A2 ; save ptr to style start
|
|
Bsr SetStyle ; set the style
|
|
Move.W startChar(A0),D1 ; get start of style
|
|
|
|
AddQ.L #stStartSize,A0 ; pt to next style run in StyleRun array
|
|
Move.W startChar(A0),D0 ; want end of this style run
|
|
|
|
Cmp.W D3,D1 ; compare styleStart to beginning of line
|
|
Bhs.S @OnSameLine ; made this unsigned ** <C381/6nov86/MBK> **
|
|
Move.W D3,D1 ; set beginning of style to beginning of line
|
|
|
|
@OnSameLine
|
|
Move.W D1,D7
|
|
Cmp.W D0,D6 ; compare styleEnd to end of line
|
|
Bhs.S @DoMeasure ; made this unsigned ** <C381/6nov86/MBK> **
|
|
Move.W D6,D0 ; set end of style to end of line
|
|
|
|
@DoMeasure
|
|
Move.W D2,-(SP) ; style count
|
|
Sub.W D1,D0 ; length
|
|
Move.L teTextH(A3),A0 ; handle to text
|
|
Move.L (A0),A0 ; dereference
|
|
AddA.W D1,A0 ; add offset to start of line
|
|
Move.W D5,D1 ; get pixel offset
|
|
MoveQ #0,D2 ; slop ** <C139/22Sep86/MBK> **
|
|
; Bsr Pixel2Char ; measure all at once
|
|
Bsr TEHitTestHook ; call our hook instead <C971/RWW111887>
|
|
Add.W D0,teSelRect+right(A3) ; update selRect
|
|
Add.W D1,D7 ; update char offset
|
|
Sub.W D0,D5 ; update pixel offset
|
|
|
|
; find out if the pixel position was within the style run. <9Nov88smb>
|
|
|
|
ble.s @HitIt ; got a hit! (D5 <= 0)
|
|
;----------------------------------------------------------------------
|
|
; if at the last style, and pixel width > 0, and the TEHitTestHook is replaced, then
|
|
; must check the high word of d0 to see if we REALLY got a hit! <2/16/90smb>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l HITTESTHook(a0),a0
|
|
pea Pixel2Char
|
|
cmpa.l (sp)+,a0
|
|
beq.s @NotAHit
|
|
; we've been hooked out so test per the old interface specs for a hit.
|
|
swap d0
|
|
tst.b d0
|
|
bne.s @HitIt
|
|
@NotAHit
|
|
;----------------------------------------------------------------------
|
|
Move.L A2,A0 ; ptr to current style
|
|
moveq #0,d2 ; clear P2C flag from high word <7Dec89smb>
|
|
Move.W (SP)+,D2 ; restore style count
|
|
; if no more style runs (at right of selRect), set exit info <4May89smb>
|
|
beq.s @NoMoreStyles ; replaced next 2 lines <10>
|
|
;; bne.s @getNextStyle ; last style on line? <10>
|
|
;; bra.s @NoMoreStyles ; <10>
|
|
; get next style
|
|
@getNextStyle
|
|
tst.b useOldMethod(a6) ; is this a styled, RL record? <28Sept88smb>
|
|
beq @getStyleNew ; yes, use formatOrder array
|
|
|
|
; either unstyled or styled, LR record.
|
|
Addq.l #stStartSize,a0 ; get next style <7Oct88smb>
|
|
SubQ #1,D2 ; dec # of styles
|
|
Bne.S @StyleLoop ; keep looping if more <C971/RWW102887>NO
|
|
|
|
@NoMoreStyles
|
|
move.w #UnboundRight,teSelRect+right(A3) ; else store bogus right
|
|
; <29Mar89smb> need to set up a2 again w/ lineStart
|
|
move.w d3,d0
|
|
lea teLines(a3),a2
|
|
bsr GetLine
|
|
bra.s @BailToRight
|
|
|
|
; All of Bail new: <4May89smb>
|
|
; if at the Left of selRect then
|
|
; if TESysJust = 0
|
|
; then set (a2) and teLftClick = T.
|
|
; else set 2(a2) and teLftClick = F.
|
|
; if at the Right of selRect then
|
|
; if TESysJust = FFFF
|
|
; then set (a2) and teLftClick = T.
|
|
; else set 2(a2) and teLftClick = F.
|
|
|
|
; set d2 to indicate which side of rectangle we are on: 0 = Right, FF = Left. Cmp to line direction.
|
|
@BailToLeft
|
|
st d2 ; flag on L. side of selRect (ow is 0 for R. side)
|
|
@BailToRight
|
|
move.w 2(a2),d7 ; assume at end of line
|
|
cmp.b TESysJust,d2 ; compare edge of rectangle to line direction
|
|
beq.s @CRTest ; at EOL (R. edge of LR line OR L. edge of RL line)
|
|
move.w (a2),d7 ; know at Start of line
|
|
st teLftClick(a3) ; mark on left to keep caret on same line (see doCaret)
|
|
|
|
tst.b d2 ; since at Start of line don't need to test for CR
|
|
bne.s Done ; on left of selRect, no handle allocated
|
|
bra.s findDone ; test for style handle
|
|
|
|
; moved here <4May89smb>
|
|
@HitIt
|
|
addq.l #2,sp ; remove style count from stack
|
|
; if SMgr's P2C measured the text then the leftSide flag is valid <7Dec89smb>
|
|
tst.l d2 ; flag in high word; whole reg 0 if TextWidth used <7Dec89smb>
|
|
beq.s findDone ; TextWidth used, not SMgr's P2C <7Dec89smb>
|
|
bclr #16,d2 ; clean up! <7Dec89smb>
|
|
|
|
tst.b d2 ; left or right side of char? (set in P2C) ; <7Dec89smb> flag in byte
|
|
; undo what did in Pixel2Char (it was done for linebreaking and there's no way to know who called)
|
|
st teLftClick(A3) ; mark it to left
|
|
bne.s findDone ; bra if leadingEdge is T <20>
|
|
movem.l d2/d3/d6,-(sp) ; <20><23>
|
|
move.w d7,d6 ; current position <20>
|
|
move.w #1,d3 ; incremental direction to move <20>
|
|
bsr DoubleByte ; <20>
|
|
move.w d6,d7 ; new position <20>
|
|
movem.l (sp)+,d2/d3/d6 ; <20><23>
|
|
sf teLftClick(A3) ; mark it to right
|
|
; Only want to test for a CR if the charOffset = 2(a2) and the leftSide = T.
|
|
; CR is a neutral character therefore, if it follows a style run whose direction is
|
|
; different from the line direction, it will always occur at the EOL posn, in the
|
|
; line direction. <5May89smb>
|
|
; <1/24/90smb> need to set up a2 again w/ lineStart
|
|
move.w d3,d0 ; <1/24/90smb>
|
|
lea teLines(a3),a2 ; <1/24/90smb>
|
|
bsr GetLine ; <1/24/90smb>
|
|
cmp.w 2(a2),d7 ; EOL?
|
|
bne.s @doneTest
|
|
|
|
; Test for a CR <4May89smb>
|
|
@CRTest
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
Move.B -1(A0,D7),D0 ; <C971/RWW110387>
|
|
Bsr.S TEEOLHook ; normally compare d0 with $0D <C971/RWW110387>
|
|
beq.s HitCR ; is a CR, so backup 1 char and set teLftClick(a3)
|
|
@doneTest
|
|
tst.w d5
|
|
ble.s done ; if neg pixelWidth, no locked style handle
|
|
bra.s findDone ; not a CR
|
|
|
|
HitCR
|
|
SubQ #1,D7 ; adjust result to left half
|
|
ST teLftClick(A3) ; mark it to left
|
|
|
|
findDone
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S Done
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
_HUnlock ; unlock it
|
|
Done ; moved here <47>
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
;;Done
|
|
Move D7,D0 ; return in D0
|
|
Bra doBye
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TEEOLHook
|
|
; <C971/RWW110387>
|
|
;
|
|
; This vectored routine was added to make life simpler for those who
|
|
; wanted to add tabs to TextEdit. We won't officially support it,
|
|
; but it's here for people who need it.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
TEEOLHook
|
|
Move.L teDispatchH(A3),A0
|
|
Move.L (A0),A0 ; get at table
|
|
Move.L EOLHook(A0),A0
|
|
Jmp (A0)
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; XEOLHook
|
|
; <C971/RWW110387>
|
|
;
|
|
; Actual routine that tests character as end-of-line character. Stock
|
|
; version only checks for CR. To support tabs you'd add a
|
|
; test for TAB here as well, and then determine if the TAB puts
|
|
; you over the length for “end of line”.
|
|
;
|
|
; ENTRY: D0.B = character to check
|
|
;
|
|
;----------------------------------------------------------------------
|
|
XEOLHook Cmp.B #returnChar,D0 ; is it a CR?
|
|
Rts ; return with telltale CCR
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TEWidthHook
|
|
; <C971/RWW110387>
|
|
;
|
|
; Added hook for those needing to intercept the measurement of a line
|
|
;
|
|
; Stock version only calls Char2Pixel. To support tabs, you'd check
|
|
; the selection to be measured for tabs and add in the appropriate
|
|
; tab widths.
|
|
;
|
|
; modified <2/8/90smb>
|
|
; This internal interface still uses TextEdit's old Char2Pixel routine
|
|
; for backwards compatibility for developers. Specifically, if a developer
|
|
; has been using this interface, and chains his routine in, the new Char2Pixel
|
|
; routine would have broken his application. We now have a new interface,
|
|
; ScriptChar2Pixel (below) that allows a developer to replace our new
|
|
; Char2Pixel routine or chain with it instead.
|
|
;
|
|
; However, if a script system is installed, we override this hook and
|
|
; automatically use the new hook. Also, if a developer has not replaced our
|
|
; internal measuring routine (OldChar2Pixel) then we use the new routine.
|
|
; Hence, the only time we use the OldChar2Pixel code is when a developer has
|
|
; used this hook. <2/8/90smb>
|
|
;
|
|
; Measures from start of text to offset, length means length of style run!!!!
|
|
;
|
|
; ENTRY:
|
|
; a0.l => ptr to text to measure
|
|
; d0.w = Length of text to be measured
|
|
; d1.w = Offset into text
|
|
; d2.l = Slop (low word)
|
|
; Hilite flag (high word)
|
|
;
|
|
; EXIT:
|
|
; d1.w = Width of measured text
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEWidthHook
|
|
; If a non-Roman system then use new WidthHook routine.
|
|
move.l ExpandMem,a1 ; <2/8/90smb>
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1) ; total number of installed scripts
|
|
bne.s ScriptChar2Pixel ; <2/8/90smb>
|
|
|
|
; Test if the hook contains our internal address <2/8/90smb>
|
|
move.l teDispatchH(a3),a1
|
|
move.l (a1),a1
|
|
move.l WIDTHHook(a1),a1
|
|
|
|
; if the address of the TEWidthHook is our own OldChar2Pixel routine then use the
|
|
; new Char2Pixel routine. Otherwise, use the old routine. <2/8/90smb>
|
|
pea OldChar2Pixel ; <2/8/90smb>
|
|
cmpa.l (sp)+,a1 ; <2/8/90smb>
|
|
beq.s ScriptChar2Pixel ; <2/8/90smb>
|
|
|
|
; set up the length and offset correctly for the OldChar2Pixel (at this point they have
|
|
; been set up for the new Char2Pixel that calls the SMgr's C2P routine.
|
|
; adjust the length to reflect the length to measure (from the offset) rather than the
|
|
; whole length of the text that the SMgr's C2P expects. <2/8/90smb>
|
|
move.w d1,d0 ; the C2P offset (d1) should be the byte count or length (d0) <2/8/90smb>
|
|
move.w #0,d1 ; set the offset to 0. <2/8/90smb>
|
|
|
|
jmp (a1) ; default is to call OldChar2Pixel which calls TextWidth
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ScriptChar2Pixel
|
|
;
|
|
; new <2/8/90smb>
|
|
; This internal interface uses the new width hook which allows
|
|
; a developer to replace TextEdit's new Char2Pixel code that
|
|
; uses the Script Manager's Char2Pixel routine.
|
|
;
|
|
; If a developer chains in his routine w/o understanding our new interface
|
|
; (ie - he expects the old TEWidthHook registers to be used) then his code
|
|
; will not work.
|
|
;
|
|
; Stock version only calls new Char2Pixel.
|
|
;
|
|
; Measures from start of text to offset, length means length of style run!!!!
|
|
;
|
|
; ENTRY:
|
|
; a0.l => ptr to text buffer
|
|
; a2.l => ptr to current lineStart (from teLines)
|
|
; d0.w = overall style run length, pinned to the line end
|
|
; d1.w = offset position within the style run, pinned to the line start
|
|
; d2.l = slop (low word) (see SMgr C2P routine)
|
|
; direction flag (high word) (see SMgr C2P routine)
|
|
;
|
|
; EXIT:
|
|
; d1.w = width of measured text
|
|
;----------------------------------------------------------------------
|
|
ScriptChar2Pixel ; renamed from nTEWidthHook <18>
|
|
move.l teDispatchH(a3),a1
|
|
move.l (a1),a1
|
|
move.l nWIDTHHook(a1),a1 ; default is Char2Pixel
|
|
jmp (a1)
|
|
|
|
IF hasTextWidthHook THEN ; <18>
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TETextWidthHook <18>
|
|
;
|
|
; new <9/19/90smb>
|
|
;
|
|
; This internal interface uses the new TextWidth hook which allows
|
|
; a developer to replace the TextWidth calls in TextEdit with their
|
|
; own measuring code.
|
|
;
|
|
; The default is to use the OldChar2Pixel routine which calls
|
|
; _TextWidth.
|
|
;
|
|
; ENTRY:
|
|
; a0.l => ptr to text to measure
|
|
; d0.w = Length of text to be measured
|
|
; d1.w = Offset into text
|
|
;
|
|
; EXIT:
|
|
; d0.l,
|
|
; d1.l = Width of measured text, with result in low word and high word clear
|
|
; (using both registers since some callers use d0 for the result and
|
|
; others use d1)
|
|
;----------------------------------------------------------------------
|
|
TETextWidthHook
|
|
move.l teDispatchH(a3),a1 ; <18>
|
|
move.l (a1),a1 ; <18>
|
|
move.l TextWidthHook(a1),a1 ; <18>
|
|
jsr (a1) ; result in d1.w <18>
|
|
moveq #0,d0 ; <18>
|
|
move.w d1,d0 ; result in longized d0 <18>
|
|
move.w d0,d1 ; result in longized d1 <18>
|
|
rts ; <18>
|
|
ENDIF ; <18>
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TEHitTestHook
|
|
; <C971/RWW111887>
|
|
;
|
|
; Added hook for those needing to intercept hit testing on a line
|
|
;
|
|
; Stock version only calls Pixel2Char. To support tabs, you'd check
|
|
; the selection to be tested and add in the appropriate tab widths.
|
|
;
|
|
; ENTRY:
|
|
; A0.L => ptr to start of block
|
|
; D0.W = Length of block
|
|
; D1.W = Pixel width relative to start of block
|
|
; D2.L = Slop
|
|
;
|
|
; EXIT:
|
|
; D0.L = Pixel width to last offset (low word)
|
|
; BOOLEAN = TRUE if offset corresponding to
|
|
; the given pixel width was found (high word)
|
|
; D1.W = Character offset
|
|
; D2.W = Flagged if hit on left of char
|
|
;----------------------------------------------------------------------
|
|
TEHitTestHook
|
|
Move.L teDispatchH(A3),A1
|
|
Move.L (A1),A1
|
|
Move.L HITTESTHook(A1),A1
|
|
Jmp (A1)
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TEDrawHook
|
|
; <C971/RWW110387>
|
|
;
|
|
; Added hook for those needing to intercept the drawing of a line
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEDrawHook
|
|
Move.L teDispatchH(A3),A1
|
|
Move.L (A1),A1 ; get at table
|
|
Move.L DRAWHook(A1),A1
|
|
Jmp (A1)
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; XDRAWHook
|
|
; <C971/RWW110387>
|
|
;
|
|
; Actual routine that does drawing. Stock version only does _DrawText.
|
|
; To support tabs, you'd check the selection to be drawn for tabs,
|
|
; and take appropriate action on the intervening pieces.
|
|
;
|
|
; ENTRY:
|
|
; A0.L => text to draw
|
|
; D0.W = starting character
|
|
; D1.W = length to draw
|
|
;
|
|
;----------------------------------------------------------------------
|
|
XDRAWHook Move.L A0,-(SP)
|
|
Move.W D0,-(SP)
|
|
Move.W D1,-(SP)
|
|
_DrawText
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoDraw
|
|
;
|
|
; ** Rewritten 6/18/86 by MBK **
|
|
;
|
|
; Given display start and end in [D3..D4], this draws the text
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
DoDraw
|
|
with TextFrame,TEFormatOrder
|
|
Bsr PinDisplay
|
|
Bsr Preamble ; set rLine to A2 line
|
|
|
|
; ** <C105/14aug86/MBK> Only call LineRect at start to avoid height search **
|
|
Bsr LineRect
|
|
|
|
;----------------------------------------------- <22>
|
|
; Turn PreserveGlyph off before drawing, but save its previous setting <22>
|
|
clr.w -(sp) ; boolean result <22>
|
|
_GetPreserveGlyph ; <22>
|
|
; leave result on stack
|
|
tst.w (sp) ; preserve or squash? (byte result but cleared word)
|
|
beq.s @IsFalse ; <22>
|
|
move.b #0,-(sp) ; set PreserveGlyph FALSE <22>
|
|
_SetPreserveGlyph ; <22>
|
|
@IsFalse
|
|
;----------------------------------------------- <22>
|
|
|
|
@lineLoop
|
|
Bsr PrepLine ; pin D4 at line end
|
|
Bls @Test4Handle ; done...
|
|
|
|
Bsr ChkBounds ; extend bounds if necessary
|
|
;; <7Dec89smb> Tst.W TESysJust ; reverse order?
|
|
;; <7Dec89smb> Beq.S @LROrientation ; no, left->right flow
|
|
tst.b WordRedraw ; if R-L script (-1), then erase whole line <7Dec89smb>
|
|
bge.s @LROrientation ; no, left->right flow <7Dec89smb>
|
|
|
|
Move.W #UnboundLeft,teSelRect+left(A3) ; else, set unbound left
|
|
Move.W #UnboundRight,teSelRect+right(A3) ; else, set unbound right <7Dec89smb>
|
|
|
|
@LROrientation
|
|
Move.W D4,D6 ; selEnd
|
|
Bsr DoErase ; to fix italics problem** <C182/2oct86/MBK> **
|
|
|
|
Move.W saveLeft(A6),-(SP) ; saved true left value ** <C105/18aug86/MBK> Got rid of rTrue **
|
|
Move.W teSelRect+top(A3),-(SP) ; position pen
|
|
Move teAscent(A3),D0
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bmi.S @styledRecord
|
|
|
|
; record has no style, so draw all at once (the old way)
|
|
Add D0,(SP) ; drop pen to baseline
|
|
_MoveTo
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
Add.L D3,A0 ; offset pointer
|
|
|
|
; ** <C971/RWW110387> Added code to support tabs
|
|
; Move.L A0,-(SP) ; pass pointer
|
|
; Clr -(SP) ; no offset
|
|
; Move D4,-(SP) ; range
|
|
; Sub D3,(SP) ; draw amt := range-i
|
|
; _DrawText ; draw it
|
|
|
|
Clr.W D0 ; D0-D1 aren't a concern, since… <C971/RWW110387>
|
|
Move.W D4,D1 ; …one would expect _DrawText… <C971/RWW110387>
|
|
Sub.W D3,D1 ; …to blow them away anyways <C971/RWW110387>
|
|
Bsr.S TEDrawHook ; go draw it <C971/RWW110387>
|
|
|
|
Bra @nxtLine ; <C971/RWW102887>NO
|
|
|
|
; record has style, so draw one style at a time
|
|
@styledRecord
|
|
Tst.W D0 ; check default ascent
|
|
Bpl.S @ascentSet ; use it if set
|
|
|
|
Bsr PtrToLine ; convert A2 ptr to line #
|
|
Ext.L D0 ; make it long just in case ** <C381/6nov86/MBK> **
|
|
LsL.L #2,D0 ; mult by 4 ** <C381/6nov86/MBK> **
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; deref
|
|
Move.L lhTab(A0),A0 ; array of max hite indeces
|
|
Move.L (A0),A0 ; deref
|
|
Move.W 2(A0,D0.L),D0 ; max ascent
|
|
|
|
@ascentSet
|
|
Add D0,(SP) ; drop pen to baseline
|
|
_MoveTo
|
|
|
|
sf useOldMethod(a6) ; init flag for getting style runs <28Sept88smb>
|
|
; determine if display order is different from backin-store order <28Sept88smb>
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
bge.s @getStyleOld ; nope, only L->R directional text (unsigned!)
|
|
|
|
Move.W D3,D0 ; start offset
|
|
Move.W D4,D1 ; end of selection
|
|
bsr GetStylesInOrder ; <15Nov88smb>
|
|
; tests whether any styles to process <15Nov88smb>
|
|
bge.s @styleLoop ; <15Nov88smb>
|
|
bra @nxtLine ; <15Nov88smb>
|
|
|
|
@getStyleNew
|
|
; get next style using the results from getFormatOrder <28Sept88smb>
|
|
bsr GetNextDisplayStyle ; <4Jan89smb>
|
|
addq #1,fmtOrderingIndex(a6) ; incr the style run counter
|
|
SubQ #1,D2 ; dec the style counter
|
|
bge.s @styleLoop
|
|
bra.s @nxtLine
|
|
|
|
@getStyleOld
|
|
st useOldMethod(a6)
|
|
Move.W D3,D0 ; start offset
|
|
Move.W D4,D1 ; end of selection
|
|
Bsr GetCurStyle ; get its style <7Oct88smb> replaces GetFirstStyle call
|
|
Bsr GetNumStyles ; # of styles between offsets <7Oct88smb>
|
|
Move.W D0,D2 ; save style count
|
|
|
|
@styleLoop
|
|
Move.L A0,-(sp) ; ptr to style: preserve a4 <21Dec88smb>
|
|
;; Move.L A0,A4 ; ptr to style
|
|
Bsr SetStyle ; set style
|
|
Move.W startChar(A0),D0 ; get start of style
|
|
AddQ #stStartSize,A0 ; ptr to next style
|
|
Move.W D6,D4 ; init to end of line
|
|
Cmp.W startChar(A0),D6 ; compare to end of line
|
|
Blo.S @4
|
|
Move.W startChar(A0),D4 ; set to end of style
|
|
|
|
@4 Move.W D2,-(SP) ; save the count
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
Cmp.W D3,D0
|
|
Bhs.S @5 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
Move.W D3,D0 ; reset if needed
|
|
|
|
@5 AddA.W D0,A0 ; offset pointer
|
|
|
|
|
|
; ** <C971/RWW110387> Added code to support tabs
|
|
; Move.L A0,-(SP) ; pass pointer
|
|
; Clr -(SP) ; no offset
|
|
; Move D4,-(SP) ; range
|
|
; Sub D0,(SP) ; draw amt := range-i
|
|
|
|
Move.L teStylesH(A3),A1 ; get style handle
|
|
Move.L (A1),A1
|
|
move.l a1,d1 ; <21Dec88smb>
|
|
Sub.L d1,2(A7) ; save as an offset <21Dec88smb>
|
|
;; Sub.L A1,A4 ; save as an offset
|
|
|
|
; _DrawText ; draw it
|
|
|
|
Move.W D4,D1 ; amount := range - i <C971/RWW110387>
|
|
Sub.W D0,D1 ; <C971/RWW110387>
|
|
Clr.W D0 ; no offset <C971/RWW110387>
|
|
Bsr TEDrawHook ; go draw it <C971/RWW110387>
|
|
|
|
; Unlock the style handle when through with pointer.
|
|
Move.L teStylesH(A3),A1 ; get style handle
|
|
Move.L (A1),A1
|
|
move.l a1,d1 ; <21Dec88smb>
|
|
Add.L d1,2(A7) ; restore as pointer <21Dec88smb>
|
|
;; Add.L A1,A4 ; restore as pointer
|
|
|
|
Move.W (SP)+,D2 ; restore the count
|
|
Move.L (sp)+,A0 ; ptr to style <21Dec88smb>
|
|
;; Move.L A4,A0 ; ptr to style
|
|
|
|
tst.b useOldMethod(a6) ; <28Sept88smb>
|
|
beq.s @getStyleNew ; use formatOrder array
|
|
|
|
Addq.l #stStartSize,a0 ; get next style <7Oct88smb> replaces GetNextStyle call
|
|
SubQ #1,D2 ; dec the style counter
|
|
Bne.S @styleLoop ; must be more than 1 line
|
|
|
|
; ** <C105/14aug86/MBK> NextLineRect will not search for height from start **
|
|
|
|
@nxtLine
|
|
|
|
Bsr PtrToLine ; convert A2 to line #
|
|
AddQ #1,D0 ; next line
|
|
Bsr NextLineRect ; set next line's rect
|
|
Move (A2),D3 ; get start
|
|
Bra @lineLoop ; keep going
|
|
|
|
@Test4Handle
|
|
|
|
;----------------------------------------------- <22>
|
|
; Restore PreserveGlyph
|
|
; previous PreserveGlyph value still on stack
|
|
_SetPreserveGlyph ; <22>
|
|
;----------------------------------------------- <22>
|
|
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
doBye
|
|
MoveM.L (SP)+,D2-D7/A2-A4 ; restore regs
|
|
Unlk A6 ; unlink DoText frame
|
|
Move.L GrafGlobals(A5),A0 ; get the port in A0 for
|
|
Move.L thePort(A0),A0 ; compatibility
|
|
Rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoErase
|
|
;
|
|
; ** <C182/2oct86/MBK> **
|
|
;
|
|
; DoErase was added to solve the problem of half the previous
|
|
; character getting erased when an EraseRect is done before
|
|
; drawing the current character. (This is a problem for Italics
|
|
; And certain special fonts). In DoErase, if the offset is the
|
|
; same as the line start, I still erase the whole line, in case
|
|
; of a change in line height (and the offset must be the same as
|
|
; a line start if the line height has changed); otherwise, I
|
|
; don't erase the previous character since it's going to be
|
|
; drawn over anyway.
|
|
;
|
|
; Entry:
|
|
; D3: start offset
|
|
; A2: line start
|
|
;
|
|
;------------------------------------------------------------------------
|
|
DoErase
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vDoErase(a0),a0
|
|
jmp (a0)
|
|
|
|
xDoErase
|
|
|
|
with TextFrame,TEFormatOrder
|
|
Move.W teSelRect+left(A3),-(SP) ; save left side for draw
|
|
Cmp.W (A2),D3 ; at start of line?
|
|
|
|
Beq.s @GoErase ; don't worry if so
|
|
|
|
; If the mode is XOR, we must erase the previous character as well as redrawing it.
|
|
; Redrawing the character in XOR without erasing it first just erases it. This means
|
|
; the italics problem will not be fixed in this mode.
|
|
Cmp.W #srcXor,teMode(A3) ; is drawing mode XOR?
|
|
Beq.s @GoErase ; do it the old way if so
|
|
|
|
Tst.W teSize(A3) ; TERec with style?
|
|
Bpl.S @MeasureChar ; skip style setup if not
|
|
|
|
; determine if display order is different from backin-store order <28Sept88smb>
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
bge.s @getStyleOld ; nope, only L->R directional text
|
|
|
|
Move.W D3,D0 ; start offset
|
|
Move.W D4,D1 ; end of selection
|
|
bsr GetStylesInOrder ; <15Nov88smb>
|
|
bra.s @SetPort
|
|
|
|
@getStyleOld
|
|
Move.W D3,D0 ; selection start
|
|
Move.W D0,D1 ; don't care about end
|
|
Bsr GetCurStyle ; get its style <7Oct88smb> replaces GetFirstStyle call
|
|
Bsr GetNumStyles ; # of styles between offsets <7Oct88smb>
|
|
@SetPort
|
|
Bsr SetStyle ; set the port
|
|
@MeasureChar
|
|
IF hasTextWidthHook THEN ; <18>
|
|
move.l teTextH(a3),a0 ; text handle <18>
|
|
move.l (a0),a0 ; wants text ptr here <18>
|
|
move.w d3,d1 ; wants offset here <18>
|
|
moveq #1,d0 ; wants length here <18>
|
|
bsr TETextWidthHook ; hook out TextWidth <18>
|
|
ELSE ; <18>
|
|
subq.l #2,sp ; room for result
|
|
move.l teTextH(a3),a0 ; text handle
|
|
move.l (a0),-(sp) ; ptr on stack
|
|
move.w d3,-(sp) ; offset to current char
|
|
move.w #1,-(sp) ; just one char
|
|
_TextWidth ; how wide is it?
|
|
move.w (sp)+,d0 ; this wide
|
|
ENDIF ; <18>
|
|
|
|
; Don't want to erase the prev character because that destroys part of the character
|
|
; before it (if it's italics or a kerned font). However, the last pixel should be erased
|
|
; in case the application leaves a caret drawn there (like Mac3D does).
|
|
Tst.W D0 ; nothing to do if no width ** <C485/04dec86/MBK> **
|
|
Beq.S @ZeroWidth ; else subtract one from char width ** <C485/04dec86/MBK> **
|
|
SubQ.W #1,D0 ; to fix caret erase problem ** <C485/04dec86/MBK> **
|
|
@ZeroWidth
|
|
Add.W D0,teSelRect+left(A3) ; adjust left
|
|
|
|
@GoErase
|
|
Pea teSelRect(A3) ; erase the expanded rect
|
|
_EraseRect
|
|
Move.W (SP)+,teSelRect+left(A3) ; restore left side for draw
|
|
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PrepLine
|
|
;
|
|
; Given display start and end in [D3..D4], and a line start in
|
|
; (A2), this gets the line's rectangle in rLine(A6). Then pins
|
|
; D4 at the lineStart of the next line. Then gets the range's
|
|
; rectangle in rTrue. And, the expanded rect in teSelRect(A3).
|
|
; (It calls range rect to do this). Finally exits with CC's
|
|
; Set according to D3 and D5(the length).
|
|
;
|
|
; Exit:
|
|
; CC's set to relationship of D3 to dispEnd in D5
|
|
;
|
|
;
|
|
;----------------------------------------------------------------------
|
|
PrepLine
|
|
Move D5,D4 ; get right
|
|
Cmp 2(A2),D4 ; pin to right (compare to lineStart of next line)
|
|
Blo.S @0
|
|
Move 2(A2),D4 ; set to line end (= start of next line)
|
|
@0
|
|
Bsr RangeRect ; get rect from D3 to D4 in teSelRect
|
|
|
|
Cmp D3,D5 ; finished?
|
|
Rts
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Preamble
|
|
;
|
|
; Given display start and end in [D3..D4], this first sorts the
|
|
; two, and copies D4 into D5. Then, it skips to the lineStart
|
|
; entry containing D3. It sets up A2 to point to that line.
|
|
;
|
|
; Exit:
|
|
; CC's set to relationship of D3 to the next line's start, 2(A2)
|
|
; D5 a copy of incoming D4
|
|
; a2 a pointer to the current line for d3
|
|
;
|
|
;----------------------------------------------------------------------
|
|
Preamble
|
|
Move.L (SP)+,A0 ; get local RTS
|
|
MoveM.L D2-D7/A2-A4,-(SP)
|
|
Move.L A0,-(SP) ; replace RTS
|
|
|
|
Cmp D3,D4 ; sort range
|
|
Bhs.S @0
|
|
Exg D4,D3 ; swap regs
|
|
@0
|
|
Cmp teLength(A3),D4 ; pin disp end
|
|
Blo.S @1
|
|
Move teLength(A3),D4 ; pin disp end
|
|
@1
|
|
|
|
Lea teLines(A3),A2 ; point to line starts
|
|
|
|
And.L lo16,D4 ; longize D4
|
|
Move D4,D5 ; save D5 as limit
|
|
And.L lo16,D3 ; longize D3
|
|
|
|
Beq.S @2 ; skip out if 1st line(for empty rec.)
|
|
|
|
Move.W D3,D0
|
|
Bsr.S GetLine ; get its line ptr <C971/RWW102887>NO
|
|
@2
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetLine
|
|
;
|
|
; Given an offset, find the ptr to the line it's on.
|
|
;
|
|
; Entry: D0: offset
|
|
; A2: ptr to line from which to start search
|
|
;
|
|
; Exit: A2: ptr to line on which offset is found
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
GetLine
|
|
@0 Cmp 2(A2),D0 ; D0 past or at next linestart?
|
|
Bls.S @1 ; if at next line start
|
|
|
|
AddQ #2,A2 ; next lineStart
|
|
Bra.S @0
|
|
@1
|
|
Bne.S @2 ; if AT next line start
|
|
AddQ #2,A2 ; next lineStart
|
|
@2
|
|
Rts
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoText funnel proc for compatibility
|
|
; On entry d7:
|
|
; teFind (0)
|
|
; teMark (1) renamed to teHighlight
|
|
; teDraw (-1)
|
|
; teLoc (-2) renamed to teCaret
|
|
;----------------------------------------------------------------------
|
|
|
|
DoText
|
|
Move.L TEDoText,-(SP)
|
|
Rts
|
|
XDoText
|
|
with TextFrame,TEFormatOrder
|
|
Link A6,#TextFrameSz ; link frame for DoText procs
|
|
|
|
Tst D7 ; check dispatch code
|
|
Beq DoSearch
|
|
Bgt DoHilite
|
|
Cmp #teDraw,D7
|
|
Beq DoDraw ; fall into doCaret
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoCaret
|
|
;
|
|
; Given display start sets up the caret rect in teSelRect. Note
|
|
; all the weird shit it has to do because of caret positioning
|
|
; around the end of a line and at the end of the text. (That's nothing
|
|
; compared to the weird shit it has to do for split carets! -.ed)
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
DoCaret
|
|
Bsr.S Preamble ; set rLine to A2 line
|
|
|
|
Tst D3 ; special case @ 1st character <03Nov85> SC
|
|
Beq.S @GetSelRect ; if so skip all these checks <03Nov85> SC
|
|
|
|
Cmp (A2),D3 ; at line start?
|
|
Bne.S @GetSelRect ; skip if not next-line start
|
|
|
|
Move teLength(A3),D0 ; are we past last char?
|
|
Beq.S @GetSelRect ; (and is there a last char?)
|
|
Cmp D0,D3 ; are we past last char?
|
|
Blo.S @LeftCaret ; if not, skip special case
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
; ** <C971/RWW110387> Added this code to support tabs
|
|
; Cmp.B #returnChar,-1(A0,D3) ; if last char <> CR then...
|
|
|
|
Move.B -1(A0,D3),D0 ; THESE TWO LINES REPLACE PREVIOUS <C971/RWW110387>
|
|
bsr TEEOLHook ; <C971/RWW110387>
|
|
beq.s @GetSelRect ; skip the line
|
|
bra.s @PrevLine
|
|
@LeftCaret
|
|
Tst.B teLftCaret(A3) ; to left?
|
|
Bne.S @GetSelRect ; skip line pull back if so
|
|
@PrevLine
|
|
SubQ #2,A2 ; skip to previous line
|
|
@GetSelRect
|
|
; determines the boundaries of the selection rectangle that contains the cursor, setting left = right
|
|
bsr LineRect ; removed from Prep ** <C105/14aug86/MBK> **
|
|
|
|
tst.w teSize(a3) ; <27Oct88smb>
|
|
bmi.s @GetCursors ; bra if styled text
|
|
tst.b WordRedraw ; old style record, test for Roman/double-byte system
|
|
;;<22June89smb> bmi.s @OldStyleRecord
|
|
bmi.s @GetCursors ; bra if RL unstyled text <22June89smb>
|
|
tst.b teSysJust ; <22June89smb>
|
|
beq.s @OldStyleRecord ; bra if LR text on a LR line <22June89smb>
|
|
@GetCursors
|
|
; styled text OR unstyled RL text OR unstyled LR text on a RL line
|
|
bsr CaretDisplay ; possibly split cursors <27Oct88smb>
|
|
move.w teSelRect+left(a3),d0
|
|
move.w d0,saveLeft(a6)
|
|
bra.s @Fix4Cursor
|
|
|
|
; Old style edit record for Roman; process as before <27Oct88smb>
|
|
@OldStyleRecord
|
|
bsr PrepLine ; get selRect from D3..D4 <C971/RWW102887>NO
|
|
Move saveLeft(A6),D0 ; get caret loc
|
|
Move D0,teSelRect+right(A3) ; and set in teSelRect
|
|
@Fix4Cursor
|
|
SubQ #1,D0
|
|
Move D0,teSelRect+left(A3)
|
|
;-----------------------------------------------------------------------------------------
|
|
; pin caret to edge of view rect if it's displaying out of view <1/29/90smb>
|
|
; make sure it's a caret position (selStart = selEnd)
|
|
move.w teSelStart(a3),d0
|
|
cmp.w teSelEnd(a3),d0
|
|
bne @Done
|
|
|
|
tst.b teSysJust
|
|
bne.s @RLDirection
|
|
; for a left-to-right line:
|
|
; if the viewRect.right >= the destRect.right and
|
|
; if the selRect.left >= the viewRect.right
|
|
; then selRect.right = viewRect.right
|
|
; selRect.left = viewRect.right-1.
|
|
; is the viewRect.right >= the destRect.right?
|
|
move.w teViewRect+right(a3),d0
|
|
cmp.w teDestRect+right(a3),d0
|
|
blt.s @Done
|
|
; is the selRect.left >= the viewRect.right?
|
|
move.w teViewRect+right(a3),d0
|
|
cmp.w teSelRect+left(a3),d0
|
|
bgt.s @Done
|
|
; pin caret to edge of view rect
|
|
move.w d0,teSelRect+right(a3)
|
|
subq.w #1,d0
|
|
move.w d0,teSelRect+left(a3)
|
|
; test for split carets
|
|
move.l ExpandMem,a0
|
|
tst.b ExpandMemRec.emTwoCursorsFlag(a0)
|
|
beq.s @Done
|
|
; test if 2nd (split) caret is out of view also:is the Left edge greater than the view rect's Right edge
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right of 2nd caret
|
|
addq.w #1,d0 ; view rect still here: get back to right edge.
|
|
cmp.w left(a0),d0
|
|
bgt.s @Done
|
|
; pin split caret to edge of view rect also.
|
|
move.w d0,right(a0)
|
|
subq.w #1,d0
|
|
move.w d0,left(a0)
|
|
bra.s @Done
|
|
@RLDirection
|
|
; for a right-to-left line:
|
|
; if the viewRect.left <= the destRect.left and
|
|
; if the selRect.right <= the viewRect.left
|
|
; then selRect.left = viewRect.left
|
|
; selRect.right = viewRect.left+1.
|
|
; is the viewRect.left <= the destRect.left?
|
|
move.w teViewRect+left(a3),d0
|
|
cmp.w teDestRect+left(a3),d0
|
|
bgt.s @Done
|
|
; is the selRect.right <= the viewRect.left?
|
|
move.w teViewRect+left(a3),d0
|
|
cmp.w teSelRect+right(a3),d0
|
|
blt.s @Done
|
|
; pin caret to edge of view rect
|
|
move.w d0,teSelRect+left(a3)
|
|
addq.w #1,d0
|
|
move.w d0,teSelRect+right(a3)
|
|
; test for split carets
|
|
move.l ExpandMem,a0
|
|
tst.b ExpandMemRec.emTwoCursorsFlag(a0)
|
|
beq.s @Done
|
|
; test if 2nd (split) caret is out of view also:is the Right edge less than the view rect's Left edge
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right of 2nd caret
|
|
subq.w #1,d0 ; view rect still here: get back to left edge.
|
|
cmp.w right(a0),d0
|
|
blt.s @Done
|
|
; pin split caret to edge of view rect also.
|
|
move.w d0,left(a0)
|
|
addq.w #1,d0
|
|
move.w d0,right(a0)
|
|
@Done
|
|
; end of changes <1/29/90smb>
|
|
;-----------------------------------------------------------------------------------------
|
|
Bra doBye
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; CaretDisplay
|
|
; <27Oct88smb>
|
|
;
|
|
; This routine will be used to display cursors, split cursors
|
|
; when necessary. Will not enter this routine with an old styled
|
|
; TE record for a left-to-right directional script. Walk through
|
|
; a line, style run by style run, measuring and accumulating
|
|
; widths until hit a run containing a cursor.
|
|
;
|
|
; Input
|
|
; a2 LineStart of current line containing d3 (from TE LineStarts array)
|
|
; a3 pointer to locked edit record
|
|
;
|
|
; d3 position of cursor
|
|
; d4 position of cursor
|
|
;
|
|
; Uses
|
|
; d2 number of style runs on the line
|
|
; d5 pixelWidth of the measured style runs
|
|
; a0 pointer to current style
|
|
; a1 format ordering array
|
|
; a2 lineStart
|
|
; a4 pointer to cursor's style run
|
|
; d5 pixelWidth of the measured style runs
|
|
;----------------------------------------------------------------------
|
|
CaretDisplay
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vCaretDisplay(a0),a0
|
|
jmp (a0)
|
|
|
|
xCaretDisplay
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
link a6,#SharedFrameSz
|
|
move.l ExpandMem,a0 ; <1Feb89smb> initialize for only 1 cursor
|
|
sf ExpandMemRec.emTwoCursorsFlag(a0)
|
|
sf ExpandMemRec.emFmtOrderHFlag(a0) ; no handle allocated for styles
|
|
clr.w gotOneRun(a6) ; set gotOneRun and onBoundaryFlag to F.
|
|
sf scriptDirection(a6) ; initialize to LR
|
|
clr.w d5
|
|
|
|
bsr GetFormatOrdering ; <8Mar89smb>
|
|
|
|
; accumulate widths of style runs until hit one containing a cursor.
|
|
@MeasureLoop
|
|
bsr GetNextDisplayStyle ; <4Jan89smb>
|
|
addq #1,fmtOrderingIndex(a6) ; incr for the next measurement
|
|
|
|
; does this style contain a cursor?
|
|
@Check4Cursor
|
|
cmp.w startChar(a0),d3 ; cursor at beginning of run?
|
|
;; bhi.s @CheckUpperBound ; <26June89smb> made unsigned <11>
|
|
beq.s @CursorRun ; cursor on start boundary of it's run
|
|
;; bra @GetWidth ; cursor outside of run <11>
|
|
blo @GetWidth ; <11>
|
|
|
|
@CheckUpperBound
|
|
bsr FixFormatEnd ; if last format run, must decrement <17Jan89smb>
|
|
cmp.w d0,d3 ; cursor at end of run? <17Jan89smb>
|
|
bhi.s @GetWidth ; cursor outside of run <26June89smb> made unsigned
|
|
blt.s @FoundCursor ; cursor in middle of run
|
|
|
|
; in style previous to cursor's run
|
|
tst.b gotOneRun(a6) ; set up second rectangle now?
|
|
bne @SetEnds ; yup, already have top and bottom
|
|
st prevStyleFlag(a6) ; cursor at end of this run (previous style)
|
|
bra.s @OnBoundary
|
|
@CursorRun
|
|
; in cursor's run
|
|
tst.b gotOneRun(a6) ; set up second rectangle now?
|
|
bne @SetEnds ; yup, already have top and bottom
|
|
sf prevStyleFlag(a6) ; cursor at beginnning of it's run
|
|
@OnBoundary
|
|
st onBoundaryFlag(a6) ; cursor on boundary of run
|
|
|
|
; cursor either in middle of the style run or on a boundary
|
|
@FoundCursor
|
|
tst.w teSize(a3) ; <1Dec88smb>
|
|
bpl.s @DontSet
|
|
bsr SetStyle
|
|
@DontSet
|
|
tst.b WordRedraw ; <4Oct89smb>
|
|
blt.s @ContainsRLText ; <4Oct89smb>
|
|
tst.b teSysJust
|
|
bne.s @ContainsRLText
|
|
; in LR text only on a LR directional line: done stepping thru style <
|
|
clr.l d2 ; #smLeftCaret set in low word of d2
|
|
bsr GetLRPosition
|
|
add.w d1,d5 ; add C2P width to totalWidth of line thus far (d5)
|
|
|
|
add.w d5,teSelRect+left(a3) ; add width to left and right edges of selRect
|
|
add.w d5,teSelRect+right(a3)
|
|
bra @done
|
|
|
|
@ContainsRLText
|
|
move.w d2,-(sp) ; save style counter
|
|
bsr GetRLPosition
|
|
move.w (sp)+,d2 ; restore style counter
|
|
tst.b doneFlag(a6)
|
|
bne.s @finis
|
|
tst.b lineEndFlag(a6)
|
|
bne.s @GetWidth ; must measure rest of style runs on line
|
|
|
|
; added more robust tests for determining whether need to measure style run or not <8Nov88smb>
|
|
tst.b scriptDirection(a6)
|
|
bne.s @ChkRLMeasure ; bra if RL script direction
|
|
|
|
; in LR script direction <8Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne @MeasureLoop ; bra if previous LR run: already measured
|
|
bra.s @GetWidth ; measure since in cursor run w/ LR direction
|
|
|
|
@ChkRLMeasure
|
|
; in RL script direction <8Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
beq @MeasureLoop ; bra if in cursor run: already measured
|
|
|
|
; cursor's not in this style run, so measure it and save its width for later OR
|
|
; found cursor in it's style run but the script has LR direction so need to measure
|
|
@GetWidth
|
|
move.w d1,-(sp)
|
|
bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
move.w (sp)+,d1
|
|
tst.b WordRedraw ; <4Oct89smb>
|
|
bge.s @GetNext ; <4Oct89smb>
|
|
|
|
SubQ #1,D2 ; dec the style counter
|
|
beq.s @finis
|
|
bra @MeasureLoop
|
|
|
|
@GetNext
|
|
Addq.l #stStartSize,a0 ; get next style
|
|
SubQ #1,D2 ; dec the style counter
|
|
Bne @Check4Cursor ; must be more than 1 line
|
|
bra.s @finis
|
|
@SetEnds
|
|
; second cursor style run. Must set up the second rectangle for the second cursor
|
|
tst.b prevStyleFlag(a6)
|
|
bne.s @InCursorRun ; in cursor script
|
|
move.b previousScriptDir(a6),d0
|
|
bra.s @GetScriptDirection
|
|
@InCursorRun
|
|
move.b cursorScriptDir(a6),d0
|
|
|
|
@GetScriptDirection
|
|
bne.s @RLScript
|
|
|
|
; LR Script <7Nov88smb>
|
|
; if in previous style and LR script direction then measure since at end of style run
|
|
; otherwise, width is 0 since at beginning of run so, have width to use
|
|
tst.b prevStyleFlag(a6)
|
|
beq.s @MeasureRun ; bra to measure if in prevStyle's run
|
|
bra.s @HaveWidth
|
|
|
|
@RLScript
|
|
; if in cursor style and RL script direction then measure since at beginning of style run
|
|
; otherwise, width is 0 since at end of run so, have width to use <7Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne.s @MeasureRun ; bra to measure if in cursor's run
|
|
bra.s @HaveWidth
|
|
|
|
@MeasureRun
|
|
move.w d5,-(sp) ; necessary for two cursors
|
|
Bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
bra.s @HaveWidth
|
|
@finis
|
|
tst.b lineEndFlag(a6)
|
|
beq.w @done
|
|
|
|
IF forLocalizability THEN ; <31m-YDS-8/27/91>
|
|
move.l ExpandMem,a0
|
|
tst.b ExpandMemRec.emTwoCursorsFlag(a0) ; if we have one cursor
|
|
beq.w @done ; skip all the rest
|
|
ENDIF
|
|
|
|
|
|
@HaveWidth
|
|
; finish setup of 2nd cursor rectangle
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; <12July89smb> changed to lea
|
|
addq #2,a0 ; top edge ok
|
|
add.w selRectL(a6),d5 ; add original L. edge
|
|
move.w d5,(a0) ; left
|
|
sub.w #1,(a0)+ ; cursor posn
|
|
addq #2,a0 ; bottom edge ok
|
|
move.w d5,(a0) ; right (same as left)
|
|
|
|
IF forLocalizability THEN ; <31d-YDS-8/27/91>
|
|
; added to support a single carret at styled TE,
|
|
clr.l -(sp) ; make space for function result
|
|
move #smGenFlags,-(sp) ; put smSysScript verb to get the SMGR general flags
|
|
_GetEnvirons ; now wh have the general flags
|
|
Move.l (sp)+, d5 ; take return value.
|
|
and.l #(1<<smfDualCaret),d5 ; leave only the right bit
|
|
bne.w @done ; leave the split carret as is ?
|
|
|
|
move.l ExpandMem,a0 ; get the scplit cursor addres into A0
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0
|
|
Move.w top(a0), d5 ; some times we get the lower
|
|
Cmp.w teSelRect+top(a3), d5 ; in selrect & the upper in "ExpandMem"
|
|
bgt.s @3 ; so we would like to sort it out.
|
|
|
|
move.l top(a0),d5 ; switch the two rects. keep in mind
|
|
move.l teSelRect+top(a3),top(a0) ; that the upper one has the width of
|
|
move.l d5,teSelRect+top(a3) ; zero, while the lower one has the
|
|
move.w bottom(a0),d5 ; witdth of 1, it ws set later tio the correct values,
|
|
move.w teSelRect+bottom(a3),bottom(a0) ; but that's how it is now, and i'm not
|
|
move.w d5,teSelRect+bottom(a3) ; going to change it.
|
|
move.w teSelRect+left(a3),teSelRect+right(a3)
|
|
move.w left(a0),right(a0)
|
|
add.w #1,right(a0)
|
|
|
|
@3 clr.l -(sp) ; we will need a place on the stack anyway !
|
|
Tst.b teCarOn(A3) ; if caret on, we would like to calculate the same caret allways
|
|
bne.s @1 ; carret is going on, calculate a new one
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0
|
|
move.b lastScript(a0),d5 ; push script numberused to highligt (d5) to lastScript
|
|
bra.s @2
|
|
|
|
@1 move #smKeyScript,-(sp) ; we will call _GetEnvirons to get the current active (keyboard) script.
|
|
_GetEnvirons ; now we know who the active script
|
|
Move.l (sp), d5 ; take return value (the script number (long !!!)), leave place for return value
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0
|
|
move.b d5, lastScript(a0) ; push script numberused to highligt (d5) to lastScript
|
|
|
|
@2 move.w d5, -(sp) ; push the script (word !!!) for the next call we will need
|
|
|
|
move #smScriptRight,-(sp) ; is that script a right to left script ?
|
|
_GetScript ; we have smScriptRightflag the stack
|
|
move.l (sp)+, d0 ; do = result
|
|
move.l ExpandMem,a0 ; get the scplit cursor addres into A0
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0
|
|
cmp.b TESysJust, d0
|
|
beq.s @UseTop
|
|
@UseBottom
|
|
move.w teSelRect+top(a3),top(a0) ; strech lower cursor
|
|
move.w teSelRect+top(a3),teSelRect+bottom(a3) ; make top = bottom in upper cursor
|
|
bra.s @done
|
|
@UseTop
|
|
move.w bottom(a0),teSelRect+bottom(a3) ; strech upper cursor
|
|
move.w bottom(a0),top(a0) ; make top = bottom in lower cursor
|
|
|
|
ENDIF
|
|
|
|
@done
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
unlk a6
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetLRPosition
|
|
; <27Oct88smb>
|
|
;
|
|
; The cursor is in this style run and there's only LR text in this
|
|
; teRecord. Sets up for and call Char2Pixel for pixel width in
|
|
; this style run and adds this to the total width of the line
|
|
; thus far. Then puts this width in the selRect so the cursor
|
|
; can be drawn.
|
|
;
|
|
; Input
|
|
; a0: style run of cursor (could be previous run w/ cursor at end)
|
|
; a2: pointer at current line in lineStart array
|
|
; d2: direction parameter for C2P
|
|
; d3: absolute position of cursor
|
|
; d5: total pixelWidth of style runs thus far in the line
|
|
; Uses
|
|
; a1
|
|
; d0: length of style run to measure (may not be whole run) for C2P
|
|
; d1: start offset for C2P
|
|
; d4: diffence between lineStart and style start
|
|
; Output
|
|
; d1: pixel width
|
|
;----------------------------------------------------------------------
|
|
GetLRPosition
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetLRPosition(a1),a1
|
|
jmp (a1)
|
|
|
|
xGetLRPosition
|
|
|
|
move.l a0,-(sp)
|
|
; call Char2Pixel to get the pixel position for the cursor
|
|
move.l teTextH(a3),a1 ; get text handle
|
|
move.l (a1),a1 ; dereference
|
|
add.w startChar(a0),a1 ; add beginning of the style run to get to desired line
|
|
exg a1,a0 ; C2P wants text ptr here
|
|
|
|
; test if style run begins on previous line, and if so adjust text ptr & offset posn in run
|
|
moveq #0,d4
|
|
move.w (a2),d0
|
|
cmp.w startChar(a1),d0
|
|
bls.s @StyleStartOK ; <26June89smb> made unsigned
|
|
; pin to lineStart
|
|
sub.w startChar(a1),d0 ; |begin of line - begin of style run|
|
|
add.w d0,a0 ; fix text ptr
|
|
move.w d0,d4 ; save difference for length adjustment
|
|
move.w d3,d1 ; cursor posn: C2P wants offset here
|
|
sub.w (a2),d1 ; offset from start of line
|
|
bra.s @getLength
|
|
|
|
@StyleStartOK
|
|
move.w d3,d1
|
|
sub.w startChar(a1),d1 ; cursor posn relative to start of style run
|
|
|
|
@getLength
|
|
; test if style run ends on next line, and if so, pin to end of this line & adjust length
|
|
move.l a0,-(sp) ; <6Mar89smb>
|
|
move.l a1,a0 ; <6Mar89smb>
|
|
bsr FixFormatEnd ; <6Mar89smb>
|
|
move.l (sp)+,a0 ; <6Mar89smb>
|
|
cmp.w 2(a2),d0
|
|
bls.s @UseStyleEnd ; <26June89smb> made unsigned
|
|
move.w 2(a2),d0 ; pin to line end
|
|
|
|
@UseStyleEnd
|
|
sub.w startChar(a1),d0 ; length of style run
|
|
sub.w d4,d0 ; adjust for lineStart
|
|
|
|
swap d2 ; direction:slop
|
|
|
|
Bsr TEWidthHook ; returns in d1
|
|
move.l (sp)+,a0
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetRLPosition
|
|
; <27Oct88smb>
|
|
;
|
|
; The cursor is in this style run and there's RL text in this
|
|
; teRecord OR there's only LR text but the line direction is RL.
|
|
;
|
|
; If the cursor is not on a boundary of the run then
|
|
; call C2P twice (with the values smLeftCaret and
|
|
; smRightCaret). If the values returned are different then
|
|
; two cursors must be drawn, otherwise only one.
|
|
;
|
|
; If the cursor is on a cluster boundary, then the cursor
|
|
; must be drawn in two places. A cluster boundary also applies
|
|
; to the beginning and end of a line, when the style run at these
|
|
; positions is different then the directional flow of the line.
|
|
; Otherwise, the cursor is drawn in one place.
|
|
;
|
|
;
|
|
; Input
|
|
; a0: style run containing cursor
|
|
; a2: lineStart array
|
|
; d3: absolute position of cursor
|
|
; d5: total pixelWidth of style runs thus far in the line
|
|
; Uses
|
|
; d0: total length of style run for C2P
|
|
; d1: start offset for C2P
|
|
; a1: other style run for cursor
|
|
;----------------------------------------------------------------------
|
|
GetRLPosition
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetRLPosition(a1),a1
|
|
jmp (a1)
|
|
|
|
xGetRLPosition
|
|
|
|
RLPosnRegs reg a0
|
|
with SharedFrame,TEFormatOrder
|
|
movem.l RLPosnRegs,-(sp)
|
|
sf doneFlag(a6)
|
|
clr.w highCaret(a6) ; set lineEndFlag and highCaret to F. <6mar89smb>
|
|
st gotOneRun(a6)
|
|
clr.l d2 ; used for direction params for C2P
|
|
|
|
; save original edges of selection rectangle
|
|
move.l a2,-(sp)
|
|
lea teSelRect+top(a3),a1
|
|
lea selRectT(a6),a2
|
|
move.l (a1)+,(a2)+
|
|
move.l (a1)+,(a2)+
|
|
move.l (sp)+,a2
|
|
|
|
tst.b onBoundaryFlag(a6) ; cursor on boundary of run
|
|
beq @InMiddle
|
|
tst.w teSize(a3) ; need to test if on a block boundary for
|
|
bpl @InMiddle ; old-styled TE <1Dec88smb>
|
|
|
|
; on a boundary so must test scripts of surrounding style runs (backing-store order) to
|
|
; determine if on a cluster boundary.
|
|
Bsr GetDirection ; get this style run's direction in byte of d1 <7June89smb>
|
|
tst.b prevStyleFlag(a6) ; test if at end or beginning of cursor style run
|
|
beq.s @GotCursorStyle
|
|
|
|
; got script for style run previous to cursor style run
|
|
move.b d1,previousScriptDir(a6) ; <7June89smb>
|
|
|
|
; test for EOL cluster boundary since in previous style run <8Nov88smb>
|
|
cmp.w 2(a2),d3 ; is cursor posn at EOL?
|
|
beq @LineEnd
|
|
|
|
; if already at EOL then make sure not looking beyond lineStarts array <20Nov89smb>
|
|
move.l a0,-(sp)
|
|
lea 2(a2),a0
|
|
lea teLines(a3),a1 ; <20Nov89smb>
|
|
move.w teNLines(a3),d0 ; get num of lines <20Nov89smb>
|
|
add.w d0,d0 ; double for words <20Nov89smb>
|
|
adda.w d0,a1 ; <20Nov89smb>
|
|
cmpa.l a1,a0 ; <20Nov89smb>
|
|
movem.l (sp)+,a0 ; <20Nov89smb>
|
|
bgt.s @LineEnd ; bra if beyond end <20Nov89smb>
|
|
|
|
; truly in the lineStarts array!
|
|
move.l a0,-(sp) ; save <21June89smb>
|
|
addq.l #stStartSize,a0 ; in previous style run, so need next style run
|
|
bra.s @GetScript
|
|
|
|
@GotCursorStyle
|
|
; got script for cursor style run
|
|
move.b d1,cursorScriptDir(a6) ; <7June89smb>
|
|
; test for BOL cluster boundary since in cursor style run <8Nov88smb>
|
|
cmp.w (a2),d3 ; is cursor posn at BOL?
|
|
beq.s @LineEnd
|
|
move.l a0,-(sp) ; save <21June89smb>
|
|
subq.l #stStartSize,a0 ; at beginning so need to check previous style run
|
|
|
|
@GetScript
|
|
; get the other style run's direction (in display order!)
|
|
Bsr GetDirection ; <7June89smb>
|
|
tst.b prevStyleFlag(a6)
|
|
beq.s @GotPrevStyleNow
|
|
move.b d1,cursorScriptDir(a6) ; <7June89smb>
|
|
bra.s @CmpDirs ; <7June8smb>
|
|
|
|
@GotPrevStyleNow
|
|
move.b d1,previousScriptDir(a6) ; <7June89smb>
|
|
|
|
@CmpDirs
|
|
move.l (sp)+,a0 ; restore <21June89smb>
|
|
; compare scripts to see if on a cluster boundary
|
|
move.b cursorScriptDir(a6),d0
|
|
cmp.b previousScriptDir(a6),d0
|
|
bne.s @ClusterBoundary
|
|
; same script so display one cursor
|
|
Bsr OneCursor ; added for simplicity <12/13/88smb>
|
|
bra.s @done ; <12/13/88smb>
|
|
|
|
;**********************
|
|
|
|
@ClusterBoundary
|
|
; on a cluster boundary: need split cursors
|
|
tst.b prevStyleFlag(a6)
|
|
beq.s @GetScriptDirection ; in cursor script
|
|
move.b previousScriptDir(a6),d0
|
|
|
|
@GetScriptDirection
|
|
move.b d0,scriptDirection(a6)
|
|
cmp.b TESysJust,d0 ; added <22Dec88smb>
|
|
bne.s @DiffDirections ; added <22Dec88smb>
|
|
st highCaret(a6) ; added <22Dec88smb>
|
|
@DiffDirections
|
|
tst.b d0
|
|
bne.s @RLScript
|
|
@LRScript
|
|
; if in previous style and LR script direction then measure since at end of style run
|
|
; if in cursor style, width is 0 since at beginning of run so, have width to use <7Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne.s @MeasureRun ; bra to measure if in prevStyle's run
|
|
bra.s @SetUpTwoRects
|
|
@RLScript
|
|
; if in cursor style and RL script direction then measure since at beginning of style run
|
|
; if in previous style and RL script direction AND
|
|
; if RL flow, width is 0 since at end of run, so have width to use <7Nov88smb>
|
|
; if LR flow, then measure since at beginning of RL script run <8Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne.s @SetUpTwoRects ; bra to measure since in prevStyle's run <12July89smb>
|
|
|
|
@MeasureRun
|
|
Bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
|
|
@SetUpTwoRects
|
|
; Setup two rectangles for the split cursors.
|
|
bsr.s SetUp2Rectangles ; moved init of rects into proc <12July89smb>
|
|
bra.s @done
|
|
|
|
;**********************
|
|
|
|
@LineEnd
|
|
Bsr.s OnLineEnd ; added for simplicity <12/13/88smb>
|
|
bra.s @done
|
|
@InMiddle
|
|
Bsr CaretInsideRun ; added for simplicity <12/13/88smb>
|
|
@done
|
|
movem.l (sp)+,RLPosnRegs
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; SetUp2Rectangles
|
|
; <12/16/88smb>
|
|
; Only set up top and bottom edges of split cursor rectangles.
|
|
; The left and right edges will be setup in CaretDisplay.
|
|
;
|
|
; d2 = midpoint (pixels) between top and bottom edges of selRect
|
|
;----------------------------------------------------------------------
|
|
SetUp2Rectangles
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
add.w d5,teSelRect+left(a3) ; left edge of rectangle
|
|
add.w d5,teSelRect+right(a3) ; right edge of rectangle
|
|
; Use half a line heighth for split cursors.
|
|
move.w teSelRect+bottom(a3),d2
|
|
add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance
|
|
IF forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
asr.w #1,d2 ; 1/2 line height - fix Applink bug
|
|
ELSE
|
|
lsr.w #1,d2 ; 1/2 line height
|
|
ENDIF
|
|
|
|
; need two cursors because have arabic/english in same run OR on a cluster boundary
|
|
move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level!
|
|
st ExpandMemRec.emTwoCursorsFlag(a0)
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
tst.b highCaret(a6)
|
|
beq.s @LowCaret
|
|
|
|
; In High Caret run (T): the top edge is ok. Adjust the bottom.
|
|
move.w d2,teSelRect+bottom(a3) ; new bottom (raised by 1/2 the heighth) <12July89smb>
|
|
|
|
; Setup low cursor (perpendicular symbol) now. Save in Cursor2Rect space. <12/13/88smb>
|
|
move.w teSelRect+bottom(a3),(a0)+ ; new top of line
|
|
addq #2,a0
|
|
move.w selRectB(a6),(a0) ; use original bottom
|
|
bra.s @done
|
|
|
|
@LowCaret
|
|
; in Low Caret run (perpendicular symbol): the bottom edge is ok. Adjust the top.
|
|
move.w d2,teSelRect+top(a3) ; new top (lowered by 1/2 the heighth) <12July89smb>
|
|
|
|
; Setup high cursor (T) now. Save in Cursor2Rect space.
|
|
move.w selRectT(a6),(a0)+ ; use original top
|
|
addq #2,a0
|
|
move.w teSelRect+top(a3),(a0) ; new bottom of line
|
|
; say high caret in Cursor2Rect space <21Dec88smb> - for TeSelView
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
ori.w #$00FF,ExpandMemRec.emTwoCursorsFlag(a0)
|
|
@done
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; OnLineEnd
|
|
; <12/13/88smb>
|
|
;
|
|
; The cursor is on a line ending, either the start or end.
|
|
; If the style run is in a direction different than the overall
|
|
; line direction then, on a cluster boundary and need split
|
|
; cursors.
|
|
;
|
|
; Input
|
|
; a0: style run containing cursor
|
|
; a2: ptr to lineStarts array
|
|
; a3: pointer to TE record
|
|
; d0: present style run's script id number
|
|
; d3: absolute position of cursor
|
|
; d5: total pixelWidth of style runs thus far in the line
|
|
;
|
|
;----------------------------------------------------------------------
|
|
OnLineEnd
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vOnLineEnd(a1),a1
|
|
jmp (a1)
|
|
|
|
xOnLineEnd
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
; at EOL/BOL. Is the style run of different persuasion then the line direction? <8Nov88smb>
|
|
bsr GetDirection ; <30May89smb>
|
|
cmp.b TESysJust,d1 ; test if TESysJust = script direction <30May89smb>
|
|
bne.s @EOLClusterBoundary ; if not then on a EOL cluster boundary
|
|
|
|
; on a line end but the style run has the same direction as the line, so only one cursor.
|
|
st doneFlag(a6) ; modified <12/13/88smb>
|
|
tst.b d1 ; <30May89smb>
|
|
bne.s @RLDirection
|
|
|
|
; LR direction
|
|
; if in previous style and LR script direction, then measure since at end of style run
|
|
; if in cursor style, width is 0 since at beginning of run, so have width to use <7Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne @MeasureRun ; bra to measure if in prevStyle's run
|
|
bra @finis
|
|
|
|
@RLDirection
|
|
; if in cursor style and RL script direction then measure since at beginning of style run
|
|
; if in previous style and RL script direction AND
|
|
; if RL flow, width is 0 since at end of run so, have width to use <7Nov88smb>
|
|
; if LR flow, then measure since at beginning of RL script run <8Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
beq @MeasureRun ; bra to measure if in cursor's run
|
|
tst.b TESysJust
|
|
beq @MeasureRun ; LR flow but RL script
|
|
bra @finis
|
|
|
|
;***********
|
|
|
|
@EOLClusterBoundary
|
|
; on a cluster boundary at a line end => script direction different from line direction.
|
|
; need split cursors
|
|
tst.b d1 ; <30May89smb>
|
|
beq.s @LRdirection
|
|
; RL script direction
|
|
cmp.w 2(a2),d3
|
|
beq.s @AtDisplayR ; bra if d3 = lineEnd
|
|
bra.s @AtDisplayL ; d3 = lineStart
|
|
|
|
@LRdirection
|
|
; LR script direction
|
|
cmp.w (a2),d3
|
|
beq.s @AtDisplayR ; bra if d3 = lineStart
|
|
;-----------------------------------------------------------------------------------------
|
|
@AtDisplayL
|
|
; at left end of display line
|
|
; if in LR flow, RL script direction, at BOL, OR if in RL flow, LR script direction, at EOL then
|
|
; 1st cursor at left edge of screen (high caret) and
|
|
; 2nd cursor at measured end of this style run (low caret)
|
|
|
|
move.w selRectL(a6),teSelRect+left(a3) ; 1st cursor at L. edge
|
|
move.w selRectL(a6),teSelRect+right(a3)
|
|
|
|
; measure style run for second cursor
|
|
bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
st doneFlag(a6)
|
|
st lineEndFlag(a6)
|
|
; use half a line heighth for split cursors
|
|
move.w teSelRect+bottom(a3),d2
|
|
add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance
|
|
IF forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
asr.w #1,d2 ; 1/2 line height - fix Applink bug
|
|
ELSE
|
|
lsr.w #1,d2 ; 1/2 line height
|
|
ENDIF
|
|
move.w d2,teSelRect+bottom(a3) ; new bottom (raised by 1/2 the heighth) <12July89smb>
|
|
|
|
move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level!
|
|
st ExpandMemRec.emTwoCursorsFlag(a0)
|
|
; The high cursor (T) goes with the line ending. the top edge is ok. Adjust the bottom. Can only
|
|
; set the top and bottom edges now. May need to measure more style runs. <12/13/88smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
move.w teSelRect+bottom(a3),(a0)+ ; top edge
|
|
addq #2,a0
|
|
move.w selRectB(a6),(a0) ; use original bottom
|
|
bra.s @finis
|
|
;-----------------------------------------------------------------------------------------
|
|
@AtDisplayR
|
|
; at right end of display line
|
|
; if in LR flow, RL script direction, at EOL, OR if in RL flow, LR script direction, at BOL then
|
|
; 1st cursor at present measured width (low caret) and
|
|
; 2nd cursor at end of all style runs on the display line (high caret) (continue measuring till out of runs)
|
|
|
|
add.w d5,teSelRect+left(a3) ; 1st cursor at present measured width
|
|
add.w d5,teSelRect+right(a3)
|
|
|
|
; Setup two rectangles for the split cursors. The low cursor goes with this script run. So,
|
|
; adjust the top edge of the rectangle. <12/13/88smb>
|
|
|
|
st lineEndFlag(a6)
|
|
; use half a line heighth for split cursors
|
|
move.w teSelRect+bottom(a3),d2
|
|
add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance
|
|
IF forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
asr.w #1,d2 ; 1/2 line height - fix Applink bug
|
|
ELSE
|
|
lsr.w #1,d2 ; 1/2 line height
|
|
ENDIF
|
|
move.w d2,teSelRect+top(a3) ; new top (lower by 1/2 the heighth) <12July89smb>
|
|
|
|
move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level!
|
|
st ExpandMemRec.emTwoCursorsFlag(a0)
|
|
|
|
; say high caret in Cursor2Rect space <21Dec88smb> - for TESelView
|
|
ori.w #$00FF,ExpandMemRec.emTwoCursorsFlag(a0)
|
|
|
|
; The high cursor (T) goes with the line ending. the top edge is ok. Adjust the bottom. Can only
|
|
; set the top and bottom edges now. May need to measure more style runs. <12/13/88smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
move.w selRectT(a6),(a0)+ ; use original top of line
|
|
addq #2,a0
|
|
move.w teSelRect+top(a3),(a0) ; bottom edge
|
|
bra.s @finis
|
|
@MeasureRun
|
|
Bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
add.w d5,teSelRect+left(a3) ; left edge of rectangle
|
|
add.w d5,teSelRect+right(a3) ; right edge of rectangle
|
|
@finis
|
|
rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; CaretInsideRun
|
|
; <12/13/88smb>
|
|
;
|
|
; The cursor is in this style run and there's RL text in this
|
|
; teRecord. We may be on a block boundary for unstyled RL text.
|
|
; The cursor is in the middle of a style run so, call C2P twice
|
|
; (with the values smLeftCaret and smRightCaret). If the values
|
|
; returned are different, then two cursors must be drawn, otherwise
|
|
; only one.
|
|
;
|
|
; Input
|
|
; a0: style run containing cursor
|
|
; a3: pointer to TE record
|
|
; d3: absolute position of cursor
|
|
; d5: total pixelWidth of style runs thus far in the line
|
|
; Uses
|
|
;----------------------------------------------------------------------
|
|
CaretInsideRun
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vCaretInsideRun(a1),a1
|
|
jmp (a1)
|
|
|
|
xCaretInsideRun
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
; cursor is in the middle of this run, so call C2P twice to see if split cursors necessary
|
|
st doneFlag(a6)
|
|
move.w #smRightCaret,d2 ; second offset to measure
|
|
swap d2
|
|
move.w #smLeftCaret,d2 ; first offset to measure
|
|
|
|
; parameters for PixelWidths routine (calls Char2Pixel twice)
|
|
move.l a0,a1 ; save pointer to current style run
|
|
move.w d5,-(sp) ; save pixel width from MeasureAndHilite routine
|
|
move.w d3,d0
|
|
sub.w startChar(a1),d0 ; cursor posn relative to start of style run
|
|
; pin to lineStart <5Dec88smb>
|
|
move.w (a2),d1 ; lineStart <5Dec88smb>
|
|
cmp.w startChar(a1),d1 ; <5Dec88smb>
|
|
bls.s @UseStyleStart ; <5Dec88smb> <26June89smb> made unsigned
|
|
sub.w startChar(a1),d1 ; |beginning of line - beginning of style run| <5Dec88smb>
|
|
sub.w d1,d0 ; pin to lineStart! <5Dec88smb>
|
|
; may be at lineStart
|
|
bne.s @UseStyleStart ; <6Dec89smb>
|
|
; if at offset 0 of this line then at the lineStart and may need to measure more style runs <6Dec89smb>
|
|
sf doneFlag(a6) ; <6Dec89smb>
|
|
st lineEndFlag(a6) ; <6Dec89smb>
|
|
@UseStyleStart
|
|
move.w d0,d1 ; same posn just different direction
|
|
bsr PixelWidths ; returns pixelwidths in d5 (R block) & d6 (L block)
|
|
|
|
; <3May89smb> this is a special case that makes this UGLY! If LR text and RL line direction
|
|
; and (offset = SOL or EOL), then must setup teSelRect a little differently with the
|
|
; results returned from C2P.
|
|
tst.b TESysJust
|
|
beq.s @LRdownstream
|
|
; RL line direction. a0 contains the current style.
|
|
bsr GetDirection ; returns script direction in d1
|
|
cmp.b TESysJust,d1
|
|
beq.s @RLdownstream ; RL line direction & RL script run
|
|
; Otherwise, RL line and LR script
|
|
cmp.w d5,d6
|
|
beq.s @RLdownstream
|
|
tst.w d5
|
|
beq.s @ZeroWidth
|
|
exg d5,d6 ; want 0 width in d5: L&R edges are already set in teSelRect.
|
|
@ZeroWidth
|
|
add.w (sp),d6
|
|
bra.s @SetUp2nd ; set up the second rectangle
|
|
|
|
; test line direction to determine where high caret and low caret should display. <12/13/88smb>
|
|
;; tst.b TESysJust
|
|
;; bne.s @RLdownstream
|
|
; <3May89smb> done with mods.
|
|
|
|
; L-R is the downstream direction. d6 is the L block's width. <12/13/88smb>
|
|
; Want downstream script's width in d5. Simplifies set up for second rectangle.
|
|
@LRdownstream
|
|
exg d5,d6
|
|
@RLdownstream
|
|
; R-L is the downstream direction. d5 is the R block's width. <12/13/88smb>
|
|
add.w (sp),d5 ; add pixel width of previous runs on line
|
|
add.w d5,teSelRect+left(a3)
|
|
add.w d5,teSelRect+right(a3)
|
|
add.w (sp),d6
|
|
; test for one cursor
|
|
cmp.w d5,d6
|
|
beq.w @finis
|
|
|
|
; Setup two rectangles for the split cursors.
|
|
; The high cursor (T): the top edge is ok. Adjust the bottom. <12/13/88smb>
|
|
; use half a line heighth for split cursors
|
|
@SetUp2nd
|
|
move.w teSelRect+bottom(a3),d2
|
|
|
|
IF NOT forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
bls.s @ScrollDownBug ; scrolling down in hebrew applelink <1/15/90smb> <14>
|
|
ENDIF
|
|
|
|
add.w teSelRect+top(a3),d2 ; get line height <12July89smb> performance
|
|
|
|
IF forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
asr.w #1,d2 ; 1/2 line height - fix Applink bug
|
|
ELSE
|
|
lsr.w #1,d2 ; 1/2 line height
|
|
ENDIF
|
|
|
|
move.w d2,teSelRect+bottom(a3) ; new bottom (raised by 1/2 the heighth) <12July89smb>
|
|
|
|
; need two cursors because have arabic/english in same run OR on a cluster boundary
|
|
move.l ExpandMem,a0 ; <1Feb89smb> must save for processing at a higher level!
|
|
st ExpandMemRec.emTwoCursorsFlag(a0)
|
|
; <7July89smb> indicate that high caret is not stored in ExpandMem space.
|
|
andi.w #$FF00,ExpandMemRec.emTwoCursorsFlag(a0)
|
|
|
|
; set up low cursor (perpendicular symbol). <12/13/88smb>
|
|
; top edge of rectangle
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
move.w teSelRect+bottom(a3),(a0)+ ; new top of line (same as other rect's bottom edge)
|
|
add.w selRectL(a6),d6 ; add original L. edge
|
|
move.w d6,(a0) ; left
|
|
sub.w #1,(a0)+ ; cursor posn
|
|
move.w selRectB(a6),(a0)+ ; use original bottom of line
|
|
move.w d6,(a0) ; right (same as left)
|
|
|
|
|
|
IF forLocalizability THEN ; <31c-YDS-8/27/91>
|
|
;YS - added to support single carret option
|
|
; handles unstyled text !!!! <3.3>
|
|
clr.l -(sp) ; make space for function result
|
|
move #smGenFlags,-(sp) ; put smSysScript verb to get the SMGR general flags
|
|
_GetEnvirons ; now wh have the general flags
|
|
Move.l (sp)+, d5 ; take return value.
|
|
and.l #(1<<smfDualCaret),d5 ; leave only the right bit
|
|
bne.w @finis ; leave the split carret as is ?
|
|
|
|
clr.l -(sp) ; we will need a place on the stack anyway !
|
|
Tst.b teCarOn(A3) ; if caret on, we would like to calculate the same caret allways
|
|
bne.s @1 ; carret is going on, calculate a new one
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0
|
|
move.b lastScript(a0),d5 ; push script numberused to highligt (d5) to lastScript
|
|
bra.s @2
|
|
|
|
@1 move #smKeyScript,-(sp) ; we will call _GetEnvirons to get the current active (keyboard) script.
|
|
_GetEnvirons ; now we know who the active script
|
|
Move.l (sp), d5 ; take return value (the script number (long !!!)), leave place for return value
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0
|
|
move.b d5, lastScript(a0) ; push script numberused to highligt (d5) to lastScript
|
|
|
|
@2 move.w d5, -(sp) ; push the script (word !!!) for the next call we will need
|
|
|
|
move #smScriptRight,-(sp) ; is that script a right to left script ?
|
|
_GetScript ; we have smScriptRightflag the stack
|
|
move.l (sp)+, d0 ; do = result
|
|
move.l ExpandMem,a0 ; get the scplit cursor addres into A0
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0
|
|
cmp.b TESysJust, d0
|
|
beq.s @UseTop
|
|
@UseBottom
|
|
move.w teSelRect+top(a3),top(a0) ; strech lower cursor
|
|
move.w teSelRect+top(a3),teSelRect+bottom(a3) ; make top = bottom in upper cursor
|
|
bra.s @finis
|
|
@UseTop
|
|
move.w bottom(a0),teSelRect+bottom(a3) ; strech upper cursor
|
|
move.w bottom(a0),top(a0) ; make top = bottom in lower cursor
|
|
ENDIF
|
|
|
|
@finis
|
|
addq.l #2,sp ; restore stack (d5 pushed)
|
|
rts
|
|
|
|
IF NOT forLocalizability THEN ; <31a-YDS-8/27/91>
|
|
@ScrollDownBug
|
|
; when scrolling down the selRect top & bottom values are negative. this causes a large caret once divided
|
|
move.l ExpandMem,a0 ; <1/15/90smb>
|
|
sf ExpandMemRec.emTwoCursorsFlag(a0) ; <1/15/90smb>
|
|
addq.l #2,sp ; restore stack (d5 pushed)
|
|
rts
|
|
ENDIF
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; OneCursor
|
|
; <12/13/88smb>
|
|
;
|
|
; The cursor is on a script boundary but surrounded by runs of
|
|
; the same script, therefore only one cursor is necessary. This
|
|
; routine sets up the selection rectangle at the position where
|
|
; the cursor should be displayed.
|
|
;
|
|
; Input
|
|
; a0: style run containing cursor
|
|
; a3: pointer to TE record
|
|
; d0: present style run's script id number
|
|
; d3: absolute position of cursor
|
|
; d5: total pixelWidth of style runs thus far in the line
|
|
; Modifies d5 (appropriately), d0.
|
|
;----------------------------------------------------------------------
|
|
OneCursor
|
|
with SharedFrame,TEFormatOrder
|
|
st doneFlag(a6) ; only need one cursor since not a cluster boundary
|
|
bsr.s GetDirection ; <30May89smb> cc's set
|
|
bne.s @RLScript
|
|
; LR Script
|
|
; if in previous style and LR script direction then measure since at end of style run
|
|
; if in cursor style width is 0 since at beginning of run so, have width to use <7Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
bne.s @MeasureRun ; bra to measure if in prevStyle's run
|
|
bra.s @finis
|
|
@RLScript
|
|
; if in cursor style and RL script direction then measure since at beginning of style run
|
|
; if in previous style and RL script direction AND
|
|
; if RL flow, width is 0 since at end of run so, have width to use <7Nov88smb>
|
|
; if LR flow, then measure since at beginning of RL script run <8Nov88smb>
|
|
tst.b prevStyleFlag(a6)
|
|
beq.s @MeasureRun ; bra to measure if in cursor's run
|
|
tst.b TESysJust
|
|
bne.s @finis ; don't branch if LR flow but RL script
|
|
|
|
@MeasureRun
|
|
Bsr MeasureWholeRun
|
|
add.w d0,d5
|
|
add.w d5,teSelRect+left(a3) ; left edge of rectangle
|
|
add.w d5,teSelRect+right(a3) ; right edge of rectangle
|
|
@finis
|
|
rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetDirection
|
|
; <30May89smb>
|
|
;
|
|
; Sets the direction of the current font in the stFace word in the
|
|
; StyleRecord by calling the Script Manager.
|
|
;
|
|
; Input:
|
|
; d1 = font number
|
|
; a0 = pointer to face+1 byte where to set the direction
|
|
;
|
|
; Output:
|
|
; Destroys d1.
|
|
; Preserves d0,d2,a0,a1.
|
|
; High bit of high-order byte of stFace(a0) set to direction.
|
|
;----------------------------------------------------------------------
|
|
SetDirection
|
|
movem.l d0/d2/a0/a1,-(SP) ; GetScript destroys these
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vSetDirection(a0),a0
|
|
jmp (a0)
|
|
|
|
xSetDirection
|
|
|
|
sub.w #6,sp ; allocate returns, 1 long, 1 int
|
|
move.w d1,-(sp) ; fontNumber param
|
|
_Font2Script ; returns script
|
|
move.w #smScriptRight,-(sp) ; pass verb
|
|
_GetScript
|
|
move.l (sp)+,d1 ; get byte equal to line direction
|
|
movem.l (SP)+,d0/d2/a0/a1 ; restore
|
|
bclr #7,(a0)
|
|
tst.b d1 ; right directional script?
|
|
beq.s @LeftDir ; bra if not
|
|
bset #7,(a0)
|
|
@LeftDir
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetDirection
|
|
; <30May89smb>
|
|
;
|
|
; Gets the script direction for the current style run by getting
|
|
; it from the top bit of the high-order byte of the Face value
|
|
; that corresponds to the style index of the current style run
|
|
; (REMEMBER: the Face value is in different places for styled and
|
|
; unstyled teRecords).
|
|
;
|
|
; Input
|
|
; a0: ptr to current style run (for styled text)
|
|
; a3: ptr to teRecord (for unstyled text)
|
|
; Output
|
|
; d1.b: script direction (00 = LR/ $FF = RL)
|
|
; cc's set, but not all calling routines take advantage of this
|
|
; Preserves d0/a0.
|
|
;----------------------------------------------------------------------
|
|
GetDirection
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetDirection(a1),a1
|
|
jmp (a1)
|
|
|
|
xGetDirection
|
|
|
|
movem.l d0/a0,-(sp)
|
|
tst.w teSize(a3) ; <15June89smb>
|
|
bpl.s @Unstyled ; <15June89smb>
|
|
; styled text
|
|
move.w styleIndex(A0),D0 ; fetch index into style table
|
|
bsr GetStyle ; returns ptr to associated style table entry in a0
|
|
clr.w d1
|
|
move.b stFace+1(a0),d1 ; sets condition codes
|
|
bra.s @setRtn
|
|
@Unstyled
|
|
move.b teFace+1(a3),d1 ; get from the teRecord not the styleRec
|
|
@setRtn
|
|
beq.s @done
|
|
st d1 ; want the return value to be 00/FF <6June89smb>
|
|
@done
|
|
movem.l (sp)+,d0/a0
|
|
rts
|
|
|
|
;formFeed
|
|
;-----------------------------------------------------------------------------------------
|
|
;
|
|
; GetFormatOrdering
|
|
; <8Mar89smb>
|
|
;
|
|
; Created a routine that sets up format ordering information for styled and
|
|
; unstyled text.
|
|
;-----------------------------------------------------------------------------------------
|
|
GetFormatOrdering
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
tst.w teSize(a3)
|
|
bmi.s @GetStyles ; bra if styled edit record
|
|
|
|
; old-style record: one style for the whole record. My code is expecting a0 to contain a ptr to
|
|
; the startChar for the current style so must fake the setup.
|
|
clr.l firstStyleRun(a6)
|
|
clr.l secondStyleRun(a6)
|
|
move.w teLength(a3),secondStyleRun(a6)
|
|
lea firstStyleRun(a6),a0
|
|
move.l a0,a2StyleRun(a6) ; save style run of lineStart as a ptr
|
|
move.w #1,d2
|
|
move.w d2,numberOfRuns(a6) ; save
|
|
lea.l fmtOrdering(a6),a1 ; <18Jan89smb>
|
|
move.l a1,fmtOrderingPtr(a6) ; <18Jan89smb>
|
|
clr.w fmtOrderingIndex(a6) ; <18Jan89smb>
|
|
clr.w (a1)
|
|
bra.s @done ; <4Jan88smb>
|
|
@GetStyles
|
|
move.w (a2),d0
|
|
move.w 2(a2),d1
|
|
bsr.s teGetFormatOrder ; <4Jan88smb>
|
|
@done
|
|
rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;-------------------------------------------------------------------
|
|
;
|
|
; GetStylesInOrder
|
|
;
|
|
; This gets the ordering of format runs on a line and accesses
|
|
; the first display format order.
|
|
; <10Nov88smb>
|
|
; ENTRY
|
|
; d0 start offset
|
|
; d1 end offset
|
|
; a6 DoText's local frame: TextFrame;
|
|
;
|
|
; EXIT
|
|
; d2 number of styles still to process
|
|
; a0 ptr to next style for processing
|
|
; a1 ptr to storage area for format orderings
|
|
; fmtOrdering(a6) contains a handle (if allocated) to a storage area
|
|
; fmtOrderingPtr(a6) contains a pointer to a storage area
|
|
; condition codes set for evaluation
|
|
;
|
|
;-------------------------------------------------------------------
|
|
GetStylesInOrder
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetStylesInOrder(a0),a0
|
|
jmp (a0)
|
|
|
|
xGetStylesInOrder
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
bsr.s teGetFormatOrder ; <9Jan89smb>
|
|
; get next style in a0 using the results from getFormatOrder
|
|
bsr GetNextDisplayStyle ; <4Jan89smb>
|
|
addq #1,fmtOrderingIndex(a6) ; incr the style run counter
|
|
SubQ #1,D2 ; dec the style counter
|
|
Rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;-------------------------------------------------------------------
|
|
;
|
|
; teGetFormatOrder
|
|
;
|
|
; This routine orders the text properly for DISPLAY of bidirectional
|
|
; format runs on a line by calling the SMgr routine GetFormatOrder.
|
|
; We won't come in here unless the teRecord is styled!
|
|
;
|
|
; <10Nov88smb>
|
|
; ENTRY
|
|
; d0 start offset
|
|
; d1 end offset
|
|
; a3 dereferenced pointer to teRecord
|
|
; a6 DoText's local frame: TextFrame
|
|
; USES
|
|
; a0,a1,d0-d2
|
|
; EXIT
|
|
; d2 number of styles still to process
|
|
; a0 ptr to next style for processing
|
|
; a1 ptr to storage area containing correct ordering of format runs for DISPLAY
|
|
; fmtOrdering(a6) contains a handle (if allocated) to a storage area
|
|
; fmtOrderingPtr(a6) contains a pointer to a storage area
|
|
; condition codes set for evaluation
|
|
;-------------------------------------------------------------------
|
|
teGetFormatOrder
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vteGetFormatOrder(a0),a0
|
|
jmp (a0)
|
|
|
|
xteGetFormatOrder
|
|
|
|
FormatOrderRegs reg d2-d4
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
moveq.l #0,d2
|
|
|
|
bsr GetCurStyle
|
|
; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) Oh-Dopey-Me!
|
|
move.l teStylesH(a3),a1 ; <5Aug89smb>
|
|
move.l (a1),a1 ; deref <5Aug89smb>
|
|
sub.l a1,a0 ; save posn as an offset <5Aug89smb>
|
|
move.l a0,a2StyleRun(a6) ; save offset to style run of lineStart
|
|
|
|
add.l a1,a0 ; restore for GetNumStyles call!
|
|
bsr GetNumStyles ; number of runs on this line
|
|
move.w d0,d2
|
|
move.w d2,numberOfRuns(a6) ; save
|
|
|
|
Bsr GetStyleStorage ; <18Jan89smb> returns fmtOrdering array in a1
|
|
; Initialize fmtOrdering array with LR format ordering (0->d2) (aka: backin-store ordering)
|
|
moveq #0,d0
|
|
bra.s @CheckZero
|
|
@FillArray
|
|
move.w d0,(a1)+ ; fill 'er up!
|
|
addq.w #1,d0 ; next integer value for array
|
|
@CheckZero
|
|
dbra d2,@FillArray ; loop til d2 = -1
|
|
move.w numberOfRuns(a6),d2 ; restore
|
|
|
|
; determine if display order is different from backin-store order
|
|
clr.w fmtOrderingIndex(a6)
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
bge.s @finis
|
|
|
|
; call GetFormatOrder for correct display order for style runs
|
|
; test for only one style run <23June89smb>
|
|
move.l a0,-(sp) ; save
|
|
Move.L teStylesH(a3),a0 ; handle to style info
|
|
Move.L (a0),a0 ; dereference
|
|
cmpi.w #1,nRuns(a0) ; only one run?
|
|
beq.s @done ; yep, so done
|
|
move.l (sp)+,a0 ; restore
|
|
|
|
movem.l FormatOrderRegs,-(sp)
|
|
; parameter setup
|
|
move.l fmtOrderingPtr(a6),-(sp) ; formatOrder array
|
|
move.w #0,-(sp) ; 1st format
|
|
subq.w #1,d0
|
|
move.w d0,-(sp) ; last format (1 less than num of runs)
|
|
move.b TESysJust,-(sp) ; lineRight
|
|
pea teDirectionProc
|
|
|
|
; parameter for direction procedure
|
|
move.l a0,startStyleRun(a6) ; dirParam is the ptr to first style run and
|
|
move.l a3,teRecPtr(a6) ; and the pointer to the teRecord
|
|
pea.l directionParam(a6)
|
|
_GetFormatOrder ; returns display ordering in array
|
|
|
|
movem.l (sp)+,FormatOrderRegs
|
|
bra.s @finis
|
|
@done
|
|
move.l (sp)+,a0
|
|
@finis
|
|
rts ; return to sender!
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetNextDisplayStyle
|
|
; <22Dec88smb>
|
|
; Does exactly what it's name says it does!
|
|
;
|
|
; On entry
|
|
; a6 = the local stack frame
|
|
; On exit
|
|
; a0 = pointer to next style run
|
|
; a1 = trashed
|
|
; d0 = trashed
|
|
;----------------------------------------------------------------------
|
|
GetNextDisplayStyle
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
movea.l a2StyleRun(a6),a0
|
|
; For styled is an offset to desired posn in style run array, otherwise is a ptr <5Aug89smb>
|
|
; Made a2StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!)
|
|
; Get to posn in styleRun array via the style handle and saved offset <5Aug89smb>
|
|
tst.w teSize(a3) ; <5Aug89smb>
|
|
bpl.s @Unstyled ; saved as a ptr for unstyled text! <5Aug89smb>
|
|
; styled teRec
|
|
move.l teStylesH(a3),a1 ; <5Aug89smb>
|
|
move.l (a1),a1 ; deref <5Aug89smb>
|
|
add.l a1,a0 ; add to offset to get desired posn in the array <5Aug89smb>
|
|
@Unstyled
|
|
move.w fmtOrderingIndex(a6),d0 ; index (0-d2) into array for next style run
|
|
lsl.w #1,d0 ; index into fmtOrdering array <27June89smb>
|
|
move.l fmtOrderingPtr(a6),a1
|
|
move.w 0(a1,d0.w),d0 ; index of style run to process
|
|
move.w d0,styleRunIndex(a6)
|
|
lsl.w #lnStStartSize,d0 ; offset in styleRun array <27June89smb>
|
|
lea.l 0(a0,d0.w),a0 ; pointer to next style run
|
|
rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetStyleStorage
|
|
;
|
|
; This routine allocates a storage area for the ordering of
|
|
; style runs on this line in teGetFormatOrder. It will be in the
|
|
; local frame if the number of style runs on this line is small
|
|
; enough (<= #numStyleRuns). Otherwise, a handle is allocated
|
|
; for storage. It saves the handle in fmtOrdering(a6) and the
|
|
; pointer in fmtOrderingPtr(a6).
|
|
; <14Nov88smb>
|
|
;
|
|
; Entry:
|
|
; d2: number of style runs between the offsets in low word/ high word cleared
|
|
; a0: ptr to style run at first offset
|
|
; Exit:
|
|
; a0: preserved
|
|
; a1: ptr to storage area for ordering of style runs
|
|
; d2: preserved
|
|
; fmtOrderingPtr(a6): pointer to space for format ordering array
|
|
; Uses:
|
|
; d0
|
|
; Modifies fmtOrdering(a6) if a handle is allocated for storage
|
|
;----------------------------------------------------------------------
|
|
GetStyleStorage
|
|
|
|
StorageRegs reg d2/a0
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
movem.l StorageRegs,-(sp)
|
|
|
|
; indicate a handle was NOT allocated
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
sf ExpandMemRec.emFmtOrderHFlag(a0)
|
|
|
|
; initialize a1 for teGetFormatOrder call: wants a pointer to the storage area
|
|
lea.l fmtOrdering(a6),a1 ; may be replaced if too many style runs
|
|
move.l a1,fmtOrderingPtr(a6)
|
|
|
|
cmpi.w #numStyleRuns,d2
|
|
bls.s @done ; bra if fits ok <26June89smb> made unsigned
|
|
|
|
|
|
; local frame too small, get a handle to hold all the style runs on this line
|
|
move.l ExpandMem,a0 ; <1Feb89smb> indicate a handle was allocated
|
|
st ExpandMemRec.emFmtOrderHFlag(a0)
|
|
|
|
lsl.w #1,d2 ; mult number of style runs by 2 for byte cnt
|
|
move.l d2,d0
|
|
_NewHandle ,CLEAR ; allocate and clear a block and return handle in a0
|
|
bne.s @sysErr ; exit if system error
|
|
|
|
_HLock
|
|
bne.s @CleanUp
|
|
|
|
; dereference the handle and save
|
|
move.l (a0),a1 ; for teGetFormatOrder
|
|
move.l a0,fmtOrdering(a6) ; save handle
|
|
move.l (a0),fmtOrderingPtr(a6) ; need pointer for processing style runs
|
|
@done
|
|
movem.l (sp)+,StorageRegs
|
|
Rts
|
|
|
|
|
|
; OH NO!!!! can't get no memory!
|
|
@CleanUp
|
|
; deallocate handle in a0
|
|
move.l d0,-(sp) ; save initial error
|
|
_DisposHandle
|
|
move.l (sp)+,d0 ; restore initial error
|
|
@sysErr
|
|
_SysError ; go bye-bye with error in d0
|
|
|
|
endwith
|
|
|
|
;formFeed
|
|
;-------------------------------------------------------------------
|
|
;
|
|
; teDirectionProc
|
|
; <29Sept88smb>
|
|
;
|
|
; This routine returns the direction of a style run,
|
|
; 00 for Left and $FF for Right. It is called from
|
|
; the Script Manager routine GetFormatOrder.
|
|
;
|
|
; Function MyRLDirProc (theFormat: Integer;
|
|
; dirParam: Ptr): Boolean;
|
|
;
|
|
; Input:
|
|
; sp.w: theFormat
|
|
; sp.l: dirParam:
|
|
; - ptr into the styleRun array at the 1st offset's style run
|
|
; - pointer to the teRecord
|
|
; Output:
|
|
; a0 contains the return address at exit
|
|
; 00/$FF on the stack (sp.b) for direction
|
|
; Register Usage:
|
|
; a3 = teRecord
|
|
;------------------------------------------------------------------
|
|
teDirectionProc
|
|
|
|
DirFrame record {a6Link},decr
|
|
result ds.w 1 ; MyDirProc boolean result
|
|
argTop equ *
|
|
format ds.w 1 ; theFormat parameter
|
|
dirParam ds.l 1 ; dirParam parameter
|
|
argBottom equ *
|
|
return ds.l 1
|
|
a6Link ds.l 1
|
|
DirFrameSz equ *
|
|
EndR
|
|
|
|
DirProcRegs reg d0/d1/a1/a3
|
|
|
|
with DirFrame
|
|
link a6,#DirFrameSz
|
|
movem.l DirProcRegs,-(sp)
|
|
|
|
; get parameters: style run pointer and teRecord pointer
|
|
move.l dirParam(a6),a0
|
|
move.l (a0)+,a1 ; pointer to style run array
|
|
move.l (a0),a3 ; get to teRecord
|
|
|
|
move.w format(a6),d0
|
|
lsl.w #2,d0 ; incr ptr into styleRun array
|
|
move.l a1,a0 ; address of style run array
|
|
add.w d0,a0 ; new pointer to current style run <10jan89smb>
|
|
bsr GetDirection ; <10jan89smb>
|
|
move.b d1,result(a6) ; 0 => Left to Right; otherwise Right to Left <10jan89smb>
|
|
|
|
movem.l (sp)+,DirProcRegs
|
|
unlk a6
|
|
move.l (sp)+,a0 ; pop return
|
|
addq.l #(argTop-argBottom),sp
|
|
jmp (a0)
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FreeFmtOrderArray
|
|
; <15Nov88smb>
|
|
; Determine if a handle for style runs needs to be deallocated
|
|
; and if so, do it!
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
FreeFmtOrderArray
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
tst.b ExpandMemRec.emFmtOrderHFlag(a0)
|
|
beq.s @NoHandle
|
|
; deallocate the handle that's saved in FmtOrdering(a6)
|
|
sf ExpandMemRec.emFmtOrderHFlag(a0)
|
|
move.l fmtOrdering(a6),a0
|
|
_DisposHandle
|
|
@NoHandle
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoHilite
|
|
;
|
|
; Modified to use SMgr HiliteText.
|
|
; ********* Be sure to notice the unusual use of link/unlk here *******
|
|
; ********* due to multiple line highlighting! *******
|
|
; Entry
|
|
; a3 pointer to locked edit record
|
|
; a4 handle to teRecord <27>
|
|
; d3 position of first character to redraw
|
|
; d4 position of last character to redraw
|
|
; a6 DoText's local frame: TextFrame
|
|
;----------------------------------------------------------------------
|
|
DoHilite
|
|
|
|
; If a Roman system then use old DoHilite code: HyperCard expects to hilite a whole region not three! <3Oct89smb>
|
|
move.l ExpandMem,a0
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; total number of installed scripts
|
|
beq RomanDoHilite ; use old DoHilite
|
|
|
|
; use this code for mixed directional text
|
|
|
|
Bsr PinDisplay
|
|
Bsr Preamble ; set rLine to A2 line, d5 = d4
|
|
; sets A2 to point to line containing d3
|
|
Bsr LineRect ; get top, bottom and just (from A2)
|
|
|
|
move.l a4,-(sp) ; need for OnSameLine vector <26June89smb>
|
|
|
|
with HiliteFrame
|
|
link a6,#HiLiteSz ; LineRect needs to access doText stack frame
|
|
|
|
movea.l a2,a1 ; save d3 lineStart
|
|
cmp.w d3,d4 ; wrong order?
|
|
beq @unLinkFrame
|
|
bhi.s @Get2ndLine ; no, correct
|
|
exg d3,d4 ; fix
|
|
|
|
; find out the first offset's line for Right to Left directional text
|
|
move.w d3,d0
|
|
lea teLines(a3),a2 ; point to line starts
|
|
bsr GetLine ; returns ptr to line in a2
|
|
bra.s @CompareLines
|
|
@Get2ndLine
|
|
; test if 2nd offset is at the end of the 1st offset's line <2Dec88smb>
|
|
cmp.w 2(a2),d4 ; <2Dec88smb>
|
|
beq.s @CompareLines ; <2Dec88smb>
|
|
|
|
; get the second offset's line. Already have lineStart for d3 in a1
|
|
move.w d4,d0
|
|
bsr GetLine ; returns ptr to line in a2
|
|
|
|
@CompareLines
|
|
exg a1,a2
|
|
cmpa.l a1,a2
|
|
bne.s @MultipleLines ; over multiple lines
|
|
|
|
bsr xOnSameLine ; skip the vector code since it wipes out a4 <27>
|
|
bra @unLinkFrame
|
|
|
|
@MultipleLines
|
|
; [d3,d4] over multiple line
|
|
; set up for line containing d3
|
|
move.l a1,d4Line(a6) ; save lineStart for d4 for later
|
|
move.l a2,d3Line(a6)
|
|
move.w d4,savD4(a6)
|
|
move.w 2(a2),d4 ; end of d3 line
|
|
bsr xOnSameLine ; skip the vector code since it wipes out a4 <27>
|
|
|
|
; set up for line containing d4
|
|
|
|
move.w savD4(a6),d4
|
|
move.l d4Line(a6),a2 ; LineRect wants the current line in a2
|
|
move.w (a2),d3 ; beginning of d3 line
|
|
|
|
; ********* Be sure to notice the unusual use of link/unlk here *******
|
|
; ********* due to multiple line highlighting! *******
|
|
move.l d3Line(a6),a1 ; temp for unlink
|
|
unlk a6 ; unlink HiliteFrame for LineRect *********
|
|
move.w teSelRect+bottom(a3),-(sp) ; save for middle rectangle's top edge
|
|
move.l a1,-(sp) ; save d3's line
|
|
bsr LineRect ; get top, bottom and just (from A2)
|
|
bsr xOnSameLine ; skip the vector code since it wipes out a4 <27>
|
|
|
|
move.l (sp)+,a1 ; d3's line
|
|
; now hilite the middle rectangle, between the lines containing the offsets.
|
|
; a1 = ptr to line containing d3
|
|
; a2 = ptr to line containing d4
|
|
|
|
; tests for lines inbetween 1st and last
|
|
move.w 2(a1),d2 ; end of 1st line
|
|
cmp.w (a2),d2 ; end of 1st rectangle = beginning of last rectangle
|
|
beq.s @noMidRect ; done: no middle rectangle
|
|
|
|
;------------------------------------------- <16>
|
|
IF hasInlineInput THEN ; <16>
|
|
; if inlineInput then don't want to hilite to edge of selRect, only to text boundaries <16>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFInlineInput,d0 ; is this Inline Input feature desired?
|
|
beq.s @HiliteMiddle ; no, so hilite middle rect as one!
|
|
; inline input so measure the middle rectangle of text
|
|
; a1 = ptr to line containing d3
|
|
; a2 = ptr to line containing d4
|
|
@AnotherLine
|
|
move.w d2,d3 ; d2 contains the new d3
|
|
add.w #2,a1 ; increment to pt to line containing new d3
|
|
move.w 2(a1),d4
|
|
movem.l a1/a2,-(sp) ; save d3 & d4's line
|
|
move.l a1,a2 ; LineRect wants the current line in a2
|
|
bsr LineRect ; get top, bottom & just (from a2)
|
|
bsr xOnSameLine ; skip the vector code since it wipes out a4 <27>
|
|
movem.l (sp)+,a1/a2
|
|
move.w 2(a1),d2 ; end of d3's line
|
|
cmp.w (a2),d2 ; end of d3's line = beginning of last line?
|
|
bne.s @AnotherLine ; bra if another line to measure & hilite
|
|
bra.s @noMidRect ; otherwise done <16>
|
|
ENDIF ; <16>
|
|
;------------------------------------------- <16>
|
|
|
|
; set up selRect(a3)
|
|
@HiliteMiddle
|
|
move.w teSelRect+top(a3),teSelRect+bottom(a3) ; top of last rect = bottom of middle rect
|
|
move.w (sp)+,teSelRect+top(a3) ; bottom of 1st rect = top of middle rect
|
|
Move.W #UnboundLeft,teSelRect+left(a3) ; far left
|
|
Move.W #UnboundRight,teSelRect+right(a3) ; far right
|
|
|
|
Move.L teHiHook(a3),D0 ; do the inversion via hook if exists
|
|
Bsr InvertHook ; hilite it
|
|
bra.s @finis
|
|
|
|
@noMidRect
|
|
addq #2,a7 ; don't need saved pixelWidth for top edge
|
|
bra.s @finis
|
|
@unLinkFrame
|
|
; ********* Be sure to notice the unusual use of link/unlk here *******
|
|
; ********* due to multiple line highlighting! *******
|
|
unlk a6 ; unlink HiliteFrame
|
|
@finis
|
|
move.l (sp)+,a4 ; restore handle <26June89smb>
|
|
bra doBye
|
|
endWith
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
RomanDoHilite
|
|
Bsr PinDisplay
|
|
Bsr Preamble ; set rLine to A2 line
|
|
|
|
Bsr LineRect ; get top, bottom and just
|
|
Bsr PrepLine ; pin D4 at line end
|
|
Bls.S @done ; done... <C971/RWW102887>NO
|
|
|
|
Bsr ChkBounds ; check far left and right <C971/RWW102887>NO
|
|
|
|
Move.L teHiHook(A3),D0 ; do the inversion via hook if
|
|
Bsr InvertHook ; there
|
|
|
|
Cmp.W 2(A2),D5 ; only 1 line?
|
|
Bls.S @done ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
Bsr PtrToLine ; get current line #
|
|
Move.W D0,D1 ; save it
|
|
Move.W D5,D0 ; offset to look for
|
|
Bsr GetLine ; get D5 line ptr
|
|
Bsr PtrToLine ; convert A2 ptr to line #
|
|
AddQ #1,D1
|
|
Cmp.W D0,D1 ; get the difference
|
|
Beq.S @LastLine ; no lines inbetween
|
|
|
|
Move.W D0,-(SP) ; save line #
|
|
Exg D0,D1
|
|
Move.W teSelRect+bottom(A3),teSelRect+top(A3)
|
|
Bsr GetLineHites ; hites from 2nd to last lines
|
|
Add.W D0,teSelRect+bottom(A3) ; hite to last line
|
|
Move.W #UnboundLeft,teSelRect+left(A3) ; far left
|
|
Move.W #UnboundRight,teSelRect+right(A3) ; far right
|
|
|
|
Move.L teHiHook(A3),D0
|
|
Bsr InvertHook ; hilite it
|
|
Move.W (SP)+,D0 ; restore line #
|
|
|
|
; hilite last line
|
|
@LastLine
|
|
Bsr NextLineRect ; get rectangle for last line <C971/RWW102887>NO
|
|
Move.W (A2),D3 ; for chkBounds
|
|
Bsr PrepLine ; get left and right
|
|
Bls.S @done ; done...
|
|
|
|
Bsr ChkBounds ; check far left and right <C971/RWW102887>NO
|
|
|
|
Move.L teHiHook(A3),D0 ; do the inversion via hook if
|
|
Bsr InvertHook ; there
|
|
@done
|
|
Bra doBye
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; OnSameLine
|
|
;
|
|
; <12Oct88smb>
|
|
;
|
|
; Get the format ordering for the current line containing d3.
|
|
; Hilite appropriately in the style runs containing character
|
|
; offsets d3 & d4. Use the format ordering to hilite the
|
|
; necessary runs in between the two runs.
|
|
;
|
|
; Input:
|
|
; d0 = initial L edge of selection rectangle
|
|
; d1 = initial R edge of selection rectangle
|
|
; d3 = 1st character position to redraw
|
|
; d4 = 2nd character position to redraw
|
|
; d5 = 0; cleared to accumulate widths of style runs
|
|
;
|
|
; a0 = ptr to startChar for style of 1st character position
|
|
; a1 = lineStart of current line containing d4
|
|
; a2 = lineStart of current line containing d3
|
|
;
|
|
; Output:
|
|
; d5 = pixelWidth of the line, up to the 1st character position
|
|
;
|
|
;----------------------------------------------------------------------
|
|
OnSameLine
|
|
move.l ExpandMem,a4 ; <28June89smb>
|
|
move.l ExpandMemRec.vOnSameLine(a4),a4
|
|
jmp (a4)
|
|
|
|
xOnSameLine
|
|
|
|
SameLineRegs reg d3/d4/d7/a0-a1
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
link a6,#SharedFrameSz
|
|
movem.l SameLineRegs,-(sp)
|
|
|
|
; initialize
|
|
moveq.l #0,d5 ; cleared to accumulate widths of style runs from MeasureWidth and PixelWidths
|
|
moveq.l #0,d2
|
|
clr.w totalWidth(a6)
|
|
clr.w hiliteInbetween(a6) ; set sameStyle and hiliteInbetween to F.
|
|
sf doneFlag(a6)
|
|
clr.w foundD4(a6) ; clear D3 and D4 index flag
|
|
clr.l d4FmtIndex(a6) ; clear D3 and D4 holders
|
|
clr.l hiliteREndFlag(a6) ; clear left and right end flags
|
|
|
|
Move.w teSelRect+left(A3),selRectL(a6) ; preserve initial L. edge
|
|
Move.w teSelRect+right(A3),selRectR(a6) ; preserve initial R. edge
|
|
Move.w selRectL(a6),anchorL(a6) ; initialize L. anchor
|
|
Move.w selRectR(a6),anchorR(a6) ; initialize R. anchor
|
|
|
|
; [d3,d4] are on the same line
|
|
tst.w teSize(a3)
|
|
bpl @oldStyle ; old style edit record
|
|
|
|
; get style runs for character offsets
|
|
move.w d3,d0
|
|
bsr GetCurStyle
|
|
; made d3StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) Oh-Dopey-Me!
|
|
move.l a0,-(sp) ; save <19Aug89smb>
|
|
move.l teStylesH(a3),a1 ; <19Aug89smb>
|
|
move.l (a1),a1 ; deref <19Aug89smb>
|
|
sub.l a1,a0 ; save posn as an offset <19Aug89smb>
|
|
move.l a0,d3StyleRun(a6) ; save offset to style run of lineStart
|
|
move.l (sp)+,a0 ; restore for FixFormatEnd call<19Aug89smb>
|
|
|
|
bsr FixFormatEnd ; get real end position of run <6Mar89smb>
|
|
cmp.w d0,d4
|
|
bhi.s @GetD4Style
|
|
; in same style run as d3
|
|
; made d4StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) Oh-Dopey-Me!
|
|
move.l teStylesH(a3),a1 ; <19Aug89smb>
|
|
move.l (a1),a1 ; deref <19Aug89smb>
|
|
sub.l a1,a0 ; save posn as an offset <19Aug89smb>
|
|
move.l a0,d4StyleRun(a6) ; save as offset
|
|
bra.s @GetDisplayOrder
|
|
@GetD4Style
|
|
move.w d4,d0
|
|
bsr GetCurStyle
|
|
cmp.w startChar(a0),d4 ; is d4 the start of this run? <29June89smb>
|
|
bne.s @SaveD4StyleRun ; bra if not. the style is correct. <29June89smb>
|
|
; Otherwise, want the previous style run since d4 is on a boundary, and it indicates the rightmost
|
|
; end of the hilite rectangle. d4StyleRun in this case, should be a pointer to the style run which
|
|
; ends w/ d4, not begins w/ d4. GetCurStyle doesn't give us what we need, so fix it! <29June89smb>
|
|
subq.l #stStartSize,a0
|
|
@SaveD4StyleRun
|
|
; made d4StyleRun(a6) an offset - can't save the ptr! (the handle's not locked!) Oh-Dopey-Me!
|
|
move.l teStylesH(a3),a1 ; <19Aug89smb>
|
|
move.l (a1),a1 ; deref <19Aug89smb>
|
|
sub.l a1,a0 ; save posn as an offset <19Aug89smb>
|
|
move.l a0,d4StyleRun(a6) ; save as offset
|
|
|
|
@GetDisplayOrder
|
|
move.w (a2),d0
|
|
move.w 2(a2),d1
|
|
Bsr teGetFormatOrder ; <4Jan88smb>
|
|
|
|
; Made d3StyleRun(a6) & d4StyleRun(a6) an offset - can't save the ptr! (unlocked handle!)
|
|
; Get to posn in styleRun array via the Style Handle and saved offset after moving memory
|
|
; in teGetFormatOrder <19Aug89smb>
|
|
move.l teStylesH(a3),a0 ; <19Aug89smb>
|
|
move.l (a0),a0 ; deref <19Aug89smb>
|
|
move.l a0,-(sp) ; <19Aug89smb>
|
|
adda.l d3StyleRun(a6),a0 ; <19Aug89smb>
|
|
move.l a0,d3StyleRun(a6) ; add in offset to desired posn in the array <19Aug89smb>
|
|
move.l (sp)+,a0 ; <19Aug89smb>
|
|
adda.l d4StyleRun(a6),a0 ; <19Aug89smb>
|
|
move.l a0,d4StyleRun(a6) ; add in offset to desired posn in the array <19Aug89smb>
|
|
|
|
; get the format order indexes for the character offsets (could be the same)
|
|
@Loop4Indexes
|
|
Bsr GetNextDisplayStyle ; <22Dec88smb>
|
|
addq #1,fmtOrderingIndex(a6) ; incr the format ordering array counter
|
|
SubQ #1,D2 ; dec the style counter
|
|
|
|
; is this the same style run as one of the character offsets?
|
|
cmpa.l d3StyleRun(a6),a0
|
|
bne.s @testD4
|
|
move.w styleRunIndex(a6),d3FmtIndex(a6)
|
|
tst.b foundD4(a6)
|
|
bne.s @MeasureNow ; have both offsets' indeces in the fmt array
|
|
st foundD3(a6)
|
|
@testD4
|
|
cmpa.l d4StyleRun(a6),a0
|
|
bne.s @Loop4Indexes
|
|
move.w styleRunIndex(a6),d4FmtIndex(a6)
|
|
tst.b foundD3(a6)
|
|
bne.s @MeasureNow ; have both offsets' indeces in the fmt array
|
|
st foundD4(a6)
|
|
bra.s @Loop4Indexes
|
|
|
|
; measure by style runs and highlight where appropriate based on character offsets
|
|
; and display ordering of format runs!
|
|
@MeasureNow
|
|
move.w numberOfRuns(a6),d2
|
|
clr.w fmtOrderingIndex(a6)
|
|
|
|
; test if [d3,d4] in same style run
|
|
move.w d3FmtIndex(a6),d0
|
|
cmp.w d4FmtIndex(a6),d0
|
|
bne.s @MeasureLoop
|
|
st sameStyle(a6)
|
|
|
|
@MeasureLoop
|
|
Bsr GetNextDisplayStyle ; <22Dec88smb>
|
|
Bsr MeasureWidth
|
|
tst.b doneFlag(a6)
|
|
bne.s @hiliteMore
|
|
addq #1,fmtOrderingIndex(a6) ; incr the format ordering array counter
|
|
tst.b WordRedraw ; <4Oct89smb>
|
|
bge.s @GetNext ; <4Oct89smb>
|
|
SubQ #1,D2 ; dec the style counter
|
|
beq.s @hiliteMore
|
|
bra.s @MeasureLoop
|
|
|
|
@GetNext
|
|
Addq.l #stStartSize,a0 ; get next style
|
|
SubQ #1,D2 ; dec the style counter
|
|
bne.s @MeasureLoop ; must be more than 1 line
|
|
bra.s @hiliteMore
|
|
@oldStyle
|
|
; old-style record: one style for the whole record. My code is expecting a0 to contain a ptr to
|
|
; the startChar for the current style so must fake the setup.
|
|
clr.l firstStyleRun(a6) ; startChar and style index (both 0)
|
|
clr.w secondStyleRun(a6) ; startChar of second style run (EO array)
|
|
move.w teLength(a3),secondStyleRun(a6)
|
|
lea firstStyleRun(a6),a0
|
|
Bsr teHiliteText
|
|
|
|
@hiliteMore
|
|
; test if there's more to hilite: either more style runs or line ends
|
|
|
|
tst.b hiliteInbetween(a6)
|
|
beq.s @testEnds
|
|
bsr HiliteMiddle ; hilite any remaining runs inbetween offsets
|
|
sf hiliteInbetween(a6)
|
|
@testEnds
|
|
tst.b hiliteLEndFlag(a6)
|
|
beq.s @testRightEnd
|
|
; hilite left end of display line
|
|
move.w selRectL(a6),teSelRect+right(a3)
|
|
move.w #UnboundLeft,teSelRect+left(a3)
|
|
; top and bottom edges should be the same
|
|
move.l a0,-(sp) ; <24Jan89smb> save for unstyled text
|
|
Move.L teHiHook(A3),D0 ; do the inversion via hook if exists
|
|
Bsr InvertHook ; hilite it
|
|
sf hiliteLEndFlag(a6)
|
|
move.l (sp)+,a0 ; <24Jan89smb> need for hiliting on right end of unstyled text
|
|
@testRightEnd
|
|
tst.b hiliteREndFlag(a6)
|
|
beq.s @finis
|
|
; hilite right end of display line
|
|
tst.w teSize(a3) ; <5Dec88smb>
|
|
bmi.s @UseAnchor
|
|
bsr MeasureWholeRun ; need length of line for unstyled <5Dec88smb>
|
|
move.w d0,teSelRect+left(a3) ; <5Dec88smb>
|
|
bra.s @addSelRect ; <5Dec88smb>
|
|
@UseAnchor
|
|
move.w anchorR(a6),teSelRect+left(a3) ; <25Oct88smb>
|
|
@addSelRect
|
|
move.w selRectL(a6),d0
|
|
add.w d0,teSelRect+left(a3) ; <25Oct88smb>
|
|
move.w #UnboundRight,teSelRect+right(a3)
|
|
; top and bottom edges should be the same
|
|
Move.L teHiHook(A3),D0 ; do the inversion via hook if exists
|
|
Bsr InvertHook ; hilite it
|
|
sf hiliteREndFlag(a6)
|
|
|
|
@finis
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
movem.l (sp)+,SameLineRegs
|
|
unlk a6
|
|
Rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; MeasureWidth
|
|
;
|
|
; <12Oct88smb>
|
|
;
|
|
; Get the width of each style run and hilite when appropriate.
|
|
; We never come in here if we have an old single style teRec!
|
|
;
|
|
; Input:
|
|
; d3 = 1st character position to redraw
|
|
; d4 = 2nd character position to redraw
|
|
;
|
|
; a0 = ptr to startChar for style of 1st character position
|
|
; a2 = lineStart of current line containing d3
|
|
;
|
|
; Output:
|
|
; d5 = pixelWidth of the measured style runs
|
|
;
|
|
;----------------------------------------------------------------------
|
|
MeasureWidth
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vMeasureWidth(a1),a1
|
|
jmp (a1)
|
|
|
|
xMeasureWidth
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
; is this d3's style run?
|
|
move.w styleRunIndex(a6),d0
|
|
cmp.w d3FmtIndex(a6),d0
|
|
beq.s @MeasureD3Run
|
|
tst.b sameStyle(a6)
|
|
bne @justMeasure ; bra if [d3,d4] in same style
|
|
|
|
; is this d4's style run?
|
|
cmp.w d4FmtIndex(a6),d0
|
|
beq.s @MeasureD4Run
|
|
blt.s @inBetween ; bra to check if inbetween d3 & d4 runs
|
|
bra @justMeasure ; not to be hilited: just measure
|
|
|
|
@MeasureD3Run
|
|
; measure [d3,end of style]
|
|
move.w d3,saveD3(a6)
|
|
move.w d4,saveD4(a6)
|
|
tst.b sameStyle(a6)
|
|
bne.s @TestDirection ; when in RL text may need to measure the rest of the line <25Oct88smb>
|
|
bsr FixFormatEnd ; <6Mar89smb>
|
|
move.w d0,d4 ; <6Mar89smb>
|
|
bra.s @dontQuit
|
|
|
|
@MeasureD4Run
|
|
; measure [begin of style,d4]
|
|
move.w d3,saveD3(a6)
|
|
move.w d4,saveD4(a6)
|
|
move.w startChar(a0),d3
|
|
@TestDirection
|
|
tst.b teSysJust ; RL line direction (Roman, Kanji or Arabic)? <29Aug89smb>
|
|
bne.s @dontQuit ; yep, not done at this style run <29Aug89smb>
|
|
tst.b WordRedraw ; <4Oct89smb
|
|
blt.s @dontQuit ; <4Oct89smb
|
|
st doneFlag(a6) ; once hilited d4
|
|
@dontQuit
|
|
tst.b hiliteInbetween(a6)
|
|
beq.s @HiliteOffsetRun ; nothing inbetween: just hilite the offset's run
|
|
bsr HiliteMiddle ; hilite runs prior to offset run, then the offset run
|
|
bra.s @HiliteOffsetRun
|
|
|
|
@inBetween
|
|
; test if style run in between d3 and d4's style runs!
|
|
cmp.w d3FmtIndex(a6),d0
|
|
bhi.s @hiliteRun ; bra to be hilited <26June89smb> made unsigned
|
|
|
|
; not inbetween therefore, only measure. don't hilite
|
|
bsr.s MeasureWholeRun
|
|
add.w d0,totalWidth(a6)
|
|
tst.b hiliteInbetween(a6)
|
|
beq.s @exit
|
|
bsr HiliteMiddle ; hilite runs prior to non-hilited run
|
|
move.w totalWidth(a6),d0
|
|
add.w d0,anchorL(a6) ; new left anchor
|
|
bra.s @exit
|
|
|
|
@hiliteRun
|
|
; This run is between d3 and d4 and needs to be hilited at some later time.
|
|
; Test if this style run contains the lineStart or lineEnd and if so, then must extend the
|
|
; highlighting to the screen's edge!
|
|
move.w startChar(a0),d0 ; get the beginning of the style run
|
|
move.w stStartSize(a0),d1 ; get the end of the style run
|
|
Bsr HiliteLineEnds ; test and set a flag
|
|
|
|
tst.b hiliteInbetween(a6)
|
|
bne.s @addToAnchor
|
|
; new run of runs inbetween d3 and d4 to be hilited
|
|
st hiliteInbetween(a6)
|
|
move.w totalWidth(a6),anchorL(a6) ; new left anchor
|
|
move.w totalWidth(a6),anchorR(a6) ; new right anchor
|
|
@addToAnchor
|
|
bsr.s MeasureWholeRun
|
|
add.w d0,totalWidth(a6) ; accumulates the overall width
|
|
add.w d0,anchorR(a6) ; save for hiliting middle rectangle
|
|
bra.s @exit
|
|
|
|
@HiliteOffsetRun
|
|
; hilite the appropriate part of the offset's style run
|
|
bsr teHiliteText
|
|
|
|
move.w saveD3(a6),d3
|
|
move.w saveD4(a6),d4
|
|
|
|
; measure the length of the style run and add to overall line width
|
|
@justMeasure
|
|
bsr.s MeasureWholeRun ; add width of style run to total width of line
|
|
add.w d0,totalWidth(a6)
|
|
move.w totalWidth(a6),anchorR(a6) ; possible new Left anchor for next hilite region
|
|
|
|
@exit
|
|
Move.w totalWidth(a6),d5
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; MeasureWholeRun
|
|
;
|
|
; Input:
|
|
; a0: current style run
|
|
; a2: lineStart
|
|
; a3: pointer to TERecord
|
|
;
|
|
; Uses: a0/a1/d0/d1
|
|
; a4: textPtr for textWidth
|
|
;
|
|
; Output:
|
|
; d0: width of style run
|
|
;----------------------------------------------------------------------
|
|
MeasureWholeRun
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vMeasureWholeRun(a1),a1
|
|
jmp (a1)
|
|
|
|
xMeasureWholeRun
|
|
|
|
WholeRunRegs reg d2/a0/a4
|
|
|
|
movem.l d2/a0,-(sp) ; <27>
|
|
move.l a4,-(sp) ; separate out so can restore teHandle to a4 before hook call <27>
|
|
Movea.l a0,a1 ; save beginning posn of current style
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
Add.w (a1),a0 ; add beginning of the style run to get to desired line
|
|
move.l a0,a4
|
|
movea.l a1,a0 ; restore current style run
|
|
|
|
; If style run starts on previous line, then pin text pointer to start of current line
|
|
moveq #0,d1 ; used to adjust length
|
|
Move.w (a2),d0 ; beginning of line
|
|
cmp.w startChar(a0),d0
|
|
;;<21June89smb> bcs.s @getLength ; bra if lineStart is prior to the styleRun start
|
|
bls.s @getLength ; bra if lineStart is prior or equal to the styleRun start <21June89smb>
|
|
|
|
; Adjust text pointer and length for lineStart within styleRun
|
|
sub.w startChar(a0),d0 ; difference from start of styleRun to lineStart
|
|
add.w d0,a4 ; pin pointer to beginning of line
|
|
move.w d0,d1 ; save for length adjustment below
|
|
|
|
; If style run ends on next line, then use the current line's end for determining length!
|
|
@getLength
|
|
bsr FixFormatEnd ; <6Mar89smb> returns end of style run in d0
|
|
cmp.w 2(a2),d0 ; inside the line's end?
|
|
bls.s @UseStyleEnd ; <26June89smb> made unsigned
|
|
move.w 2(a2),d0 ; use the line's end
|
|
@UseStyleEnd
|
|
sub.w startChar(a0),d0
|
|
sub.w d1,d0 ; adjust for LineStart
|
|
tst.w teSize(a3) ; <1Dec88smb>
|
|
bpl.s @DontSet
|
|
|
|
movem.l d0/d1,-(sp) ; SetStyle mucks with this guy - not good!
|
|
bsr SetStyle ; set grafport style from current style in a0
|
|
movem.l (sp)+,d0/d1
|
|
|
|
@DontSet
|
|
;get PixelWidth of this style on this line
|
|
IF hasTextWidthHook THEN ; <18>
|
|
move.l a4,a0 ; wants text ptr here <18>
|
|
moveq #0,d1 ; wants offset here <18>
|
|
move.l (sp)+,a4 ; restore teHandle to a4 <27>
|
|
bsr TETextWidthHook ; hook out TextWidth <18>
|
|
ELSE ; <18>
|
|
subq.l #2,sp ; room for result
|
|
move.l a4,-(sp) ; ptr on stack
|
|
move.w #0,-(sp) ; offset to first char
|
|
move.w d0,-(sp) ; length of block
|
|
_TextWidth ; how wide is it?
|
|
moveq #0,d0
|
|
move.w (sp)+,d0 ; width
|
|
ENDIF ; <18>
|
|
movem.l (sp)+,d2/a0 ; already restored a4 before TETextWidthHook call <27>
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; HiliteMiddle
|
|
;
|
|
; Hilite measured runs between d3 and d4
|
|
;
|
|
; Input:
|
|
; a3: pointer to teRec
|
|
;
|
|
; Uses: d0 (preserved)
|
|
;
|
|
;----------------------------------------------------------------------
|
|
HiliteMiddle
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
movem.l d0/d2/a0,-(sp)
|
|
; do middle rectangle
|
|
move.w selRectL(a6), teSelRect+left(a3) ; left edge
|
|
move.w anchorL(a6),d0
|
|
add.w d0,teSelRect+left(a3)
|
|
move.w selRectR(a6), teSelRect+right(a3) ; right edge
|
|
move.w anchorR(a6),d0
|
|
add.w d0,teSelRect+right(a3)
|
|
; top and bottom edges should be the same
|
|
move.l teHiHook(a3),d0 ; do the inversion via hook if exists
|
|
bsr InvertHook ; hilite it
|
|
sf hiliteInbetween(a6)
|
|
|
|
movem.l (sp)+,d0/d2/a0
|
|
Rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; HiliteLineEnds
|
|
;
|
|
;
|
|
; This routine tests if the regions to be highlighted on a line
|
|
; should include the visible screen at both ends of the line.
|
|
;
|
|
; The visible left end of the displayed line should be hilited if:
|
|
; 2(a2) is in a hilited region and TESysJust = RL
|
|
; (a2) is in a hilited region and TESysJust = LR
|
|
; The visible right end of the displayed line should be hilited if:
|
|
; 2(a2) is in a hilited region and TESysJust = LR
|
|
; (a2) is in a hilited region and TESysJust = RL
|
|
;
|
|
; Input
|
|
; a2 = ptr to lineStart of current line
|
|
; d0 = beginning of region to be highlighted
|
|
; d1 = end of region to be highlighted
|
|
;
|
|
;----------------------------------------------------------------------
|
|
HiliteLineEnds
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vHiliteLineEnds(a1),a1
|
|
jmp (a1)
|
|
|
|
xHiliteLineEnds
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
|
|
; test if ends of line should be highlighted
|
|
; test line start
|
|
cmp.w (a2),d0
|
|
bhi.s @testLineEnd ; bra if outside region to be highlighted <26June89smb> made unsigned
|
|
cmp.w (a2),d1
|
|
bcs.s @testLineEnd ; bra if outside region to be highlighted
|
|
tst.b TESysJust ; beginning of line: hilite to display's edge <26June89smb> made unsigned
|
|
bne.s @lineStartIn
|
|
st hiliteLEndFlag(a6) ; left rect should be highlighted for LR flow
|
|
bra.s @testLineEnd
|
|
@lineStartIn
|
|
st hiliteREndFlag(a6) ; right rect should be highlighted for RL flow
|
|
|
|
@testLineEnd
|
|
; test line end
|
|
cmp.w 2(a2),d0
|
|
bhi.s @done ; <26June89smb> made unsigned
|
|
cmp.w 2(a2),d1
|
|
bcs.s @done ; bra if outside region to be highlighted <26June89smb> made unsigned
|
|
tst.b TESysJust
|
|
bne.s @lineEndIn
|
|
st hiliteREndFlag(a6) ; left rect should be highlighted for LR flow
|
|
bra.s @done
|
|
@lineEndIn
|
|
st hiliteLEndFlag(a6) ; right rect should be highlighted for RL flow
|
|
|
|
@done
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; teHiliteText
|
|
;
|
|
; <27Sept88smb>
|
|
;
|
|
; Setup for and call to HiliteText (which works on a single format
|
|
; run). Returns offsets within a format run of character positions
|
|
; for highlighting.
|
|
;
|
|
; Identify runs of characters for highlighting between d3 & d4.
|
|
;
|
|
; Entry:
|
|
; d3 = 1st char posn to measure from
|
|
; d4 = 2nd char posn to measure to
|
|
; a0 = ptr to current style
|
|
; a2 = lineStart array
|
|
; Use:
|
|
; d0,d1 = scratch
|
|
; a4 = ptr to offsetPairs address, to be returned from HiliteText
|
|
; Exit:
|
|
; registers preserved from entry but, the offsetPairs values (ptr in a4)
|
|
; have been filled in.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
teHiliteText
|
|
|
|
HiliteTxtRegs reg d2-d4/a0/a1
|
|
|
|
with SharedFrame,TEFormatOrder
|
|
tst.w teSize(A3) ; check style flag
|
|
bpl.S @DontSet ; don't set style: old-style edit record
|
|
bsr SetStyle ; set grafport style from current style in a0
|
|
@DontSet
|
|
; call HiliteText (which works on a single fmt run) on [d3,d4]
|
|
move.l a4,-(sp) ; preserve <22Dec88smb>
|
|
Lea offPairs(a6),a4
|
|
Movem.L HiliteTxtRegs,-(SP)
|
|
|
|
; the textPtr will be the beginning of the style run, and the offsets will be the distance from
|
|
; d3 and d4 to the start of the style run.
|
|
Movea.l a0,a1 ; temp
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
Add.w (a1),a0 ; add beginning of the style run to get to desired line
|
|
|
|
; test if style run starts on previous line, and if so adjust textptr <5Dec88smb>
|
|
moveq #0,d1
|
|
move.w (a2),d0 ; linestart
|
|
cmp.w startChar(a1),d0
|
|
bls.s @UseStyleStart ; <26June89smb> made unsigned
|
|
|
|
; pin to beginning of line <5Dec88smb>
|
|
sub.w startChar(a1),d0 ; |beginning of line - beginning of style run|
|
|
add.w d0,a0 ; fix text ptr
|
|
move.w d0,d1 ; save difference for length and offset adjustments
|
|
@UseStyleStart
|
|
move.l a0,-(sp) ; push text ptr parameter for _HiliteText
|
|
|
|
; test if style run ends on next line, and if so pin to end of this line & adjust length <5Dec88smb>
|
|
move.l a0,-(sp) ; <6Mar89smb>
|
|
move.l a1,a0 ; <6Mar89smb>
|
|
bsr FixFormatEnd ; <6Mar89smb> returns in d0
|
|
move.l (sp)+,a0 ; <6Mar89smb>
|
|
cmp.w 2(a2),d0
|
|
bls.s @UseStyleEnd ; <26June89smb> made unsigned
|
|
move.w 2(a2),d0 ; pin to line end
|
|
@UseStyleEnd
|
|
sub.w startChar(a1),d0 ; text length is overall style run length
|
|
sub.w d1,d0 ; adjust for lineStart
|
|
move.w d0,-(sp)
|
|
|
|
sub.w startChar(a1),d3 ; 1st offset within style run
|
|
sub.w d1,d3 ; adjust for lineStart
|
|
move.w d3,-(sp)
|
|
|
|
sub.w startChar(a1),d4 ; 2nd offset within style run
|
|
sub.w d1,d4 ; adjust for lineStart
|
|
move.w d4,-(sp)
|
|
|
|
move.l a4,-(sp) ; var offsets record
|
|
_HiliteText
|
|
|
|
Movem.L (sp)+,HiliteTxtRegs
|
|
|
|
; HiliteText returns 3 pairs of possibly disjoint char offsets within a style run for highlighting.
|
|
|
|
moveq #2,d7 ; set up dbra:counter for OffsetTable pairs
|
|
@tblLoop
|
|
move.w (a4)+,d0 ; get offset1 of pair
|
|
move.w (a4)+,d1 ; get offset2 of pair
|
|
cmp.w d0,d1 ; equal?
|
|
beq.s @nxtPair ; yes,skip: pair is empty
|
|
|
|
; process a pair from HiLiteText
|
|
Move.l a4,-(sp) ; preserve pairs counter and offset pairs
|
|
; want to restore a4 to contain the teHandle <27>
|
|
move.l 4(sp),a4 ; teHandle on the stack <27>
|
|
Bsr.s xInvrtRectangle ; skip the vector to avoid wiping out a4! <27>
|
|
Move.l (sp)+,a4
|
|
|
|
@nxtPair
|
|
dbra d7,@tblLoop ; loop thru record
|
|
move.l (sp)+,a4 ; restore original value <22Dec88smb>
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; InvrtRectangle
|
|
; <21June88smb>
|
|
;
|
|
; Calls Char2Pixel to get the pixel widths for the left and right
|
|
; side of a rectangle needing highlighting, finishes setting
|
|
; up the rectangle and inverts it. Makes Char2Pixel calls for each
|
|
; element of pair.
|
|
;
|
|
; Input
|
|
; a0 = ptr to beginning of current style run
|
|
; a2 = lineStart of current line
|
|
;
|
|
; d0 = 1st offset position within current style run
|
|
; d1 = 2nd offset position within current style run
|
|
; d5 = pixel width from MeasureAndHilite routine
|
|
;
|
|
; Register Usage:
|
|
; d5 = pixel width of 1st character in pair
|
|
; d6 = pixel width of 2nd character in pair
|
|
;
|
|
; Output
|
|
; a0,d0,d1,d2 preserved
|
|
; d5 = incremented by last pixel width: total width of line so far
|
|
;
|
|
;----------------------------------------------------------------------
|
|
InvrtRectangle
|
|
move.l ExpandMem,a4 ; <28June89smb> use it since already saved!
|
|
move.l ExpandMemRec.vInvrtRectangle(a4),a4
|
|
jmp (a4)
|
|
|
|
xInvrtRectangle
|
|
|
|
InvrtRectRegs reg d0/d1/a0/a1
|
|
with SharedFrame,TEFormatOrder
|
|
Move.w d2,-(sp)
|
|
;; moved below since saved in PixelWidths <5Dec89smb> Movem.l InvrtRectRegs,-(sp)
|
|
Move.w d5,-(sp) ; save pixel width from MeasureAndHilite routine
|
|
|
|
move.w #smHilite,d2 ; 1st offset's direction param
|
|
swap d2
|
|
move.w #smHilite,d2 ; 2nd offset's direction param
|
|
Bsr.s PixelWidths ; Calls Char2Pixel for each element of hilite pair
|
|
; returns pixelwidths of both elements in d5 & d6
|
|
|
|
; Check pixel widths for stroke direction.
|
|
|
|
cmp.w d5,d6 ; which is true left/right edge of rectangle
|
|
bcs.s @rightLeft ; bra if right-left text
|
|
|
|
add.w selRectR(a6),d5 ; need dest rect right edge added on
|
|
add.w (sp),d5 ; add pixel width of previous runs on line
|
|
add.w selRectR(a6),d6 ; need dest rect right edge added on
|
|
add.w (sp),d6 ; add pixel width of previous runs on line
|
|
bra.s @edgesOK
|
|
|
|
@rightLeft
|
|
; right to left
|
|
add.w selRectL(a6),d5 ; need dest rect left edge added on
|
|
add.w (sp),d5 ; add pixel width of previous runs on line
|
|
add.w selRectL(a6),d6 ; need dest rect left edge added on
|
|
add.w (sp),d6 ; add pixel width of previous runs on line
|
|
exg d5,d6 ; swap for R-L text.
|
|
|
|
@edgesOK ; call InvertRect on pair (set up selRect)
|
|
Movem.l InvrtRectRegs,-(sp) ; <5Dec89smb>
|
|
move.w d5,teSelRect+left(A3) ; left edge of rectangle
|
|
move.w d6,teSelRect+right(A3) ; right
|
|
|
|
Move.L teHiHook(A3),D0 ; do the inversion via hook if exists
|
|
Bsr InvertHook ; hilite it
|
|
|
|
Movem.l (sp)+,InvrtRectRegs
|
|
Move.w (sp)+,d5 ; restore pixel width from MeasureAndHilite routine
|
|
|
|
; Test whether should also hilite visible (screen) line start and end. Must first determine
|
|
; whether style run should be pinned to the start of the line.
|
|
move.w (a2),d2 ; <22Dec88smb>
|
|
cmp.w startChar(a0),d2 ; <22Dec88smb>
|
|
bls.s @UseStyleStart ; <22Dec88smb> <26June89smb> made unsigned
|
|
; pin to lineStart to get buffer position of offsets
|
|
add.w d2,d0 ; <22Dec88smb>
|
|
add.w d2,d1 ; <22Dec88smb>
|
|
bra.s @TestEnds
|
|
@UseStyleStart
|
|
add.w startChar(a0),d0 ; buffer position of 1st offset in line
|
|
add.w startChar(a0),d1 ; buffer position of 2nd offset in line
|
|
@TestEnds
|
|
cmp.w d0,d1 ; <5Dec89smb>
|
|
bcc.s @OffsetsOK ; <5Dec89smb>
|
|
exg d0,d1 ; swap for R-L text <5Dec89smb>
|
|
@OffsetsOK
|
|
IF hasInlineInput THEN ; <16>
|
|
; if inline input is on then don't hilite to the end of the selRect! <16>
|
|
movem.l a0/d2,-(sp) ; must preserve <16>
|
|
move.l teDispatchH(a3),a0 ; <16>
|
|
move.l (a0),a0 ; <16>
|
|
move.l newTEFlags(a0),d2 ; move into reg for modulo 32 bit ops <16>
|
|
btst #teFInlineInput,d2 ; is this Inline Input feature desired? <16>
|
|
movem.l (sp)+,a0/d2 ; restore now <16>
|
|
bne.s @NoLineEnds ; yes, so don't hilite line ends! <16>
|
|
ENDIF ; <16>
|
|
Bsr HiliteLineEnds
|
|
@NoLineEnds ; <16>
|
|
Move.w (sp)+,d2
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PixelWidths
|
|
;
|
|
; Setup for and call to Char2Pixel
|
|
;
|
|
; Input
|
|
; a0 = ptr to beginning of current style run
|
|
; a2 = LineStart of current line
|
|
;
|
|
; d0 = offset of 1st element of hilite pair in style run
|
|
; d1 = offset of 2nd element of hilite pair in style run
|
|
; d2.l = direction params for C2P for both offsets (second offset/first offset: High/Low)
|
|
;
|
|
; Output
|
|
; d5 = pixel width from start of run to 1st element.
|
|
; d6 = pixel width from start of run to 2nd element.
|
|
;
|
|
; -------------------------------
|
|
; Need to set up...
|
|
; a0 = start of text to be measured
|
|
; a4 = direction values and teHandle! <27>
|
|
; d0 = overall style run length
|
|
; d1 = length from start of measured text to end
|
|
; d2 = slop & highlight
|
|
; -------------------------------
|
|
;----------------------------------------------------------------------
|
|
PixelWidths
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vPixelWidths(a1),a1
|
|
jmp (a1)
|
|
|
|
xPixelWidths
|
|
|
|
; remove a4 from these lists of registers <27>
|
|
PixelWidthRegs reg d0-d4/a0-a2 ; <27>
|
|
C2Pparams reg d0/a0/a1 ; length, direction, textPtr, styleRunPtr <27>
|
|
|
|
Movem.l PixelWidthRegs,-(sp)
|
|
move.l a4,-(sp) ; save the teHandle <27>
|
|
move.l ExpandMem,a4 ; <1Feb89smb>
|
|
move.l d2,ExpandMemRec.emDirection(a4) ; <27Oct88smb> direction for both offsets passed in
|
|
|
|
Movea.l a0,a1 ; save beginning posn of current style
|
|
Move.L teTextH(a3),a0 ; get text handle
|
|
Move.L (a0),A0 ; dereference
|
|
Add.w (a1),a0 ; add beginning of the style run to get to desired line
|
|
|
|
; 1st offset's width
|
|
move.w d1,-(sp) ; save 2nd offset
|
|
; test if style run starts on previous line, and if so adjust textptr & offset posn in run
|
|
move.w d0,d1 ; Char2Pixel wants the start offset here
|
|
|
|
moveq #0,d4
|
|
move.w (a2),d0 ; linestart
|
|
cmp.w startChar(a1),d0
|
|
bls.s @getLength ; bra if so => offset is ok <26June89smb> made unsigned
|
|
|
|
; pin to beginning of this line
|
|
sub.w startChar(a1),d0 ; |begin of line - begin of the style run|
|
|
add.w d0,a0 ; fix text ptr
|
|
move.w d0,d4 ; save difference for length adjustment
|
|
@getLength
|
|
; test if style run ends on next line, and if so pin to end of this line & adjust length
|
|
move.l a0,-(sp) ; <6Mar89smb>
|
|
move.l a1,a0 ; <6Mar89smb>
|
|
bsr FixFormatEnd ; <6Mar89smb> returns in d0
|
|
move.l (sp)+,a0 ; <6Mar89smb>
|
|
move.w teLength(a3),d2 ; <11>
|
|
cmp.w (a2),d2 ; at the end of the text? <11>
|
|
beq.s @UseStyleEnd ; yes -> use style end <11>
|
|
cmp.w 2(a2),d0 ; style contained in the line?
|
|
bls.s @UseStyleEnd ; yes -> use style end.
|
|
move.w 2(a2),d0 ; pin to end of line.
|
|
@UseStyleEnd
|
|
sub.w startChar(a1),d0 ; Char2Pixel wants the length here
|
|
sub.w d4,d0 ; adjust for lineStart
|
|
|
|
clr.l d2 ; <27Oct88smb>
|
|
move.l ExpandMem,a4 ; <1Feb89smb>
|
|
lea ExpandMemRec.emDirection(a4),a4 ; changed to lea <12July89smb>
|
|
move.w (a4)+,d2 ; <27Oct88smb>
|
|
swap d2 ; 1st offset's direction in high word; slop in low
|
|
|
|
move.l a4,-(sp) ; save direction values <27>
|
|
move.l 6(sp),a4 ; restore teHandle to a4 <27>
|
|
movem.l C2Pparams,-(sp) ; save to be used again
|
|
bsr TEWidthHook
|
|
move.w d1,d5 ; 1st element's pixel width
|
|
|
|
; 2nd offset's width
|
|
; restore params: length, direction, textPtr, styleRunPtr, direction locale
|
|
movem.l (sp)+,C2Pparams
|
|
move.l (sp)+,a4 ; restore direction values <27>
|
|
move.w (sp)+,d1 ; restore offset2
|
|
|
|
clr.l d2 ; <7Nov88smb>
|
|
move.w (a4),d2 ; <27Oct88smb>
|
|
swap d2 ; 2nd offset's direction in high word; slop in low
|
|
|
|
move.l (sp)+,a4 ; restore teHandle <27>
|
|
bsr TEWidthHook
|
|
move.w d1,d6 ; 2nd element's pixel width
|
|
|
|
movem.l (sp)+,PixelWidthRegs
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ChkBounds
|
|
;
|
|
; ** <C139/22Sep86/MBK> Added for International **
|
|
;
|
|
; The left and right sides of the selection rectangle are
|
|
; extended if the line start = the selection start and the
|
|
; line end = the selection end, respectively.
|
|
;
|
|
; Entry:
|
|
; d3 start offset
|
|
; d4 end offset
|
|
; a2 ptr to the current line
|
|
; Output
|
|
; teSelRect
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
ChkBounds
|
|
with TextFrame,TEFormatOrder ; <16Nov88smb> for GetStyleInOrder call
|
|
Move.W (A2),D0 ; start of line
|
|
Move.W 2(A2),D1 ; end of line
|
|
useBounds: equ 0
|
|
IF useBounds THEN
|
|
; <7Dec89smb>
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl.s @TestLineStart ; skip ahead if not
|
|
|
|
Tst.W TESysJust ; reverse order?
|
|
Beq.s @TestLineStart ; this is easy if not
|
|
|
|
; determine if display order is different from backin-store order <28Sept88smb>
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
bge.s @getStyleOld ; nope, only L->R directional text
|
|
|
|
; mixed directional text
|
|
bsr GetStylesInOrder ; <15Nov88smb>
|
|
beq.s @OneStyle ; <15Nov88smb>
|
|
|
|
Subq #1,D2 ; dec style count
|
|
move.w d2,fmtOrderingIndex(a6) ; set to next-to-last style
|
|
move.l a0,-(sp) ; save style ptr at start
|
|
|
|
; more than 1 style in mixed directional text, so get the first and next-to-last
|
|
; styles using the results from getFormatOrder
|
|
bsr GetNextDisplayStyle ; <4Jan89smb>
|
|
Move.W startChar(a0),D1 ; start of next-to-last style
|
|
move.l (sp)+,a0 ; restore style ptr at start
|
|
bra.s @CmpStarts
|
|
|
|
; only L->R text
|
|
@getStyleOld
|
|
Bsr GetCurStyle ; get its style <7Oct88smb>
|
|
Bsr GetNumStyles ; # of styles between offsets <7Oct88smb>
|
|
SubQ #1,D0 ; look for end of last style
|
|
Bne.S @ManyStyles
|
|
|
|
; Reset start and end of line if only 1 style
|
|
@OneStyle
|
|
Move.W (A2),D0 ; reset start of line
|
|
Move.W 2(A2),D1 ; end of line
|
|
Bra.S @TestLineStart
|
|
|
|
; more than 1 style in L->R directional text, so find actual start and end line offsets
|
|
@ManyStyles
|
|
SubQ #1,D0 ; dec style count
|
|
LsL.W #2,D0 ; * stStartSize ** <C381/6nov86/MBK> **
|
|
Neg D0 ; negative for subtraction
|
|
|
|
Move.W startChar(A0,D0),D1 ; start of next-to-last style
|
|
@CmpStarts
|
|
Move.W (A2),D0 ; get start of line again
|
|
Cmp.W startChar(A0),D0 ; compare to start of style
|
|
Bhs.S @TestLineStart ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
Move.W startChar(A0),D0 ; else set to style start
|
|
ENDIF
|
|
; if block begins at start of line, make left a large negative number
|
|
; <7Dec89smb> Tried to fix boundaries for tesysjust conditions
|
|
@TestLineStart
|
|
Cmp.W D0,D3
|
|
Bne.S @TestLineEnd
|
|
tst.w teSysJust
|
|
bne.s @FixRightBoundAtStart
|
|
Move.W #UnboundLeft,teSelRect+left(A3) ; assume LR text
|
|
bra.s @TestLineEnd
|
|
@FixRightBoundAtStart
|
|
Move.W #UnboundRight,teSelRect+right(A3)
|
|
|
|
; if block ends at end of line, make right a large positive number
|
|
@TestLineEnd
|
|
Cmp.W D1,D4
|
|
Bne.S @EdgesSet
|
|
tst.w teSysJust
|
|
bne.s @FixLeftBoundAtEnd
|
|
Move.W #UnboundRight,teSelRect+right(A3)
|
|
bra.s @EdgesSet
|
|
@FixLeftBoundAtEnd
|
|
Move.W #UnboundLeft,teSelRect+left(A3) ; assume LR text
|
|
|
|
@EdgesSet
|
|
;;<7Dec89smb> bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; NextLineRect
|
|
;
|
|
; ** <C105/14aug86/MBK> Added to speed things up **
|
|
;
|
|
; LineRect was being called from the line drawing loop in
|
|
; DoDraw, and adding up line heights from the 1st line to the
|
|
; current one. That was fine for fixed line heights, but too
|
|
; slow for variable ones. Now I call NextLineRect from the
|
|
; loop to simply set the top of this line from the bottom of
|
|
; the previous one, and get the height of this line only to
|
|
; Set the bottom. NextLineRect also calls DoJust to set
|
|
; the justification.
|
|
;
|
|
; Entry:
|
|
; D0: Current line #
|
|
; Exit:
|
|
; A2: Ptr to current line #
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
NextLineRect
|
|
Move.W teSelRect+bottom(A3),teSelRect+top(A3)
|
|
Bsr GetHite ; get height of this line
|
|
Add.W D1,teSelRect+bottom(A3) ; adjust bottom
|
|
|
|
; ** <C381/5nov86/MBK> ** Replaced call to LineToPtr with these 2 lines
|
|
; since noone else called it
|
|
Add.W D0,D0 ; double for word entries ** <C381/5nov86/MBK> **
|
|
Lea teLines(A3,D0),A2 ; pt to line starts array ** <C381/5nov86/MBK> **
|
|
|
|
Move.W teDestRect+left(A3),teSelRect+left(A3)
|
|
Bsr.S DoJust ; set the justification <C971/RWW102887>NO
|
|
|
|
Rts
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PtrToLine
|
|
;
|
|
; ** <C105/14aug86/MBK> **
|
|
;
|
|
; Get the line # from the A2 value.
|
|
;
|
|
; Entry:
|
|
; A2: Ptr to current line #
|
|
; Exit:
|
|
; D0: Current line #
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
PtrToLine
|
|
Lea teLines(A3),A0 ; pt to line starts array
|
|
Move.L A2,D0 ; current line ptr
|
|
Sub.L A0,D0 ; current line offset
|
|
AsR.L #1,D0 ; current line number
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; LineRect
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Given the line start array in A2, this fills in the rLine(A6)
|
|
; With the rectangle for that line except that right = left.
|
|
; It adjusts the rect for the current format.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
LineRect
|
|
Bsr.S PtrToLine ; line # from A2 returned in d0 <C971/RWW102887>NO
|
|
|
|
Move.W D0,D1 ; save current line #
|
|
MoveQ #0,D0 ; from 0 to this line ** MBK 6/18/86 **
|
|
Bsr.S GetLineHites ; total height from 0->d1 returned in d0<C971/RWW102887>NO
|
|
|
|
Lea teDestRect+8(A3),A0 ; point past destRect
|
|
Lea teSelRect+8(A3),A1 ; and past stack rect
|
|
Move.L -(A0),-(A1) ; copying teDestRect to teSelRect
|
|
Move.L -(A0),-(A1) ; copying teDestRect to teSelRect
|
|
Add D0,(A1) ; add total height to top to get
|
|
; top bound of line rect
|
|
|
|
Move top(A1),bottom(A1) ; temporarily the same
|
|
Move.W D1,D0 ; current line ** MBK 6/18/86 **
|
|
Bsr GetHite ; height of this line returned in d1 ** MBK 6/18/86 **
|
|
Add D1,bottom(A1) ; add line height to get bottom bound of line rect
|
|
|
|
; now offset to right according to the format
|
|
|
|
; ** <C105/12aug86/MBK> ** Added the DoJust label for just doing justification
|
|
DoJust
|
|
; ** <C229/28oct86/MBK> ** Changed to save justification on stack instead of in D2
|
|
Move.W teJust(A3),-(SP) ; get justification ** <C105/12aug86/MBK> **
|
|
Bne.S @NotLeftJust ; go process if not left** <C105/12aug86/MBK> **
|
|
|
|
Move.W TESysJust,(SP) ; check text direction ** <C105/12aug86/MBK> **
|
|
Beq.S @LRFLow ; do nothing if left->right text direction
|
|
|
|
@NotLeftJust
|
|
Cmp.W #teForceLeft,(SP)
|
|
Beq.S @LRFLow
|
|
|
|
Bsr LineWidth ; get width of (A2) line in D0
|
|
|
|
Move teDestRect+right(A3),D1
|
|
Sub teDestRect+left(A3),D1
|
|
Sub D0,D1
|
|
SubQ #1,D1 ; subtract one for caret
|
|
|
|
Tst.W (SP) ; see what format
|
|
Bmi.S @RLFlow ; bra if right->left text direction
|
|
|
|
AsR #1,D1 ; div by 2 for centering
|
|
@RLFlow
|
|
Add D1,teSelRect+left(A3) ; bump rect over
|
|
@LRFLow
|
|
AddQ #1,teSelRect+left(A3) ; indent for caret
|
|
Move teSelRect+left(A3),teSelRect+right(A3)
|
|
Move.W teSelRect+left(A3),saveJust(A6) ; left just ** <C105/18aug86/MBK> **
|
|
|
|
AddQ.L #2,SP ; restore it ** <C105/12aug86/MBK> **
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetLineHites
|
|
; ** Added 6/3/86 by MBK **
|
|
;
|
|
; Gets the line height of each line from start to end line and
|
|
; returns the total of all the line heights. If teLineHite
|
|
; has a non-zero value, a fixed line height is used
|
|
; for each line. Otherwise, GetLineHites gets the line height
|
|
; for each line from the MaxHites array.
|
|
;
|
|
; Entry:
|
|
; D0 starting line #
|
|
; D1 ending line # (Preserved)
|
|
;
|
|
; Exit:
|
|
; D0 total distance in pixels from top of start line to top of
|
|
; End line
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetLineHites
|
|
MoveM.L D1-D2,-(SP) ; save stuff
|
|
|
|
; If this TERec has no style, just use the old teLineHite
|
|
Sub.W D0,D1 ; get # of lines
|
|
Beq.S @0 ; if none, skip this
|
|
|
|
Move.W teLineHite(A3),D2 ; get default line hite
|
|
; If lineHite is positive, use it no matter what type of TERec.
|
|
Bpl.S @0
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bmi.S @1 ; if not, use TERec value
|
|
|
|
; somebody set the default, so use fixed line height for all lines
|
|
@0 MulU D1,D2 ; * fixed line height
|
|
Bra.S @3 ; that was easy! <C971/RWW102887>NO
|
|
|
|
; Get maximum height on this line from the array
|
|
@1 Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L lhTab(A0),A0 ; handle to max hites
|
|
Move.L (A0),A0 ; dereference
|
|
LsL.W #2,D0 ; multiply by 4
|
|
AddA.W D0,A0 ; starting line
|
|
MoveQ #0,D2 ; line height accumulator
|
|
|
|
@2 Move.W (A0),D0 ; get line height ** <C105/28aug86/MBK> **
|
|
And.W #$7FFF,D0 ; mask out high bit ** <C105/28aug86/MBK> **
|
|
Add.W D0,D2 ; accumulate heights
|
|
AddQ #4,A0 ; point to next
|
|
SubQ #1,D1 ; dec the counter
|
|
Bne.S @2 ; keep accumulating
|
|
|
|
@3 Move.L D2,D0 ; answer in D0
|
|
MoveM.L (SP)+,D1-D2 ; restore stuff
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetHite
|
|
;
|
|
; ** Added 6/16/86 by MBK **
|
|
;
|
|
; Gets the line height of the given line.
|
|
;
|
|
; Entry:
|
|
; D0 line number
|
|
; Exit:
|
|
; D1 height of this line
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetHite
|
|
; If this TERec has no style, just use the old teLineHite
|
|
Move.W teLineHite(A3),D1 ; get default line height
|
|
Bpl.S @0 ; use it if set ** <C381/5nov86/MBK> **
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; if not, use TERec value
|
|
|
|
; Get maximum height on this line from the array
|
|
Move.L teStylesH(A3),A0 ; handle to style info ** <C381/5nov86/MBK> **
|
|
Move.L (A0),A0 ; dereference ** <C381/5nov86/MBK> **
|
|
Move.L lhTab(A0),A0 ; handle to max hites ** <C381/5nov86/MBK> **
|
|
Move.L (A0),A0 ; dereference
|
|
Move.W D0,D1 ; preserve D0 ** <C381/5nov86/MBK> **
|
|
LsL.W #2,D1 ; for 2 word entries ** <C381/5nov86/MBK> **
|
|
Move.W 0(A0,D1),D1 ; get height ** <C381/5nov86/MBK> **
|
|
And.W #$7FFF,D1 ; mask out high bit ** <C105/28aug86/MBK> **
|
|
|
|
|
|
@0 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; LineWidth
|
|
;
|
|
; Measures the width of the line at (A2)..2(A2). Trims break chars
|
|
; from the right side. Called from LineRect.
|
|
;
|
|
; Entry
|
|
; A2 = ptr to lineStart array
|
|
; A3 = dereferenced handle to TE object
|
|
;
|
|
; Exit
|
|
; leaves the width in D0
|
|
;
|
|
;----------------------------------------------------------------------
|
|
LineWidth
|
|
move (a2),d6 ; get lineStart as anchor
|
|
move 2(a2),d7 ; get line end as the other anchor
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
st ExpandMemRec.emMeasureLine(a0) ; mark it for later measuring: measure whole line
|
|
|
|
MeasD6D7
|
|
Move.l TETrimMeasure,-(SP) ; push trimMeasure routine <EHB 01Oct85>
|
|
Rts ; and call it <EHB 01Oct85>
|
|
|
|
XTrimMeasure
|
|
;----------------------------------------------------------------------
|
|
;;<2Aug89smb> tst.b WordRedraw ; <18Jan89smb>
|
|
;;<2Aug89smb> bmi.s MeasureIt ; <18Jan89smb> don't use for RL text
|
|
; If a Roman system then use old TrimMeasure code rather than SMgr VisibleLength <2Aug89smb>
|
|
;;<31Oct89smb> tst.b teSysJust
|
|
;;<31Oct89smb> bne.s @VisLen ; use VisibleLength for RL line direction
|
|
|
|
;----------------------------------------------------------------------
|
|
; added <1Nov89smb>
|
|
; We need to strip off trailing spaces IF they are trailing in display order (on the L. in a
|
|
; R-L line and on the R. in a L-R line.)
|
|
; if the line direction = teJust (corrected for teSysJust), then go directly to MeasureIt.
|
|
; if teJust = teJustCenter OR teJust = teJustLeft, skip
|
|
|
|
cmp d6,d7 ; nothing to measure? <31Oct89smb>
|
|
bls zeroExit ; <31Oct89smb>
|
|
move.w teJust(a3),d0 ; <31Oct89smb>
|
|
bge MeasureIt ; <31Oct89smb>
|
|
; if teJust = teSysJust, skip
|
|
cmp.w teSysJust,d0 ; <31Oct89smb>
|
|
beq MeasureIt ; <31Oct89smb> implies teSysJust = RL
|
|
; ow, the line direction = LR and teJust = right
|
|
; OR (!!!) teJust = force left (the line direction = RL/LR) (!!!!!) new comment <10/10/90smb>
|
|
tst.b WordRedraw ; test if Arabic installed w/ line direction LR
|
|
beq @RomanTrim ; bra for Roman
|
|
|
|
;----------------------------------------------------------------------
|
|
; added <1Nov89smb>
|
|
; Adding call to GetStylesInOrder in order to call VisibleLength for a line's style runs.
|
|
; We need to traverse the style runs in display order but backwards! This is because it's
|
|
; possible to have style runs at the end of a line containing only blanks (silly but true!)
|
|
with TextFrame,TEFormatOrder
|
|
move.l d5,-(sp)
|
|
clr.w d5 ; flag that signifies we are done w/ VisibleLength
|
|
move.w d6,-(sp) ; save original lineStart
|
|
tst.w teSize(a3) ; do something different for unstyled! <7Nov89smb>
|
|
bmi.s @GetStyles ; bra if styled edit record
|
|
|
|
; old-style record: one style for the whole record. My code is expecting a0 to contain a ptr to
|
|
; the startChar for the current style so must fake the setup.
|
|
clr.l firstStyleRun(a6)
|
|
clr.l secondStyleRun(a6)
|
|
move.w teLength(a3),secondStyleRun(a6)
|
|
lea firstStyleRun(a6),a0
|
|
move.l a0,a2StyleRun(a6) ; save style run of lineStart as a ptr
|
|
;;<16Nov89smb> move.w #1,d2
|
|
;;<16Nov89smb> move.w d2,numberOfRuns(a6) ; save
|
|
; cleared since don't need to go thru initial @styleLoop code. <16Nov89smb>
|
|
clr.w d2 ;<16Nov89smb>
|
|
clr.w numberOfRuns(a6) ;<16Nov89smb>
|
|
|
|
lea.l fmtOrdering(a6),a1
|
|
move.l a1,fmtOrderingPtr(a6)
|
|
;;<16Nov89smb> move.w #1,fmtOrderingIndex(a6) ; decrement below @styleLoop
|
|
clr.w fmtOrderingIndex(a6) ;<16Nov89smb>
|
|
clr.w (a1)
|
|
;;<16Nov89smb> bra.s @styleLoop
|
|
bra.s @UnStyled ;<16Nov89smb>
|
|
|
|
@GetStyles
|
|
move.w d6,d0 ; start of selection
|
|
move.w d7,d1 ; end of selection
|
|
bsr teGetFormatOrder
|
|
|
|
move.w numberOfRuns(a6),d2
|
|
move.w d2,fmtOrderingIndex(a6) ; start w/ the last style run
|
|
;----------------------------------------------------------------------
|
|
@styleLoop
|
|
subq #1,fmtOrderingIndex(a6) ; decr the style run counter
|
|
bsr GetNextDisplayStyle
|
|
subq #1,d2 ; dec the style counter
|
|
|
|
;;<16Nov89smb> tst.w teSize(a3) ; record with style?
|
|
;;<16Nov89smb> bpl.s @UnStyled ; if not, go do it the old way
|
|
bsr SetStyle ; set current style
|
|
@UnStyled
|
|
; If we've already found the first (or visibly last) non-blank style run on the line, the flag
|
|
; will be set and we need to loop to determine if this is the greatest style run offset.
|
|
tst.b d5
|
|
bne.s @GetStyleEnd ; yep
|
|
; must be blanks on the line end
|
|
;----------------------------------------------------------------------
|
|
; call VisibleLength to correctly determine the text to measure
|
|
movem.l d2/a0/a2,-(sp)
|
|
; pin to style run boundaries
|
|
move.w startChar(a0),d6
|
|
bsr FixFormatEnd ; if last format run, must decrement end offset
|
|
|
|
move.l teTextH(a3),a0 ; get text handle
|
|
move.l (a0),a0 ; dereference
|
|
|
|
add.w d6,a0 ; set to LineStart
|
|
sub.w d6,d0
|
|
clr.l -(sp) ; longint return
|
|
move.l a0,-(sp) ; textPtr
|
|
swap d0 ; clear high word
|
|
clr.w d0
|
|
swap d0
|
|
move.l d0,-(sp) ; textLen
|
|
_VisibleLength
|
|
|
|
move.l (sp)+,d7 ; length of visible text
|
|
movem.l (sp)+,d2/a0/a2
|
|
beq.s @LoopExit ; if all blanks, keep looping
|
|
;----------------------------------------------------------------------
|
|
add.w d6,d7 ; non-blank => done; get real position
|
|
; set flag in high word saying done w/ VisibleLength
|
|
st d5
|
|
@GetStyleEnd
|
|
; Once we encounter a non-blank style run, we need to loop through all the previous style runs
|
|
; on the line, searching for the largest end offset that is larger then the VisibleLength offset.
|
|
; Get the maximum of the style run's end offset and the visibleLength offset.
|
|
; per Mark Davis. I'm a believer now! <6Dec89smb>
|
|
; d7 = visibleLength initially; is replaced by the end offset of a style run which is larger.
|
|
; a0 = ptr to current style run
|
|
bsr FixFormatEnd ; if last format run, must decrement end offset
|
|
cmp.w d0,d7
|
|
bge.s @LoopExit ; VisibleLength is the larger, keep looping
|
|
move.w d0,d7 ; prev style run is max.
|
|
;----------------------------------------------------------------------
|
|
; if all blanks, keep looping
|
|
@LoopExit
|
|
tst.w d2 ; more styles?<1Nov89smb>
|
|
bne.s @styleLoop ; yes, loop again
|
|
move.w (sp)+,d6 ; restore original lineStart
|
|
move.l (sp)+,d5
|
|
bra.s MeasureIt ; if all blanks on this line, will terminate in MeasureIt
|
|
;----------------------------------------------------------------------
|
|
; <2Aug89smb> end of VisibleLength changes
|
|
@RomanTrim
|
|
Cmp teLength(A3),D6 ; are we past last char?
|
|
Beq.s zeroExit ; escape quick <C971/RWW102887>NO
|
|
|
|
Cmp D6,D7 ; is line empty?
|
|
Bls.s zeroExit ; if so, skip trimming(fast exit)<C971/RWW102887>NO
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
@TrimLoop
|
|
SubQ #1,D7 ; look to left
|
|
Cmp D6,D7
|
|
Beq.S @LoopXit ; assume done if = to left
|
|
|
|
Cmp.B #$20,0(A0,D7) ; if last char <= space then...
|
|
Bls.S @TrimLoop ; it's a break
|
|
|
|
@LoopXit
|
|
AddQ #1,D7 ; use next char
|
|
|
|
; fall into MeasureIt ; get width in [D6 to D7)
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; MeasureIt
|
|
;
|
|
; ** Rewritten 6/20/86 by MBK **
|
|
;
|
|
; Entry
|
|
; A3 = dereferenced handle to TE object
|
|
; Does a TextWidth for teTextH(A3), [D6 to D7]
|
|
; Exit
|
|
; leaves the width in D0
|
|
;
|
|
;----------------------------------------------------------------------
|
|
MeasureIt
|
|
IF forLocalizability THEN ; <31l-YDS-8/27/91>
|
|
tst.b WordRedraw ; have L->R script ?
|
|
blt.s @1 ; yes, allow measure of zero char strings (skip zeroExit)
|
|
ENDIF
|
|
Cmp D6,D7 ; nothing to measure?
|
|
Bls.S zeroExit ; <C971/RWW102887>NO
|
|
|
|
@1 MoveM.L D2/D4/D6,-(SP) ; save stuff
|
|
And.L lo16,D6 ; longize it
|
|
|
|
; Skip all the new stuff if style is not set
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bmi.S @Styled ; if not, go do it the old way
|
|
; unstyled text
|
|
Move.W D7,D0 ; End offset
|
|
Bsr.S GetWidth ; Get string width <C971/RWW102887>NO
|
|
Move.W D1,D0 ; Return width in D0
|
|
Bra.S @done
|
|
|
|
@Styled
|
|
; Record does have style; get # of styles within selection
|
|
MoveQ #0,D4 ; Clear accumulator
|
|
Move.W D6,D0 ; start of selection
|
|
Bsr GetCurStyle ; get current style
|
|
Move.W D7,D1 ; end of selection
|
|
Bsr GetNumStyles ; # of styles in selection
|
|
Move.W D0,D2 ; save # of styles
|
|
|
|
@styleLoop
|
|
; Set the GrafPort to the current style
|
|
Bsr SetStyle ; set current style
|
|
bsr FixFormatEnd ; <19June89smb> if last format run, must decrement
|
|
AddQ #stStartSize,A0 ; pt to next style
|
|
|
|
; Get the width of this selection <27June88smb>
|
|
; At this point, d0 = start of next style run <20June89smb>
|
|
@2 Move.W D2,-(SP) ; save the count
|
|
Bsr.S GetWidth ; get string width <C971/RWW102887>NO
|
|
|
|
; Accumulate total width of the selection
|
|
Add.W D1,D4 ; accumulate width
|
|
Move.W (SP)+,D2 ; restore the count
|
|
Move.W startChar(A0),D6 ; start of next style
|
|
SubQ #1,D2 ; dec the style counter
|
|
Bne.S @styleLoop ; more styles
|
|
|
|
Move.W D4,D0 ; return width in D0
|
|
|
|
@done
|
|
MoveM.L (SP)+,D2/D4/D6 ; restore stuff
|
|
; clear up the world
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
sf ExpandMemRec.emMeasureLine(a1) ; restore old flag
|
|
Rts
|
|
zeroExit
|
|
MoveQ #0,D0 ; nothing to measure
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetWidth
|
|
;
|
|
; Input
|
|
; a0 next style run
|
|
; d0 start of the text in the next style run
|
|
; d6 start of the text
|
|
; d7 end of the text
|
|
; a2 pointer to current lineStart
|
|
;
|
|
; Need to set up... <27June88smb>
|
|
; a0 = start of text to be measured
|
|
; d0 = overall style run length
|
|
; d1 = length from start of measured text to end
|
|
; d2 = slop & highlight
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetWidth
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetWidth(a1),a1
|
|
jmp (a1)
|
|
|
|
xGetWidth
|
|
|
|
tst.w teSize(A3) ; record with style?
|
|
bpl.s @Unstyled ; if not, A0 is nothing
|
|
; styled text
|
|
Move.L teStylesH(a3),a1 ; get style handle
|
|
Move.L (a1),a1 ; dereference
|
|
Sub.L a1,a0 ; save as offset
|
|
@Unstyled
|
|
Move.L a0,-(SP) ; save A0
|
|
Move.L teTextH(a3),a0 ; get text handle
|
|
Move.L (a0),a0 ; dereference
|
|
|
|
; get start of text into a0, max(d7,d0)-d6 into d1 <27June88smb>
|
|
; possible bug with > 32K
|
|
add.w d6,a0 ; point at real start of text
|
|
move.w d7,d1 ; get the end
|
|
|
|
; adjust the start of the next style run to max at the end of the line <22Sept88smb>
|
|
cmp.w 2(a2),d0 ; length > end of line
|
|
bls.s @GotStyleEnd ; ok
|
|
move.w 2(a2),d0 ; fix it.
|
|
@GotStyleEnd
|
|
|
|
; pick the min of the style run end and the text end <26Sept88smb>
|
|
sub.w d6,d0 ; sub start of text from end
|
|
sub.w d6,d1 ; sub start of text from offset
|
|
blt.s @FullStyleRun ; d1 outside of range <26Sept88smb>
|
|
|
|
cmp.w d0,d1 ; d1 higher than range,
|
|
IF forLocalizability THEN ; <31l-YDS-8/27/91>
|
|
bgt.s @FullStyleRun ; allow measure when equal too (for R->L)
|
|
ELSE
|
|
bcc.s @FullStyleRun ; bail: want to bra on equal too. <19June89smb> <26June89smb> made unsigned
|
|
ENDIF
|
|
|
|
; if drawing, then try this out! use textWidth for draw and C2P for caret. <21Sept88smb>
|
|
move.l ExpandMem,a1 ; <1Feb89smb> full line flag
|
|
tst.b ExpandMemRec.emMeasureLine(a1) ; line width flag set?
|
|
beq.s @UseChar2Pixel ; no, do real stuff <22Sept88smb>
|
|
|
|
; we are measuring the whole line, BUT we only want to measure up to visible length <6Nov89smb>
|
|
cmp.w d0,d1 ; take the minimum <6Nov89smb>
|
|
bhs.s @FullStyleRun ; d0 < d1, so skip <6Nov89smb>
|
|
move.w d1,d0 ; stuff the visibleLength <6Nov89smb>
|
|
|
|
@FullStyleRun
|
|
; don't test interior of style run
|
|
|
|
IF hasTextWidthHook THEN ; <18>
|
|
moveq #0,d1 ; wants offset here <18>
|
|
bsr TETextWidthHook ; hook out TextWidth <18>
|
|
ELSE ; <18>
|
|
clr.w -(sp) ; allocate return <21Sept88smb>
|
|
move.l a0,-(sp) ; pointer
|
|
move.w #0,-(sp) ; no first byte
|
|
move.w d0,-(sp) ; bytecount
|
|
_TextWidth ; go for it
|
|
move.w (sp)+,d1 ; got the width
|
|
ENDIF ; <18>
|
|
bra @Continue ; rejoin <21Sept88smb>
|
|
|
|
@UseChar2Pixel
|
|
MoveQ #smHilite,D2 ; hilite flag <27June88smb>
|
|
swap d2 ; hilite in high word; slop in low <27June88smb> ** <C139/22Sep86/MBK> **
|
|
|
|
Bsr TEWidthHook ; THIS LINE REPLACES C2P call <C971/RWW110387>
|
|
@Continue
|
|
Move.L (SP)+,A0 ; restore A0
|
|
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl.S @done ; if not, A0 is nothing
|
|
|
|
Move.L teStylesH(A3),A1 ; get style handle
|
|
Move.L (A1),A1 ; dereference
|
|
Add.L A1,A0 ; restore as pointer
|
|
@done
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; OldChar2Pixel
|
|
;
|
|
; Using if the old WidthHook is preferred over the nWidthHook.
|
|
; Never come here for script systems; always use new Char2Pixel.
|
|
; See ScriptChar2Pixel and TEWidthHook dispatch code. <2/8/90smb>
|
|
; Also coming here as the default for TextWidthHook (see TETextWidthHook) <18>
|
|
;
|
|
; Entry: a0 ptr to text
|
|
; d0.w length of text to be measured
|
|
; d1.w offset into text
|
|
;
|
|
; Exit: d1.w width of measured text
|
|
;
|
|
;----------------------------------------------------------------------
|
|
OldChar2Pixel
|
|
subq #2,sp ; room for result
|
|
move.l a0,-(sp) ; pass pointer
|
|
move.w d1,-(sp) ; offset
|
|
move.w d0,-(sp) ; length
|
|
_TextWidth ; get width
|
|
move.w (sp)+,d1 ; resulting width
|
|
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Char2Pixel
|
|
;
|
|
; new <27June88smb>
|
|
;
|
|
; Entry: A0: ptr to start of text to be measured
|
|
; D0.W length of text to be measured (TE version)
|
|
; overall style run length (SMgr version)
|
|
; D1.W start offset into text(TE version);
|
|
; length from start of measured text to end (SMgr version)
|
|
; : our offset w/in the style run (pinned to the lineStart)
|
|
; D2 slop (low word)
|
|
; add caret or hilite flag (high word)
|
|
; A2 pointer to current lineStart
|
|
;
|
|
; Exit: D1.W width of measured text
|
|
;
|
|
;----------------------------------------------------------------------
|
|
Char2Pixel
|
|
Move.L JChar2Pixel,-(SP) ; call the Char2Pixel Routine <EHB 01Oct85>
|
|
Rts
|
|
vChar2Pixel
|
|
|
|
; if LR text and RL line direction and (offset = SOL or EOL) then <4May89smb>
|
|
; if direction = smLeftCaret (0) then
|
|
; if offset = lineStart then
|
|
; return textWidth
|
|
; otherwise return 0 ; offset = lineEnd
|
|
; else ; direction = smRightCaret (-1)
|
|
; if offset = lineStart then
|
|
; return 0
|
|
; otherwise return textWidth ; offset = lineEnd
|
|
|
|
move.l d3,-(sp)
|
|
tst.b TESysJust
|
|
beq @UseC2P
|
|
; RL line direction
|
|
movem.l d0/d2/a0/a1,-(sp)
|
|
move.w d1,-(sp)
|
|
tst.b teSize(a3)
|
|
bpl.s @noStyle
|
|
move.L teTextH(a3),a1 ; source = text
|
|
move.L (a1),a1 ; dereference
|
|
suba.l a1,a0 ; offset to beginning of text to be measured
|
|
move.w a0,d0 ; length to beginning of style run
|
|
add.w (sp),d0 ; add in length to offset
|
|
move.w d0,d3 ; save
|
|
bsr GetCurStyle
|
|
bsr GetDirection ; <6June89smb>
|
|
bra.s @TestDir ; <6June89smb>
|
|
@noStyle
|
|
;; d3 must be an absolute position for comparing to line ends. <20June89smb>
|
|
move.w d1,d3 ; offset w/in line <20June89smb>
|
|
add.w (a2),d3 ; absolute position <20June89smb>
|
|
; get the script direction from the font in the grafport for unstyled text <6June89smb> <11>
|
|
bsr GetDirection ; input is a3 - handle to teRec <11>
|
|
;; sub.w #6,sp ; allocate return, 1 long, 1 int <11>
|
|
;; _FontScript ; returns script; leave on stack as param <11>
|
|
;; move.w #smScriptRight,-(sp) ; pass verb <11>
|
|
;; _GetScript <11>
|
|
;; move.l (sp)+,d1 ; get byte = line direction <11>
|
|
@TestDir
|
|
cmp.b TESysJust,d1
|
|
beq.s @fixStack ; not equal=> LR script
|
|
|
|
; RL line and LR script
|
|
; compare current position to line ends
|
|
;; <20June89smb> Bsr GetLine ; returns ptr to line in a2
|
|
move.w (sp)+,d1
|
|
movem.l (sp)+,d0/d2/a0/a1
|
|
; test if called for R-to-L highlighting rather than hit-testing <31July89smb>
|
|
move.l d2,-(sp) ; save <1Aug89smb>
|
|
swap d2 ; direction in high word <31July89smb>
|
|
cmp.w #smHilite,d2 ; bug fix for Arabic highlighting <31July89smb>
|
|
movem.l (sp)+,d2 ; restore (w/o affecting CCs) <1Aug89smb>
|
|
beq.s @UseC2P ; using for hilighting! <31July89smb>
|
|
;;<2/1/90smb> bne.s @Use4HitTest ; <31July89smb>
|
|
;;<2/1/90smb> bra.s @UseC2P ; using for hilighting! <31July89smb>
|
|
;;<2/1/90smb>@Use4HitTest
|
|
; use for hit testing
|
|
cmp.w (a2),d3 ; same as lineStart?
|
|
beq.s @OnAnEnd
|
|
cmp.w 2(a2),d3 ; same as lineEnd?
|
|
bne.s @UseC2P
|
|
|
|
@OnAnEnd
|
|
; RL line and LR script and on a lineEnd so process w/o calling C2P.
|
|
swap d2 ; direction in high word
|
|
cmp.w #smLeftCaret,d2
|
|
bne.s @RightCaret
|
|
cmp.w (a2),d3 ; same as lineStart?
|
|
beq.s @TextWidth ; yep, start
|
|
bra.s @ZeroWidth ; nope, end
|
|
@RightCaret
|
|
cmp.w (a2),d3 ; same as lineStart?
|
|
beq.s @ZeroWidth ; yep, start
|
|
|
|
@TextWidth
|
|
IF hasTextWidthHook THEN ; <18>
|
|
moveq #0,d1 ; wants offset here <18>
|
|
bsr TETextWidthHook ; hook out TextWidth <18>
|
|
ELSE ; <18>
|
|
subq.l #2,sp ; room for result
|
|
move.l a0,-(sp) ; ptr on stack
|
|
;;<20June89smb> move.w d1,-(sp) ; offset to first char
|
|
move.w #0,-(sp) ; offset to first char <20June89smb>
|
|
move.w d0,-(sp) ; length of block
|
|
_TextWidth ; how wide is it?
|
|
clr.l d1
|
|
move.w (sp)+,d1 ; this wide
|
|
ENDIF ; <18>
|
|
bra.s @done
|
|
@ZeroWidth
|
|
moveq #0,d1
|
|
bra.s @done
|
|
;****************************
|
|
@fixStack
|
|
move.w (sp)+,d1
|
|
movem.l (sp)+,d0/d2/a0/a1
|
|
|
|
@UseC2P
|
|
; <4May89smb> end of additions
|
|
|
|
clr.w -(sp) ; room for Char2Pixel return
|
|
move.l a0,-(sp) ; pass text ptr to buffer
|
|
move.w d0,-(sp) ; pass text len
|
|
move.w d2,-(sp) ; here's the slop
|
|
move.w d1,-(sp) ; pass the offset
|
|
swap d2 ; direction in high word
|
|
;;<22June89smb> move.b d2,-(sp) ; actually,in lower byte
|
|
move.w d2,-(sp) ; move word since AIS tests word not byte <22June89smb>
|
|
|
|
_Char2Pixel
|
|
move.w (sp)+,d1 ; returns the pixel width
|
|
@done move.l (sp)+,d3 ; restore <4May89smb>
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; RangeRect
|
|
;
|
|
; Given the line rect in rLine(A6), this sets teSelRect to the
|
|
; line rect with the left side at the given loc in D3 and the
|
|
; right side at D4. If D3 is the first char on the line, it ...???
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
RangeRect
|
|
Cmp.W (A2),D3 ; same as line start?
|
|
Bhi.S @0 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
Cmp.W 2(A2),D4 ; same as line end?
|
|
Blo.S @0 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
; Must set D6 in this case (DoMeasure sets it but MeasureIt doesn't)
|
|
Move.W (A2),D6 ; set D6 to beg of line ** <C454/21nov86/MBK> **
|
|
|
|
Move.W D4,D7 ; just need 2nd measure
|
|
Bsr MeasureIt ; measure whole line
|
|
Add.W D0,teSelRect+right(A3) ; save right side
|
|
Bra.S @1 ; done with measuring
|
|
|
|
@0 Move D3,D7 ; get measure right
|
|
Bsr.S DoMeasure ; measure from [D6..D7) <C971/RWW102887>NO
|
|
Add D0,teSelRect+left(A3) ; set left
|
|
|
|
Move D4,D7 ; get 2nd measure right
|
|
Bsr.S DoMeasure ; measure from [D6..D7) <C971/RWW102887>NO
|
|
Add D0,teSelRect+right(A3) ; save right side
|
|
|
|
@1 Lea teSelRect(A3),A1
|
|
Move.W left(A1),saveLeft(A6) ; just need to save left
|
|
|
|
Move left(A1),TempRect ; compatibility shit
|
|
Move.L botRight(A1),-(SP) ; push pen loc for compatibility
|
|
|
|
; In the pre-Mac+ version Capps used pnLoc throughout DoText. He added the
|
|
; MoveTo here to maintain compatibility with that, but unfortunately in the
|
|
; pre-Mac+ version the pnloc is less by line height minus ascent.
|
|
; This fixes bug LM-RM-107. Don't worry about new style records since this
|
|
; is only for maintaining compatibility with old apps.
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; are we on a color system? (as per Jerome) <C971/RWW112487>
|
|
Bnz.S @2 ; Nope <C971/RWW112487>
|
|
EndIf
|
|
|
|
Tst.W teSize(A3) ; if it's a new style record
|
|
Bmi.S @2 ; don't have to worry about it
|
|
Move.W teLineHite(A3),D0 ; else, get hite - ascent
|
|
Sub.W teAscent(A3),D0
|
|
Sub.W D0,(SP) ; subtract from pnloc.v
|
|
@2
|
|
|
|
_MoveTo ; compatibility shit
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DoMeasure
|
|
; ** <C139/22Sep/86> MBK **
|
|
;
|
|
; DoMeasure was added to handle reverse justification.
|
|
; DoMeasure measures from the display start of the line
|
|
; to the given offset. MeasureIt is still called directly
|
|
; when the distance between 2 offsets is desired.
|
|
;
|
|
; Input
|
|
; d7 = left or right side to measure
|
|
; a2 = line start
|
|
; Output
|
|
; d0 = total width
|
|
; Use:
|
|
; d5 = accumulated width
|
|
; d0 = end of style run
|
|
; d3 = haven't found a style run containing d7 yet
|
|
; d2 = number of style runs on the line
|
|
;----------------------------------------------------------------------
|
|
DoMeasure
|
|
with TextFrame,TEFormatOrder ; <16Nov88smb> added for GetStylesInOrder call
|
|
MoveM.L D3/D5-D6,-(SP)
|
|
MoveQ #0,D5 ; width accumulator
|
|
Move.W (A2),D6 ; line start
|
|
sf d3 ; not found yet
|
|
|
|
Cmp D6,D7 ; nothing to measure?
|
|
Blo @MeasureDone ; made this unsigned ** <C381/6nov86/MBK> **
|
|
IF forLocalizability THEN ; <31i-YDS-8/27/91> - see <31i-YDS-8/27/91> below>
|
|
Tst.b WordRedraw ; reverse order? if <0 then RL script present
|
|
Bge @PlainMeasure ; just do normal roman measure if not
|
|
Tst.W teSize(A3) ; style record?
|
|
Bpl @LRPlainMeasure ; just do normal L->R measure if not
|
|
ELSE
|
|
Tst.W teSize(A3) ; style record?
|
|
Bpl @PlainMeasure ; just do normal measure if not
|
|
Tst.b WordRedraw ; reverse order? if <0 then RL script present
|
|
Bpl @PlainMeasure ; just do normal measure if not
|
|
ENDIF
|
|
|
|
sf useOldMethod(a6) ; flag for getting style runs <28Sept88smb>
|
|
Move.W (A2),D0 ; start of line <12July8smb> moved up here
|
|
Move.W 2(A2),D1 ; end of line <12July8smb> moved up here
|
|
|
|
; determine if display order is different from backin-store order <28Sept88smb>
|
|
tst.b WordRedraw ; $FF if a R->L directional script installed
|
|
;;<17July89smb> bge.s @getStyleOld ; nope, only L->R directional text
|
|
blt.s @RLStyledLine ; RL text in record <17July89smb>
|
|
; moved next 4 lines here to cleanup branching <17July89smb>
|
|
st useOldMethod(a6)
|
|
Bsr GetCurStyle ; get its style <7Oct88smb>
|
|
Bsr GetNumStyles ; # of styles between offsets <7Oct88smb>
|
|
bra.s @MeasureLoop ; <17July89smb>
|
|
|
|
@RLStyledLine
|
|
bsr GetStylesInOrder ; initialize style run array
|
|
; tests whether any styles to process
|
|
bge.s @MeasureLoop
|
|
bra.w @MeasureDone
|
|
|
|
@getStyleNew
|
|
; get next style using the results from getFormatOrder
|
|
bsr GetNextDisplayStyle ; <4Jan89smb>
|
|
addq #1,fmtOrderingIndex(a6) ; incr the style run counter
|
|
SubQ #1,D2 ; dec the style counter
|
|
bge.s @MeasureLoop
|
|
bra.w @MeasureDone ; done
|
|
|
|
;; removed label <17July89smb> @getStyleOld
|
|
@MeasureLoop
|
|
; get the style run in d6,d0
|
|
Move.W startChar(A0),D6 ; store actual start of line
|
|
bsr FixFormatEnd ; <6Mar89smb> returns end of style run in d0
|
|
|
|
; pin d6 (start of the style run) to start of the line
|
|
|
|
Cmp.W (A2),D6 ; should not be greater than
|
|
Bhi.S @D6Pinned2Start ; made this unsigned ** <C381/6nov86/MBK> **
|
|
Move.W (A2),D6 ; the selection start
|
|
@D6Pinned2Start
|
|
|
|
; pin d0 (end of style run) to the end of the line
|
|
|
|
Cmp.W 2(A2),D0 ; style start
|
|
Bls.S @D0Pinned2End ; made this unsigned ** <C381/6nov86/MBK> **
|
|
Move.W 2(A2),D0 ; line's end
|
|
@D0Pinned2End
|
|
|
|
; now have a valid style run, limited to the line we are on
|
|
|
|
; this checks for a boundary condition, where d7 is between style runs
|
|
|
|
tst.b d3 ; found already?
|
|
bne.s @PlainMeasure ; exit and measure the last one
|
|
|
|
; if searchpoint not in current style run, then keep measuring
|
|
|
|
Cmp.W D6,D7 ; if less than selection start
|
|
Blo.S @DontExit ; then searchPoint is not in this style
|
|
Beq.S @CheckDirection ; check for boundary condition
|
|
Cmp.W D0,D7 ; if greater than selection end
|
|
Bhi.S @DontExit ; then searchPoint is not in this style
|
|
Bne.S @PlainMeasure ; exit & measure (firmly inbetween)
|
|
|
|
; at this point, on a boundary. Measure & Exit if style direction = TESysJust
|
|
@CheckDirection
|
|
Bsr GetDirection ; returns script dir in d1
|
|
cmp.b TESysJust,d1 ; TESysJust = 0, -1, so top byte set
|
|
beq.s @PlainMeasure ; exit & measure this last run
|
|
st d3 ; found at least one style run
|
|
bra.s @GetTheWidth ; already set style, so go for it.
|
|
|
|
; if searchPoint (d7) on boundary of previous style run and this style run must adjust it to
|
|
; be at the end of the style run to get the full measure of the style run. Rather than adjust
|
|
; it we force GetWidth to use TextWidth by setting tempVar to true! <27Sept88smb>
|
|
|
|
@DontExit
|
|
Move.W D0,-(SP) ; SetStyle destroys this ** <C229/28oct86/MBK> **
|
|
Bsr SetStyle ; set the style
|
|
Move.W (SP)+,D0 ; restore length to measure ** <C229/28oct86/MBK> **
|
|
|
|
@GetTheWidth
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
st ExpandMemRec.emMeasureLine(a1) ; full line flag: measure full style run <27Sept88smb>
|
|
move.w d2,-(sp) ; save style count
|
|
Bsr GetWidth ; get string width
|
|
Add.W D1,D5 ; accumulate width
|
|
move.w (sp)+,d2 ; restore style count
|
|
tst.b useOldMethod(a6) ; <28Sept88smb>
|
|
beq.s @getStyleNew ; use formatOrder array
|
|
SubQ.L #stStartSize,A0 ; pt to prev style
|
|
Bra.S @MeasureLoop ; keep measuring
|
|
|
|
IF forLocalizability THEN ; Fix to support correct mesure for unstyled L->R
|
|
@LRPlainMeasure ; text <31i-YDS-8/27/91>>
|
|
MoveM.l a0-a1/d0-d2, -(sp) ;
|
|
Move.l teTextH(A3),A0 ; get text handle
|
|
Move.l (a0),a0 ; derefrence it
|
|
move.w teLength(a3), d0 ; take lext length to d0
|
|
cmp.w (a2),d0 ; are we at the start of the empty last line ?
|
|
beq.s @1 ; yes !!
|
|
move.w 2(a2), d0 ; take next line start to d0
|
|
@1 move.w d7,d1 ; offset
|
|
Tst.W TESysJust ; check text direction, we want tha max rect !!!
|
|
bne @3 ; push direction
|
|
move.w #smRightCaret, d2 ; we allways push the oposite direction
|
|
bra.w @4 ; in that way we get tha max mesurement
|
|
@3 move.w #smLeftCaret, d2 ; in that way we get tha max mesurement
|
|
@4 swap d2
|
|
clr.w d2 ; slop = 0
|
|
add.w d6,a0 ; point to beginning of current line <46>
|
|
sub.w d6,d0 ; want length from current line start <46>
|
|
sub.w d6,d1 ; want offset on current line <46>
|
|
;Need:
|
|
; textPtr in a0.l, textLen in d0.w, offset in d1.w;
|
|
; d2.l = slop (low word), hilite flag (high word)
|
|
bsr TEWidthHook
|
|
move.w d1,d5 ; mesure result in d5
|
|
MoveM.L (sp)+,a0-a1/d0-d2
|
|
bra.s @MeasureDone
|
|
ENDIF
|
|
|
|
@PlainMeasure
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
sf ExpandMemRec.emMeasureLine(a1) ; <27Sept88smb>
|
|
Bsr MeasureIt ; last measurement
|
|
Add.W D0,D5 ; final width
|
|
|
|
@MeasureDone
|
|
Move.W D5,D0 ; return width in D0
|
|
bsr FreeFmtOrderArray ; <18Jan89smb>
|
|
MoveM.L (SP)+,D3/D5-D6
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PinDisplay
|
|
;
|
|
; Pins D3 and D4 to the viewRect
|
|
; Expects A3 the usual TE record
|
|
; Alternate entry with rect already in A0
|
|
;
|
|
; Trashes D0, A0
|
|
;----------------------------------------------------------------------
|
|
PinDisplay
|
|
Lea teViewRect(A3),A0 ; use viewRect
|
|
PinA0Rect
|
|
Move top(A0),D0 ; load D0 w/top
|
|
|
|
Bsr.S PtToLine ; turn into a lineStart in d0
|
|
Bge.S @4 ; escape if top gone
|
|
Add D0,D0 ; double for array ref.
|
|
Blt.S @1
|
|
Cmp teLines(A3,D0),D3 ; pin D3 to viewRect.top
|
|
Bhs.S @0
|
|
Move teLines(A3,D0),D3 ; dispStart = lines[i]
|
|
@0
|
|
Cmp teLines(A3,D0),D4 ; pin D4 to viewRect.top
|
|
Bhs.S @1
|
|
Move teLines(A3,D0),D4 ; dispEnd = lines[i]
|
|
@1
|
|
Move bottom(A0),D0 ; get bottom in D0
|
|
SubQ #1,D0
|
|
Bsr.S PtToLine
|
|
|
|
AddQ #1,D0 ; inc line # ** MBK 6/18/86 **
|
|
Cmp teNLines(A3),D0 ; compare to max ** MBK 6/18/86 **
|
|
Bhi.S @3 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
Add D0,D0
|
|
Cmp teLines(A3,D0),D3 ; pin D3 to viewRect.bottom
|
|
Blo.S @2
|
|
Move teLines(A3,D0),D3 ; dispStart = lines[i]
|
|
@2
|
|
Cmp teLines(A3,D0),D4 ; pin D4 to viewRect.bottom
|
|
Blo.S @3
|
|
Move teLines(A3,D0),D4 ; dispEnd = lines[i]
|
|
@3
|
|
Rts
|
|
@4
|
|
Move D3,D4 ; nothing in range
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PtToLine
|
|
; ** Rewritten 6/13/86 by MBK **
|
|
;
|
|
; Entry:
|
|
; D0 contains a V coordinate of a point of which we want to find the
|
|
; corresponding line index into lineStart array
|
|
; Exit:
|
|
; D0 contains line index(May be negative)
|
|
; CC's set according to D0 vs teNLines
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
PtToLine
|
|
MoveM.L D2/D6-D7/A0,-(SP)
|
|
|
|
Sub teDestRect+top(A3),D0 ; origin to destRect
|
|
Ext.L D0 ; extend to long
|
|
Move.W teNLines(A3),D7 ; save total # of lines
|
|
Beq.S @4 ; if none, quit now
|
|
|
|
; special check for negative, return negative! <1/30/90smb>
|
|
tst.l d0 ; before start of rect? <1/30/90smb>
|
|
blt.s @4 ; yes, return above top line <1/30/90smb>
|
|
|
|
Move.W teLineHite(A3),D1 ; get default line height
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; if not, do it the old way
|
|
|
|
Tst.W D1 ; was line height set?
|
|
Bmi.S @1 ; wasn't set, so use array
|
|
|
|
@0 DivS D1,D0 ; else divide by line height
|
|
Bra.S @4 ; you're done
|
|
|
|
@1 Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L lhTab(A0),A0 ; max heights per line
|
|
Move.L (A0),A0 ; dereference
|
|
|
|
MoveQ #0,D1 ; init line hite accumulator
|
|
Move.W D7,D2 ; get # of lines
|
|
|
|
@2 Move.W (A0),D6
|
|
And.W #$7FFF,D6 ; mask out high bit ** <C105/28aug86/MBK> **
|
|
Add.W D6,D1 ; get the height
|
|
AddQ.W #4,A0
|
|
Cmp.W D1,D0 ; compare to point
|
|
Blt.S @3 ; found it
|
|
|
|
SubQ.W #1,D2 ; dec counter
|
|
Bne.S @2 ; more lines to point
|
|
|
|
@3 Move.W D7,D0 ; total # of lines
|
|
Sub.W D2,D0 ; get line index
|
|
|
|
@4 Cmp D7,D0 ; compare the max # lines
|
|
|
|
MoveM.L (SP)+,D2/D6-D7/A0
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; InvertHook
|
|
;
|
|
; This calls the passed hook if there, but otherwise uses _InverRect.
|
|
; Used for carets and selection. The hook passed must remove the
|
|
; rect from the stack
|
|
;
|
|
; Entry:
|
|
; D0 the hook proc in question
|
|
; selRect(A3) set up for rectangle in question
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;
|
|
InvertHook
|
|
; Clear HiliteMode bit to tell QuickDraw to use color highlighting.
|
|
; Only do this if a hook is not installed.
|
|
Pea teSelRect(A3) ; default selection method
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
; we have to do this test, so we have to explicitly check D0.L again rather
|
|
; than count on the SR flags coming in being right as in the ROM versions
|
|
BTst #14,ROM85 ; on a color system? <C971/RWW112487>
|
|
Bnz.S @1 ; <C971/RWW112487>
|
|
|
|
Tst.L D0 ; does a hook exist?
|
|
Bne.S @2 ; yes, go do it
|
|
Lea HiliteMode,A0 ; <C971/RWW112487>
|
|
BClr #7,(A0) ; <C971/RWW112487>
|
|
Bra.S defHilite ; <C971/RWW112487>
|
|
|
|
@1 Tst.L D0 ; does a hook exist? <C971/RWW112487>
|
|
Beq.S defHilite ; no <C971/RWW112487>
|
|
@2
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
Bne.S @0
|
|
Lea HiliteMode,A0 ; new memory location for hiliting
|
|
BClr #7,(A0) ; tell them we want color hiliting
|
|
Bra.S defHilite ; do the inversion
|
|
@0
|
|
Else
|
|
Beq.S defHilite ; there, otherwise just invert
|
|
|
|
EndIf
|
|
|
|
Move.L D0,A0
|
|
Jmp (A0)
|
|
defHilite
|
|
_InverRect
|
|
Rts
|
|
|
|
; Color highlighting is not to be used on the caret, so I created this separate
|
|
; procedure just for caret highlighting.
|
|
|
|
If hasCQD|(NOT ForROM) THEN ; <9Dec88smb>
|
|
|
|
CaretHook
|
|
Pea teSelRect(A3) ; default selection method
|
|
Tst.L D0 ; make absolutely sure! <S487/RWW050288>
|
|
Beq.S defHilite ; there, otherwise just invert
|
|
Move.L D0,A0
|
|
Jmp (A0)
|
|
EndIf
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
; StdEntry (or "entries" as it is!)
|
|
;
|
|
; Standard Entry for procs, saves registers and pops handle
|
|
; argument into A4 and dereferences it into A3. Points A2 to
|
|
; first parameter AFTER the handle.
|
|
;----------------------------------------------------------------------
|
|
TEKeyStdEntry
|
|
; Added new entry point for TEKey since need to save/clear textBuffering flag around this routine.<18Sept89smb>
|
|
moveq #0,d0 ; not a style trap
|
|
move.l (sp)+,a0 ; save return address
|
|
move.l (sp)+,a1 ; save newTEFlags
|
|
link a6,#stdLink ; stack frame
|
|
movem.l d2-d7/a2-a4,-(SP)
|
|
move.l a1,-(sp) ; newTEFlags to restore
|
|
move.l a0,-(sp) ; push return address back on stack
|
|
bra.s NotStyleTrap
|
|
StdEntry
|
|
MoveQ #0,D0 ; not a style trap ** <C105/28aug86/MBK **
|
|
StdEntry2
|
|
Move.L (SP)+,A0 ; save return address
|
|
Link A6,#stdLink ; stack frame
|
|
MoveM.L D2-D7/A2-A4,-(SP)
|
|
Move.L A0,-(SP) ; push return address back on stack
|
|
|
|
Tst.W D0 ; is it a style trap? ** <C105/28aug86/MBK **
|
|
Beq.S NotStyleTrap ; if not, skip this ** <C105/28aug86/MBK **
|
|
|
|
Move.W inHandle(A6),D0 ; get the selector ** <C105/28aug86/MBK **
|
|
Lea AddrTable,A0 ; table of addresses ** <C105/28aug86/MBK **
|
|
Add.W D0,D0 ; each entry is 2 bytes ** <C381/5nov86/MBK **
|
|
Move.W 0(A0,D0),D0 ; get offset to the trap** <C381/5nov86/MBK **
|
|
Lea 0(A0,D0),A0 ; get trap's addr ** <C381/5nov86/MBK **
|
|
Move.L A0,D3 ; save addr in D3 ** <C381/5nov86/MBK **
|
|
|
|
Move.L inHandle+2(A6),A4 ; get TEHandle ** <C105/28aug86/MBK **
|
|
Bra.S StyleTrap
|
|
NotStyleTrap
|
|
MoveQ #0,D3 ; use D3 as a flag ** <C105/28aug86/MBK **
|
|
Move.L inHandle(A6),A4 ; Pop handle into A4
|
|
|
|
; Modified to use _HGetState ** <C105/5sep86/MBK> **
|
|
StyleTrap
|
|
Move.L A4,A0 ; set up for GetState
|
|
_HGetState ; get handle flags
|
|
Move.B D0,saveHandle(A6) ; save handle flags
|
|
|
|
Pea savePort(A6) ; save incoming port
|
|
_GetPort ;
|
|
|
|
Move.L A4,A0 ; get the TEHandle
|
|
_HLock
|
|
|
|
Move.L (A4),A3 ; Dereference into A3 ** <C381/8nov86/MBK **
|
|
|
|
; Do all safety related entry stuff
|
|
Move.L teGrafPort(A3),A2 ; save "thePort" for below
|
|
Move.L A2,-(SP) ; set to our port
|
|
_SetPort
|
|
|
|
; Get clip from this port into rgn defined above
|
|
SubQ #4,SP ; make room for clip
|
|
_NewRgn
|
|
Move.L (SP),saveClip(A6) ; save user's clip in frame
|
|
Move.L (SP),-(SP) ; stay on stack for sectrgn below
|
|
_GetClip ;
|
|
|
|
Pea teViewRect(A3) ; clip to viewRect
|
|
_ClipRect
|
|
|
|
; First param on stack from above. Do not pass go. Do not collect $200
|
|
Move.L clipRgn(A2),-(SP)
|
|
Move.L (SP),-(SP) ; destination
|
|
_SectRgn
|
|
|
|
; Set up font, etc. AFTER saving the grafport information! <20>
|
|
move.l teGrafPort(a3),a0 ; pt to GrafPort
|
|
move.w txFont(a0),saveFont(a6) ; save current font
|
|
bclr #7,txFace+1(a0) ; in case direction set here <30May89smb>
|
|
move.w txFace(a0),saveFace(a6) ; save current face
|
|
move.w txSize(a0),saveSize(a6) ; save current size
|
|
pea saveColor(a6) ; place to save color ** <C182/60ct86/MBK> **
|
|
|
|
tst.w teSize(a3) ; check style flag
|
|
bmi.s DontSet ; don't set style ** MBK 6/20/86 **
|
|
|
|
move.l teFontStuff(A3),txFont(A0) ; set the font/face
|
|
move.l teFontStuff+4(A3),txFont+4(A0) ; set the mode/size
|
|
|
|
DontSet
|
|
|
|
Move.W teMode(A3),txMode(A0) ; do set the mode ** <C815/13feb87/MBK **
|
|
_GetForeColor ; for Ikki ** <C182/6oct86/MBK> **
|
|
|
|
Move.L teTextH(A3),A0 ; get handle size
|
|
|
|
_HGetState ; get the text handle's tag
|
|
Move.B D0,saveTH(A6) ; and save the flags
|
|
_HLock ; and lock it
|
|
|
|
_GetHandleSize ; get its size
|
|
Move D0,teLength(A3) ; stuff its length
|
|
|
|
; Clean up the selection (This must be the last guy because of alternate entry)
|
|
|
|
CleanUpSel
|
|
Move teLength(A3),D0 ; get the text length
|
|
|
|
Move teSelEnd(A3),D1 ; make sure selEnd is cool
|
|
Sub D0,D1 ; selEnd-length
|
|
Bls.S okSelEnd ; if >0 then bad selend
|
|
Move D0,teSelEnd(A3) ; set to length if > length
|
|
okSelEnd
|
|
|
|
Move teSelStart(A3),D1 ; make sure selStart is cool
|
|
Sub teSelEnd(A3),D1 ; selStart-selend
|
|
Bls.S okSelStart ; if >0 then bad selStart
|
|
Sub D1,teSelStart(A3) ; set to selend if > selend
|
|
okSelStart
|
|
IF &TYPE('&RWWDebug') = 'UNDEFINED' THEN
|
|
Bsr.s SelSort ; I wish i could fall into it
|
|
ELSE
|
|
Bsr SelSort ; I wish i could fall into it
|
|
ENDIF
|
|
|
|
Tst.L D3 ; addr of style trap? ** <C105/28aug86/MBK **
|
|
Beq.S @2 ; if not, skip this ** <C105/28aug86/MBK **
|
|
|
|
Move.L D3,A0 ; return it in A0 ** <C381/5nov86/MBK **
|
|
Lea inHandle+6(A6),A2 ; pt to next param ** <C105/28aug86/MBK **
|
|
Bra.S endEntry ; that's it ** <C105/28aug86/MBK **
|
|
|
|
@2 Lea inHandle+4(A6),A2 ; Point to next to last param
|
|
; (1st on stack after handle)
|
|
endEntry
|
|
; dump text buffer before processing any calls <14Sept89smb>
|
|
move.l a0,-(sp)
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <15Sept89smb>
|
|
btst #teFTextBuffering,d0 ; <15Sept89smb>
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
move.l (sp)+,a0
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEDispatch (...; hTE: TEHandle; teStyl: INTEGER );
|
|
;
|
|
; ** <C105/28aug86/MBK> **
|
|
;
|
|
; All style procedure and function traps come here (except
|
|
; TEStylNew) due to a shortage of traps.
|
|
;
|
|
; ** <C207/13oct86/MBK> **
|
|
;
|
|
; Added special dispatch to StylTextBox. Have to special case
|
|
; it since it doesn't go through StdEntry.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEDispatch
|
|
MoveQ #1,D0 ; tells stdEntry it's a style trap
|
|
Bsr StdEntry2 ; get addr of procedure
|
|
Jmp (A0) ; go and never come back!
|
|
|
|
; ***************************************************************************
|
|
; ** <C971/RWW102387> So I can find routines more easily...
|
|
If &TYPE('&RWWDebug') <> 'UNDEFINED' Then
|
|
|
|
Macro
|
|
FindEntry &rout
|
|
DC.B '&SUBSTR(&CONCAT(&rout,'............'),1,12)'
|
|
DC.L &rout-DispLocTable
|
|
EndM
|
|
|
|
Export DispLocTable
|
|
DispLocTable
|
|
FindEntry vChar2Pixel ; see OS:DispTable.a
|
|
FindEntry vPixel2Char ; see OS:DispTable.a
|
|
FindEntry XTrimMeasure ; see OS:DispTable.a
|
|
FindEntry XFindWord ; see OS:DispTable.a
|
|
FindEntry XFindLine ; see OS:DispTable.a
|
|
FindEntry XEOLHook
|
|
FindEntry XDRAWHook
|
|
FindEntry iTEStylPaste
|
|
FindEntry iTESetStyle
|
|
FindEntry iTEReplaceStyle
|
|
FindEntry iTEGetStyle
|
|
FindEntry iGetStylHandle
|
|
FindEntry iSetStylHandle
|
|
FindEntry iGetStylScrap
|
|
FindEntry iTEStylInsert
|
|
FindEntry iTEGetPoint
|
|
FindEntry iTEGetHeight
|
|
FindEntry iTECustomHook
|
|
FindEntry iTEContinuousStyle
|
|
FindEntry iSetStylScrap
|
|
FindEntry iTENumStyles
|
|
FindEntry iTEFeatureFlag
|
|
DC.L -1
|
|
EndIf
|
|
; ***************************************************************************
|
|
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; Sorts the selStart and selEnd
|
|
;
|
|
; Entry:
|
|
; A3 must contain a dereferenced TE object
|
|
;
|
|
; Exit:
|
|
; D0 contains a sorted selStart/End as a long
|
|
; A2 contains a pointer to teSelStart
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
SelSort
|
|
Lea teSelStart(A3),A2 ; Point to selstart
|
|
Move.L (A2),D0 ; load start and end
|
|
Cmp (A2),D0 ; see which is bigger
|
|
Bhs.S @0
|
|
Swap D0
|
|
Move.L D0,(A2) ; swap and store back
|
|
@0 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TECopy( h: TEHandle );
|
|
;
|
|
; ** Modified 6/20/86 by MBK **
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TECopy
|
|
Bsr StdEntry ; <C971/RWW102887>NO
|
|
|
|
Bsr.S SelSort ; D0 contains both (end in low order)
|
|
Sub (A2),D0 ; A2 points to selStart(A3)
|
|
Move D0,TEScrpLength ; scraplength=selEnd-selStart
|
|
|
|
Move.L teTextH(A3),A0 ; source = text; already locked
|
|
Move.L (A0),A0 ; dereference
|
|
MoveQ #0,D0 ; clear whole long
|
|
Move (A2),D0
|
|
Add.L D0,A0 ; offset to selection(see above)
|
|
Move.L TEScrpHandle,A1 ; destination
|
|
Move TEScrpLength,D0 ; nBytes = scrapLength
|
|
_PtrToXHand
|
|
|
|
; ** <C207/15oct86/MBK> ** Don't wipe out desk scrap for old TERecs in case applications
|
|
; use it for Undo
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S goEpilog4 ; no style, don't wipe out scrap
|
|
|
|
; Now copy directly to the desk scrap anyway
|
|
SubQ #4,SP ; room for result ** MBK 6/20/86 **
|
|
_ZeroScrap ; clear the scrap ** MBK 6/20/86 **
|
|
AddQ.L #4,SP ; ignore result ** MBK 6/20/86 **
|
|
|
|
Bsr.S SelSort ; D0 contains both (end in low order)
|
|
Bsr.S CopyStyle ; copy style info <C971/RWW102887>NO
|
|
|
|
Move.L teTextH(A3),A0 ; text handle ** MBK 6/20/86 **
|
|
Move.L (A0),A0 ; deref ** MBK 6/20/86 **
|
|
MoveQ #0,D0 ; clear long word ** MBK 6/20/86 **
|
|
; <16May89smb> Must set up A2 to point to selStart(a3) again, since it may be invalid if the
|
|
; teRecord moved during a MyNewHandle call in CopyGuts.
|
|
Lea teSelStart(A3),A2 ; <16May89smb> point to selStart
|
|
Move (A2),D0 ; start of selection ** MBK 6/20/86 **
|
|
AddA.W D0,A0 ; offset to selection ** MBK 6/20/86 **
|
|
SubQ #4,SP ; room for result ** MBK 6/20/86 **
|
|
Move.W TEScrpLength,D0 ; length of selection ** MBK 6/20/86 **
|
|
Move.L D0,-(SP) ; push length ** MBK 6/20/86 **
|
|
Move.L #'TEXT',-(SP) ; type 'TEXT' ** <C381/5nov86/MBK> **
|
|
Move.L A0,-(SP) ; ptr to selection ** MBK 6/20/86 **
|
|
_PutScrap ; copy to desk scrap ** MBK 6/20/86 **
|
|
AddQ.L #4,SP ; ignore result ** MBK 6/20/86 **
|
|
|
|
goEpilog4
|
|
Bra epilog4
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE CopyStyle
|
|
;
|
|
; ** Added 5/28/86 by MBK **
|
|
;
|
|
; CopyStyle saves the styles corresponding to the current text
|
|
; selection to the desk scrap.
|
|
;
|
|
; Entry:
|
|
; A3: Pointer to TERec
|
|
; D0: selStart, selEnd
|
|
;
|
|
;----------------------------------------------------------------------
|
|
CopyStyle
|
|
MoveM.L D0/D2-D5/A2/A5,-(SP) ; save stuff
|
|
|
|
; get ptr to 1st style and # of styles
|
|
Move.W D0,D1 ; save end
|
|
Swap D0 ; selStart in low word
|
|
Cmp.W D0,D1 ; is it an insertion pt?
|
|
Beq.S @2 ; if so, no style to copy
|
|
|
|
Bsr.S CopyGuts ; do the copy
|
|
|
|
; Lock my scrap handle 'cause PutScrap might try to move it!
|
|
Move.L A4,A0 ; my scrap handle
|
|
_HLock ; lock it
|
|
|
|
; copy the styles to the desk scrap now
|
|
SubQ.L #4,SP ; room for result
|
|
Move.L D4,-(SP) ; size of scrap
|
|
Move.L #'styl',-(SP) ; scrap type ** <C381/5nov86/MBK> **
|
|
Move.L (A4),-(SP) ; scrap ptr
|
|
_PutScrap ; copy to desk scrap
|
|
AddQ.L #4,SP ; remove result code
|
|
|
|
; don't need this handle anymore
|
|
Move.L A4,A0 ; scrap handle
|
|
_DisposHandle ; get rid of it
|
|
|
|
@2 MoveM.L (SP)+,D0/D2-D5/A2/A5 ; save stuff
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE CopyGuts
|
|
;
|
|
; ** Separated out from CopyStyle 1/22/87 by MBK **
|
|
;
|
|
; CopyGuts is called by CopyStyle and GetStylScrap to save the
|
|
; styles corresponding to the current text selection.
|
|
;
|
|
; Entry:
|
|
; A3: Pointer to TERec
|
|
; D0: selStart
|
|
; D1: selEnd
|
|
; Exit:
|
|
; A4: handle to style scrap
|
|
; Modifies:
|
|
; A0-A4,D0,D2,D4,D5
|
|
;
|
|
;----------------------------------------------------------------------
|
|
CopyGuts
|
|
Move.W D0,D5 ; save 1st offset
|
|
Bsr GetCurStyle ; get style at current selection
|
|
Bsr GetNumStyles ; find # of styles in selection
|
|
Move.W D0,D2 ; save # of styles
|
|
|
|
; get a temp handle to store the styles in before copying to desk scrap
|
|
MulU #scrpRecSize,D0 ; * size of a scrap style rec
|
|
AddQ.L #2,D0 ; total scrap size
|
|
Move.L D0,D4 ; preserve scrap size
|
|
Bsr MyNewHandle ; temp handle for style scrap ** <C381/7nov86/MBK> **
|
|
Move.L A0,A4 ; save scrap handle
|
|
|
|
Move.L (A0),A0 ; deref
|
|
Move.W D2,scrpNStyles(A0) ; store # of styles in scrap
|
|
Lea scrpStyleTab(A0),A1 ; pt to array of styles
|
|
|
|
; ** <C393/10nov86/MBK> ** style ptr may no longer be valid after memory allocation
|
|
Move.W D5,D0 ; get 1st offset ** <C393/10nov86/MBK> **
|
|
Bsr GetCurStyle ; get style at current selection** <C393/10nov86/MBK> **
|
|
Move.L A0,A2 ; store ptr to current style ** <C393/10nov86/MBK> **
|
|
|
|
; loop over styles in the selection, copying to temp location
|
|
@0 AddQ.L #4,A1 ; skip 1st entry ** <C207/13oct86/MBK> **
|
|
Move.W styleIndex(A2),D0 ; style index
|
|
Bsr GetStyle ; get the style ptr
|
|
AddQ.L #2,A0 ; skip 1st entry ** <C207/13oct86/MBK> **
|
|
MoveQ #stRecSize-2,D0 ; size of a style rec-2 ** <C381/6nov86/MBK> **
|
|
_BlockMove ; copy style to scrap
|
|
|
|
MoveQ #0,D0 ; it's a long word ** <C207/13oct86/MBK> **
|
|
Move.W startChar(A2),D0 ; get start offset of this style
|
|
Sub.W D5,D0 ; offset from start of text scrap
|
|
Bhs.S @1 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
MoveQ #0,D0
|
|
|
|
@1 Move.L D0,-(A1) ; store scrap offset
|
|
Add.L #scrpRecSize,A1 ; next position in style array
|
|
AddQ.L #stStartSize,A2 ; next style
|
|
SubQ #1,D2 ; dec the style counter
|
|
Bne.S @0 ; loop if more styles
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TECut( h: TEHandle );
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TECut
|
|
Bsr StdEntry ; <C971/RWW102887>NO
|
|
|
|
Move.L A4,-(SP) ; duplicate handle twice
|
|
_TECopy ; copy it
|
|
Move.L A4,-(SP)
|
|
_TEDelete ; delete it (A3 no good after)
|
|
|
|
Bra goEpilog4 ; see you later <C971/RWW102887>NO
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEDelete( h: TEHandle );
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEDelete
|
|
Bsr StdEntry ; <C971/RWW102887>NO
|
|
|
|
Bsr HideCaret
|
|
|
|
Bsr.S DelGuts ; delete the selection
|
|
Bsr RecalDraw ; recalibrate line starts
|
|
|
|
Bsr ShowCaret
|
|
|
|
Bsr SelView ; insure selection is visible
|
|
|
|
Bra goEpilog4 ; <C971/RWW102887>NO
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DelGuts
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Entry:
|
|
; A3 contains dereferenced handle
|
|
;
|
|
; Exit
|
|
; Selstart and selEnd will be fixed up to point to the old selStart
|
|
; D7 contains delta amount for delete portion
|
|
;
|
|
;----------------------------------------------------------------------
|
|
DelGuts
|
|
Bsr SelSort ; sort selection <C971/RWW102887>NO
|
|
|
|
Move D0,D7 ; calc delta amount(selEnd in D0)
|
|
Sub (A2),D7 ; ...for ReCalLines (A2 ^selStart)
|
|
Beq.s outGuts ; skip if null selection
|
|
|
|
; ** <C971/RWW102987> Inserted test to change the way backspacing/deleting works.
|
|
; If you backspace to the beginning of a style, that style is saved to the null scrap.
|
|
; This allows you to type a selection, backspace over it, and retype without
|
|
; TextEdit reverting to the previous style.
|
|
Tst.W teSize(A3) ; is this a styled record? <C971/RWW102987>
|
|
Bpl.S @1 ; oops, never mind <C971/RWW102987>
|
|
|
|
MoveM.L D0/D7/A2,-(SP) ; we need D0 and A2 temporarily <C971/RWW102987>
|
|
Move.W teSelStart(A3),D0 ; find start of block to be yanked <C971/RWW102987>
|
|
Bsr GetCurStyle ; find the associated style run <C971/RWW102987>
|
|
Move.W teSelStart(A3),D0 ; get start of block again <C971/RWW102987>
|
|
Cmp.W startChar(A0),D0 ; is it the beginning of a style? <C971/RWW102987>
|
|
Beq.S @2 ; yes, so continue <C971/RWW102987>
|
|
|
|
Bsr ClearRsrved ; no null selection! <C971/RWW102987>
|
|
Bra.S @3 ; <C971/RWW102987>
|
|
|
|
@2 Move.W styleIndex(A0),D0 ; fetch index into style table <C971/RWW102987>
|
|
Bsr GetStyle ; find associated style table entry <C971/RWW102987>
|
|
Move.W #doAll,-(SP) ; build fake frame for SetRsrved <C971/RWW102987>
|
|
Pea stFont(A0) ; point at embedded textstyle <C971/RWW102987>
|
|
Clr.B -(SP) ; need another word, can't hurt <C971/RWW102987>
|
|
Move.L SP,A2 ; point A2 at stacked parameters <C971/RWW102987>
|
|
Bsr AltSetRsrved ; set null scrap style <C971/RWW102987>
|
|
AddQ.W #8,SP ; fix up stack <C971/RWW102987>
|
|
|
|
@3 MoveM.L (SP)+,D0/D7/A2 ; retrieve saved registers <C971/RWW102987>
|
|
@1 ; <C971/RWW102987>
|
|
|
|
Move.W D0,D1 ; selEnd ** MBK 6/18/86 **
|
|
Swap D0 ; selStart ** MBK 6/18/86 **
|
|
Bsr.S DeleteStyle ; del associated styles <C971/RWW102887>NO
|
|
|
|
Bsr MungeSetup ; set up params for delete
|
|
|
|
Move D7,-(SP) ; length for delete
|
|
Clr -(SP) ; fake long length
|
|
Clr.L -(SP) ; fake p2
|
|
Clr.L -(SP) ; fake l2
|
|
_Munger ; sloppy munger
|
|
AddQ.L #4,SP ; pop result
|
|
|
|
Move.L teTextH(A3),A0 ; RecalDraw expects text to be locked
|
|
_Hlock ; and relock it
|
|
|
|
Sub D7,teLength(A3) ; length:=length -(selEnd-selStart)
|
|
Move (A2)+,(A2) ; selEnd:=selStart
|
|
tst.w teSize(A3) ; is this a styled record? <24July89smb>
|
|
bpl.S outGuts ; if so, no need to concat - only 1 run <24July8smb>
|
|
bsr ConcatStyles ; <21July89smb>
|
|
bsr ConcatRuns ; <25June89smb>
|
|
outGuts
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DeleteStyle
|
|
;
|
|
; ** Added 6/2/86 by MBK **
|
|
;
|
|
; DeleteStyle checks to see if the TERec has style (txSize = -1),
|
|
; And if so deletes the style(s) corresponding to the current text
|
|
; selection.
|
|
;
|
|
; Entry:
|
|
; A3: Ptr to TERec
|
|
; D0: selStart
|
|
; D1: selEnd
|
|
;
|
|
;----------------------------------------------------------------------
|
|
DeleteStyle
|
|
MoveM.L D0/D2-D6/A2,-(SP) ; save stuff
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @2 ; no style so nothing to delete
|
|
|
|
Move.W D0,D5 ; store selStart
|
|
Sub.W D1,D5 ; neg length for delete
|
|
Beq.S @2 ; quit if nothing to delete
|
|
|
|
Move.W D0,D3 ; save selStart
|
|
SubQ #1,D0 ; pre-decrement
|
|
Bsr GetCurStyle ; get style at current selection
|
|
Move.L A0,A2 ; store ptr to current style
|
|
Move.W D0,D6 ; save index
|
|
AddQ #1,D1 ; include following style
|
|
Bsr GetNumStyles ; find # of styles in selection
|
|
|
|
SubQ #1,D0 ; don't delete current style
|
|
|
|
Move.W D0,D2 ; # of styles
|
|
Add.W D6,D0 ; add index
|
|
Move.W D0,D6 ; save index
|
|
MoveQ #0,D4 ; clear long word ** <C381/6nov86/MBK> **
|
|
Move.W D2,D4
|
|
LsL.L #2,D4 ; * stStartSize (4) ** <C381/6nov86/MBK> **
|
|
Add.L D4,A0 ; pt to last style to be deleted
|
|
|
|
Tst.W D2 ; see if any styles to delete
|
|
Bne.S @0 ; if nothing to delete
|
|
Bsr RecalStStarts ; reset following style starts
|
|
Bra.S @2 ; and go
|
|
|
|
@0 Move.W D3,startChar(A0) ; selStart is new start of last style
|
|
Bsr RecalStStarts ; reset following style starts
|
|
|
|
Cmp.W startChar(A2),D3 ; special case
|
|
Beq.S @1
|
|
|
|
Add.L #stStartSize,A2 ; point to next style
|
|
SubQ #stStartSize,D4 ; 1 less to delete
|
|
SubQ #1,D2 ; don't delete last style
|
|
Beq.S @2 ; nothing to delete
|
|
|
|
@1 Move.L A2,A0 ; ptr
|
|
Move.W D2,D0 ; count
|
|
Bsr.S DecStylCount ; decrement style count <C971/RWW102887>NO
|
|
|
|
; Delete the runs corresponding to deleted text
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; dereference
|
|
MoveQ #0,D0 ; clear long word ** <C381/6nov86/MBK> **
|
|
Move.W nRuns(A0),D0 ; current # of styles
|
|
AddQ #1,D0 ; plus 1
|
|
Sub D6,D0 ; minus index
|
|
LsL.L #2,D0 ; * stStartSize (4) ** <C381/6nov86/MBK> **
|
|
Sub.W D2,nRuns(A0) ; dec the # of styles
|
|
|
|
Move.L A2,A1 ; destination of move
|
|
Move.L A2,A0
|
|
Add.L D4,A0 ; source of move
|
|
_BlockMove
|
|
|
|
@2 MoveM.L (SP)+,D0/D2-D6/A2 ; restore stuff
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DecStylCount
|
|
;
|
|
; ** Added 6/2/86 by MBK **
|
|
;
|
|
; DecStylCount decrements the style count by one after an instance
|
|
; of the style has been deleted.
|
|
;
|
|
; Entry:
|
|
; D0: # of styles to check
|
|
; A0: Pointer to style from which to start
|
|
; A3: Ptr to TERec
|
|
;
|
|
;----------------------------------------------------------------------
|
|
DecStylCount
|
|
Move.L A0,A1 ; save ptr to style start
|
|
Move.W D0,D1 ; store # styles to check
|
|
|
|
; get the styleRec corresponding to the index
|
|
@0 Move.W styleIndex(A1),D0 ; get index to style
|
|
Bsr GetStyle ; get pointer to that style
|
|
Tst.W stCount(A0) ; is the count already 0?
|
|
Beq.S @1
|
|
|
|
SubQ #1,stCount(A0) ; if not, decrement the count
|
|
|
|
; see if there are more styles to delete
|
|
@1 Add.L #stStartSize,A1 ; point to next style
|
|
SubQ #1,D1 ; dec the counter
|
|
Bne.S @0 ; more to decrement
|
|
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE RecalDraw
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Calls ReCalLines to recalibrates the line start array and then draws
|
|
; the "new" part according to selStart
|
|
;
|
|
; Entry
|
|
; A4 points to handle
|
|
; A3 points to dereferenced TE object
|
|
; D7 contains delta change = oldLength-newLength
|
|
;
|
|
; ** <C207/16oct86/MBK> ** Added code to reset redraw boundaries if the
|
|
; line height has changed on any line.
|
|
;
|
|
; ** <C381/8nov86/MBK> ** Moved code to decide where redraw must occur
|
|
; to the routine SetLineHite.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
RecalDraw
|
|
|
|
MoveQ #0,D0 ; 1st line ** MBK 6/18/86 **
|
|
Move.W teNLines(A3),D1 ; last line ** MBK 6/18/86 **
|
|
Bsr GetLineHites ; get total height ** MBK 6/18/86 **
|
|
Move.W D0,-(SP) ; save it ** MBK 6/18/86 **
|
|
|
|
Bsr ReCalLines ; D2/D4 returned w/dispStart
|
|
Move D2,D3 ; record dispStart
|
|
|
|
MoveQ #0,D0 ; 1st line ** MBK 6/18/86 **
|
|
Move.W teNLines(A3),D1 ; last line ** MBK 6/18/86 **
|
|
Bsr GetLineHites ; get new height ** MBK 6/18/86 **
|
|
Move.W (SP)+,D1 ; get old height
|
|
Cmp.W D0,D1 ; don't erase if same
|
|
Blo.S noErase ; nothing to erase
|
|
|
|
Lea teSelRect(A3),A0 ; pt to selection rect
|
|
Add teDestRect+top(A3),D1 ; new bottom
|
|
Move.W D1,bottom(A0)
|
|
|
|
Add teDestRect+top(A3),D0 ; new top
|
|
Move.W D0,top(A0)
|
|
|
|
Move.W #UnboundLeft,left(A0) ; large negative left
|
|
Move #UnboundRight,right(A0) ; VERY large right(Erase to end)
|
|
|
|
Move.L A0,-(SP) ; point to rect
|
|
_EraseRect
|
|
|
|
noErase
|
|
MoveQ #teDraw,D7 ; Redraw changed part
|
|
Bra DoText ; see you later <C971/RWW102887>NO
|
|
|
|
;formFeed
|
|
;-------------------------------------------------------------------------------
|
|
; Function: GetCurScript // <DGO 881004>
|
|
;
|
|
; This function determines the "script run" (comprising one or more style runs)
|
|
; that contains the character position contained on entry in register d0. Note
|
|
; that this routine should only be called for styled TERecs.
|
|
;
|
|
; Inputs:
|
|
;
|
|
; d0 = Absolute char position for which script run is to be found
|
|
;
|
|
; Outputs:
|
|
;
|
|
; a0 = Address of the first style run in the script run
|
|
; a1 = Index of the first style run in the script run
|
|
; d0 = Total length (in chars) of all style runs comprising this script run
|
|
; d1 = Script number of this script run
|
|
;
|
|
; General register usage (as usual, a6 is local frame pointer):
|
|
;
|
|
; d4 = On-the-fly index into array of StyleRuns
|
|
; d5 = Cumulative character length of runs
|
|
; d6 = Offset into STElement array of the (a2) element
|
|
; d7 = Script number for this run
|
|
;
|
|
; a2 = On-the-fly address of StyleRuns array element
|
|
; a4 = Base address of STElement[0]
|
|
; a5 = Base address of TEStyleRec
|
|
;
|
|
; Assumptions made about input state:
|
|
;
|
|
; a3 = Dereferenced pointer to TERecord
|
|
;
|
|
; CHANGE LOG
|
|
;
|
|
; <4-Oct-88 DGO> Corrected bug whereby I was using the styleRun index rather than the
|
|
; styleIndex for the styleRun **arrgghhh**
|
|
;
|
|
;-------------------------------------------------------------------------------
|
|
GetCurScript
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vGetCurScript(a0),a0
|
|
jmp (a0)
|
|
|
|
xGetCurScript
|
|
|
|
; Initial housekeeping
|
|
;
|
|
link a6,#gcsLink
|
|
movem.l d2-d7/a2/a4/a5,-(sp)
|
|
;
|
|
; Since d0 is already set to the char position, we start the ball rolling by calling
|
|
; GetCurStyle. This returns a pointer to the style run in a0, and the style run index
|
|
; in d0.
|
|
;
|
|
bsr GetCurStyle
|
|
movea.l a0,a2
|
|
move.w d0,d4
|
|
;
|
|
; Set up our utility registers.
|
|
;
|
|
movea.l teStylesH(a3),a5
|
|
movea.l (a5),a5 ; Pointer to TEStyleRec now in a5
|
|
|
|
movea.l styleTab(a5),a4
|
|
movea.l (a4),a4 ; Pointer to STElement[0] now in a4
|
|
|
|
moveq.l #0,d5 ; Zero cumulative script length counter
|
|
|
|
moveq #0,d6 ; must clear for shift logic <29June89smb>
|
|
move.w styleIndex(a2),d6
|
|
;; mulu #stRecSize,d6 ; Offset from a4 of STElement[d4]
|
|
add.w d6,d6 ; replace mulu w/ shift logic <28June89smb>
|
|
move.w d6,d1 ; save <28June89smb>
|
|
lsl.w #3,d6 ; <28June89smb>
|
|
add.w d1,d6 ; sum <28June89smb>
|
|
;
|
|
; Now determine to which script this style run belongs. The result will be the script value
|
|
; that all other contiguous style runs must match in order to be added to this script run.
|
|
;
|
|
clr.w -(sp)
|
|
move.w stFont(a4,d6.l),-(sp) ; Font for this style run
|
|
_Font2Script
|
|
move.w (sp)+,d7 ; Script number for this script run in d7
|
|
;
|
|
; We now start traversing the style runs. We'll first traverse the earlier runs, and then
|
|
; the later ones. Before we start the first traverse, we save the state of several of the
|
|
; registers for restoration when starting the second traverse, below.
|
|
;
|
|
movem.l d4/a2,-(sp)
|
|
;
|
|
; Add the length of this style run to the cumulative length for the script run. Remember
|
|
; that the length of a style run can be determined by adding the startChar of the
|
|
; following style run and subtracting the startChar of this style run. (Note
|
|
; that we fall into this code the first time through, which adds the length of the
|
|
; initial style run). This is complicated by the following ugliness: If we're in the
|
|
; last style run in the TERecord, we need to decrement the count by one, since the
|
|
; dummy entry at the end of the StyleRun table has a startChar value that is one
|
|
; *greater* than the total count of characters in the record. *Sigh*
|
|
;
|
|
@1 add.w stStartSize(a2),d5 ; Note that any overflows will
|
|
sub.w startChar(a2),d5 ; automagically sort themselves out...
|
|
|
|
move.l a2,gcsTemp(a6) ; Save earliest script start
|
|
move.w d4,gcsIndex(a6) ; and index of earliest start
|
|
|
|
addq.w #1,d4 ; These 4 lines are the ugly code
|
|
cmp.w nRuns(a5),d4 ; that handle the case of the
|
|
bne.s @2 ; final style run's extra
|
|
subq.w #1,d5 ; count...
|
|
|
|
@2 subq.w #1,d4 ; Balance the addq in the above ugly code
|
|
beq.s @3 ; If we just did 0th, first traverse is done
|
|
|
|
subq.l #stStartSize,a2 ; Set pointer to previous styleRun
|
|
subq.w #1,d4 ; Set index to previous styleRun
|
|
moveq #0,d6 ; must clear for shift logic <29June89smb>
|
|
move.w styleIndex(a2),d6
|
|
;; mulu #stRecSize,d6 ; Move to previous STElement
|
|
add.w d6,d6 ; replace mulu w/ shift logic <28June89smb>
|
|
move.w d6,d1 ; save <28June89smb>
|
|
lsl #3,d6 ; <28June89smb>
|
|
add.w d1,d6 ; sum <28June89smb>
|
|
|
|
clr.w -(sp) ; Convert font
|
|
move.w stFont(a4,d6.l),-(sp) ; into script
|
|
_Font2Script
|
|
|
|
cmp.w (sp)+,d7 ; If this new script matches ours,
|
|
beq.s @1 ; continue with first traverse
|
|
;
|
|
; We're done with the earlier traverse. Restore the registers that were saved above,
|
|
; and start essentially the same operation for the later traverse.
|
|
;
|
|
@3 movem.l (sp)+,d4/a2 ; Restore on-the-fly values
|
|
addq.w #1,d4 ; Set index to next styleRun
|
|
|
|
@4 addq.l #stStartSize,a2 ; Set pointer to next styleRun
|
|
moveq #0,d6 ; must clear for shift logic <29June89smb>
|
|
move.w styleIndex(a2),d6
|
|
;; mulu #stRecSize,d6 ; Move to next STElement
|
|
add.w d6,d6 ; replace mulu w/ shift logic <28June89smb>
|
|
move.w d6,d1 ; save <28June89smb>
|
|
lsl #3,d6 ; <28June89smb>
|
|
add.w d1,d6 ; sum <28June89smb>
|
|
|
|
cmp.w nRuns(a5),d4 ; If the new style run index is equal to
|
|
beq.s @5 ; the nRuns count, we're done!
|
|
|
|
clr.w -(sp) ; Convert font
|
|
move.w stFont(a4,d6.l),-(sp) ; into script
|
|
_Font2Script
|
|
|
|
cmp.w (sp)+,d7 ; If this new script doesn't match ours,
|
|
bne.s @5 ; then we've found the script run's end
|
|
|
|
add.w stStartSize(a2),d5 ; Note that any overflows will
|
|
sub.w startChar(a2),d5 ; automagically sort themselves out...
|
|
|
|
addq.w #1,d4 ; These 4 lines are the ugly code
|
|
cmp.w nRuns(a5),d4 ; that handle the case of the
|
|
bne.s @4 ; final style run's extra
|
|
subq.w #1,d5 ; count...
|
|
;
|
|
; We're done! Set up the return values into their registers, restore state, and return.
|
|
;
|
|
@5 movea.l gcsTemp(a6),a0
|
|
movea.w gcsIndex(a6),a1
|
|
move.w d5,d0
|
|
move.w d7,d1
|
|
|
|
movem.l (sp)+,d2-d7/a2/a4/a5
|
|
unlk a6
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE FindWord
|
|
;
|
|
; Finds a word @ D0 and returns its start and end+1 index in D0,D1
|
|
; respectively. Note cannot return selStart itself - must look to left
|
|
;
|
|
; Entry
|
|
; A3 - dereferenced handle
|
|
; D0 - current position (i.e. selStart)
|
|
; D2 - identifier of routine that called FindWord
|
|
; Exit
|
|
; D0 - word start
|
|
; D1 - word end+1
|
|
;
|
|
;----------------------------------------------------------------------
|
|
FindWord
|
|
Move.L TEFindWord,-(SP) ; call the FindWord Routine <EHB 01Oct85>
|
|
Rts
|
|
|
|
fwRegs REG d3-d5/a0-a2
|
|
|
|
XFindWord
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; Look for an overriding FindWord routine.
|
|
|
|
;; move.l d0,-(sp) ; preserve
|
|
;; move.l teWordBreak(a3),d0
|
|
;; _StripAddress ; does return in d0
|
|
;; move.l ExpandMem,a0
|
|
;; cmp.l ExpandMemRec.emCleanWordBrk(a0),d0 ; same?
|
|
;; beq.s @NoOverride ; Branch around wordBreak cleanup stuff
|
|
;; move.l (sp)+,d0 ; restore
|
|
;; bra WBOverid ; Handle via old logic if an override exists
|
|
|
|
; If we get here, there's no wordBreak override
|
|
;;@NoOverride
|
|
;; move.l (sp)+,d0 ; restore <21Dec88smb>
|
|
; test if RomanFindLine calling; if so, use old FindWord. added new identifier (see d2). <8June89smb>
|
|
;; cmpi.w #teFromFind,d2 ; only called by Roman FindLine.
|
|
;; beq WBOverid
|
|
; Roman line wrapping should use old FindWord <7Aug89smb>
|
|
;; cmpi.w #teFromRecal,d2 ; is line wrapping desired? (recalLines)
|
|
;; bne.s UseSMgrFW
|
|
; If a Roman system then use old FindWord code <19July89smb>
|
|
;; move.l ExpandMem,a0 ; <19July89smb>
|
|
;; cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; number of installed scripts <19July89smb>
|
|
;; beq WBOverid ; use old FindWord <19July89smb>
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; Redone to be compatible with applications using incorrect char breaking algorithms for Script Systems
|
|
; <1/16/90smb>
|
|
; If a non-Roman system then use new FindWord code
|
|
move.l ExpandMem,a0
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; number of installed scripts
|
|
bne.s UseSMgrFW ; use new FindWord
|
|
|
|
; Roman-only system
|
|
; test if line breaking calling; if so, use old FindWord.
|
|
cmpi.w #teFromFind,d2 ; called by Roman FindLine or teRecal?
|
|
bge WBOverid ; changed to 'bge' instead of 'bgt' <1/23/90smb>
|
|
|
|
; Otherwise, look for an overriding FindWord routine.
|
|
move.l d0,-(sp) ; preserve
|
|
move.l teWordBreak(a3),d0
|
|
_StripAddress ; does return in d0
|
|
move.l ExpandMem,a0
|
|
cmp.l ExpandMemRec.emCleanWordBrk(a0),d0 ; same?
|
|
beq.s @NoOverride ; Branch around wordBreak cleanup stuff
|
|
move.l (sp)+,d0 ; restore (and not earlier since StripAddress returns here!)
|
|
bra WBOverid ; Handle via old logic if an override exists
|
|
; If we get here, there's no wordBreak override
|
|
@NoOverride
|
|
move.l (sp)+,d0 ; restore (and not earlier since StripAddress returns here!)
|
|
|
|
UseSMgrFW
|
|
with FindWordFrame
|
|
link a6,#fwLink ; This version uses the Script Manager // <DGO 880819>
|
|
movem.l fwRegs,-(sp)
|
|
|
|
; The value of fwLeadingEdge is determined by which routine called FindWord.
|
|
; If RecalLines called (teFromRecal (16)), we want to look back to determine the word so
|
|
; leadingEdge is False, implying we hit on the trailing edge of a character.
|
|
; If RomanFindLine called (teFromFind (12)), we want to move forward so, leadingEdge is True.
|
|
; If FindLine called (teFromFind (12)), leadingEdge is arbitrary since we're on a character
|
|
; break when FindWord is called. (so I set it to True for consistency).
|
|
; If ClickExpand called (teWordSelect (4) or teWordDrag (8)), leadingEdge can be taken from
|
|
; teLftClick in the teRecord. <23May89smb>
|
|
|
|
clr.w fwLeadingEdge(a6) ; initialize (for bra to @GetSelWrap) <26Oct89smb>
|
|
cmpi.w #teFromRecal,d2 ; is it RecalLines calling? <28Aug89smb>
|
|
beq.s @GetSelWrap ; yep.
|
|
; if ClickExpand calling, get leadingEdge from teLftClick in teRecord. Use teLftClick rather than
|
|
; teLftCaret since DoSearch sets teLftClick. <28Aug89smb>
|
|
move.b teLftClick(a3),d1
|
|
|
|
; if calling for WordDrag then simulate Kanji code. <25Aug89smb>
|
|
cmpi.w #teWordDrag,d2 ; <25Aug89smb>
|
|
bne.s @StuffIt ; <25Aug89smb>
|
|
; at this point a2 is still equal to the Left Anchor for teClick so compare the offset to it <25Aug89smb>
|
|
cmp.w d0,a2 ; compare L. anchor to char offset <25Aug89smb>
|
|
scc d1 ; set leadingEdge flag accordingly <25Aug89smb>
|
|
@StuffIt
|
|
ext.w d1
|
|
move.w d1,fwLeadingEdge(a6)
|
|
@GetSelWrap
|
|
moveq #0,d1
|
|
cmpi.w #teFromRecal,d2 ; <28Aug89smb>
|
|
bne.s @3 ; bra if ClickExpand calling
|
|
not.l d1 ; RecalLines calling
|
|
@3 move.l d1,fwSelWrap(a6)
|
|
swap d2
|
|
move.w d0,d2
|
|
move.l d2,fwSavedD2(a6)
|
|
move.w d0,d5
|
|
|
|
tst.w teSize(a3)
|
|
bpl.s FWStyle2 ; If unstyled, set values specially
|
|
|
|
; First, we determine the script run to which d0 belongs. On return, a0 contains the
|
|
; address of the 1st style run in this script run, a1 contains the index of that style
|
|
; run, d0 contains the total length of all style runs comprising the script run, and
|
|
; d1 contains the script number of this script run.
|
|
|
|
FWStyle
|
|
bsr GetCurScript ; Remember copy of original d0 is in d5, which gets saved
|
|
move.w d5,d3 ; Copy of absolute input offset
|
|
sub.w startChar(a0),d3 ; Now d3 has script run offset
|
|
|
|
; If the script run offset is zero (i.e. we're at the very first character in the script run),
|
|
; then we need to determine the previous script run as well, unless we're at the very start
|
|
; of the whole TERec. <12June89smb>
|
|
bne.s SaveScriptVars
|
|
; ... at a script run boundary
|
|
tst.w d5
|
|
beq.s SaveScriptVars
|
|
; ... beyond the start of the teRec
|
|
tst.w fwLeadingEdge(a6)
|
|
bne.s SaveScriptVars
|
|
; ... and leading edge is False, so get the previous script run
|
|
move.w d5,d0 ; Set d0 to be the absolute index of
|
|
subq.w #1,d0 ; the byte *before* the current one
|
|
bsr GetCurScript ; Determine that byte's script run
|
|
move.w d5,d3 ; Copy of absolute input offset
|
|
sub.w startChar(a0),d3 ; Now d3 has script run offset
|
|
|
|
SaveScriptVars
|
|
; Now determine the values of the script run local variables and store them in the local frame.
|
|
;<12June89smb> end of mods
|
|
move.w d3,fwSROffset(a6) ; Save script run offset
|
|
move.w d0,fwSRLength(a6) ; Save script run byte length
|
|
movea.l teTextH(a3),a2 ; Handle to actual text
|
|
movea.l (a2),a2 ; Pointer to actual text
|
|
adda.w startChar(a0),a2 ; Pointer to first byte in the script run
|
|
move.l a2,fwSRTxtPtr(a6) ; Save pointer to start of script run text
|
|
move.w a1,fwSRIndx(a6) ; Save style run index
|
|
move.w startChar(a0),fwSRStrtCh(a6) ; Save abs posn of script run start
|
|
|
|
; Save the txFont in the current grafPort.
|
|
move.w styleIndex(a0),d0
|
|
bsr GetStyle
|
|
move.w stFont(a0),fwSRFont(a6)
|
|
bra.s FWDoIt
|
|
|
|
FWStyle2
|
|
; Set the variables for the unstyled , non-overridden case.
|
|
clr.w fwSRStrtCh(a6)
|
|
move.w d5,fwSROffset(a6)
|
|
move.w teLength(a3),fwSRLength(a6)
|
|
movea.l teTextH(a3),a2
|
|
move.l (a2),fwSRTxtPtr(a6)
|
|
|
|
; Save the txFont in the current grafPort for unstyled text. <1Dec88smb>
|
|
movea.l teGrafPort(a3),a0 ; GrafPtr for current GrafPort
|
|
move.w txFont(a0),fwSRFont(a6) ; Save it for now
|
|
|
|
; Clear some of the local frame variables
|
|
|
|
FWDoIt movea.l teGrafPort(a3),a0 ; GrafPtr for current GrafPort
|
|
move.l fwSRTxtPtr(a6),-(sp) ; Start address of this script run
|
|
move.w fwSRLength(a6),-(sp) ; Length of this script run
|
|
move.w fwSROffset(a6),-(sp) ; Offset within this script run
|
|
move.w fwSRFont(a6),txFont(a0) ; Set the font for this script run
|
|
move.w fwLeadingEdge(a6),-(sp) ; Correctly determined leftSide value
|
|
move.l fwSelWrap(a6),-(sp) ; Set appropriate word selection/word wrap value
|
|
pea fwOffTab(a6) ; Output buffer
|
|
_FindWord
|
|
movea.l teGrafPort(a3),a0 ; GrafPtr for current GrafPort
|
|
move.w fwSRFont(a6),txFont(a0) ; Faster to always reset than to selectively reset
|
|
;
|
|
; Now unpack the return values and set up for our return.
|
|
;
|
|
move.l fwOffTab(a6),d0
|
|
move.l d0,d1
|
|
swap d1
|
|
cmp.w d0,d1
|
|
bcc.s @3
|
|
exg d0,d1
|
|
@3 add.w fwSRStrtCh(a6),d0
|
|
add.w fwSRStrtCh(a6),d1
|
|
FWReturn
|
|
move.l fwSavedD2(a6),d2
|
|
movem.l (sp)+,fwRegs
|
|
unlk a6
|
|
rts
|
|
|
|
; forced here from RomanFindLine; mask off flag in low bit of d2 <8June89smb>
|
|
|
|
WBOverid ; here's our FindWord <EHB 01Oct85>
|
|
Swap D2 ; get constant into high word <EHB 01Oct85>
|
|
Move.W D0,D2 ; save position in low word <EHB 01Oct85>
|
|
|
|
Move.W D0,D1
|
|
Beq.S RightScan
|
|
|
|
Bsr.S LeftScan ; do left scan 1st
|
|
|
|
; Right scan, given a char code in D1, this returns the next word break >= D1
|
|
|
|
RightScan
|
|
BClr #17,D2 ; clear bit 17 (right) <EHB 01Oct85>
|
|
RS1
|
|
Cmp teLength(A3),D1 ; see if @ right edge
|
|
Bhs.S @0 ; assume found if at right edge
|
|
Move D1,A1 ; pass index
|
|
Bsr.S CallBreak
|
|
Bne.S @0
|
|
AddQ #1,D1 ; try next char
|
|
Bra.S RS1 ; <EHB 01Oct85>
|
|
@0
|
|
Rts
|
|
|
|
; Given a char location in D0, this routine returns a new word break to left of D0
|
|
|
|
LeftScan
|
|
BSet #17,D2 ; set bit 1 (left) <EHB 01Oct85>
|
|
LS1
|
|
SubQ #1,D0 ; pre decrement
|
|
Move D0,A1 ; pass index
|
|
Bsr.S CallBreak ; was it a break?
|
|
Bne.S @0 ; if so, skip town
|
|
|
|
Tst D0 ; are we done?
|
|
Beq.S @1 ; if so, skip town
|
|
Bra.S LS1 ; keep looking
|
|
@0
|
|
AddQ #1,D0 ; try next char
|
|
@1
|
|
Rts
|
|
|
|
CallBreak
|
|
movem.l d0-d1/a0-a1,-(sp) ; save regs - also save d1! <4/17/90smb>
|
|
move a1,d0 ; pass index in D0
|
|
move.l teTextH(a3),a0 ; get handle
|
|
move.l (a0),a0
|
|
move.l teWordBreak(a3),a1 ; get routine
|
|
jsr (a1) ; call routine which sets CC's
|
|
movem.l (sp)+,d0-d1/a0-a1 ; restore regs - also restore d1! <4/17/90smb>
|
|
rts
|
|
|
|
DefWordBrk
|
|
; lo16 is used by TE as a constant for clearing the high word of registers
|
|
lo16 Equ *+2
|
|
And.L #$0000FFFF,D0 ; longize it
|
|
Cmp.B #$20,0(A0,D0.L) ; see if <= $20
|
|
Sls D0 ; return if word break(SP)
|
|
Tst.B D0
|
|
Rts
|
|
endwith ; with FindWordFrame <23May89smb>
|
|
|
|
if 0 then ; unneeded
|
|
; Measures the trimmed string in [D6..D7)
|
|
|
|
TrimMeasure
|
|
MoveM.L D6-D7,-(SP) ; save regs
|
|
Bsr MeasD6D7
|
|
MoveM.L (SP)+,D6-D7 ; restore regs
|
|
Rts
|
|
endif
|
|
|
|
;formFeed
|
|
;------------------------------------------------------------------
|
|
; FindLine <18Nov88smb>
|
|
;
|
|
; This routine breaks a line on a word boundary. It uses the SMgr
|
|
; version of StyledLineBreak. It returns whether the routine broke on a word or
|
|
; character boundary, or the display width extended beyond the edge of the text.
|
|
; If the width extends beyond the edge of the text and we have multi-formats
|
|
; then we must look for the line break within the next format run.
|
|
;
|
|
; Function StyledLineBreak (textPtr:Ptr; textLen:LongInt; textStart:LongInt; textEnd:Longint;
|
|
; flags:LongInt; Var textWidth:Fixed; Var textOffset:Longint)
|
|
; :LineBreakCode;
|
|
;
|
|
; Input:
|
|
; a3: ptr to edit record
|
|
; d6: lineStart of line containing selStart
|
|
; Output:
|
|
; d0: line end after d6
|
|
; Register Usage:
|
|
; a0: current style run
|
|
; a1: nextStyleRun
|
|
; a2: textPtr
|
|
; d0,d1: scratch
|
|
; d7: mult styles flag
|
|
;------------------------------------------------------------------
|
|
|
|
FindLine Move.L TEFindLine,-(SP) ; push current FindLine routine <EHB 01Oct85>
|
|
Rts ; and call it <EHB 01Oct85>
|
|
XFindLine
|
|
|
|
FindLineRegs reg d1-d7/a0-a2
|
|
; left this test here rather than move to RecalLines since it would be duplicated 4x in RecalLines <12july89smb>
|
|
; If a Roman system then use old FindLine code: performance improvement <5May89smb>
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0) ; total number of installed scripts
|
|
beq NewRomanFindLine ; use new Roman FindLine <20>
|
|
Movem.l FindLineRegs,-(sp) ; preserve whether use new or old FindLine
|
|
with LineBreakFrame
|
|
link a6,#localFrame
|
|
; initializations
|
|
moveq #0,d7 ; flag multiple styles: init to single style
|
|
move.w d6,lineStart(a6)
|
|
move.w d6,EOLCharPosn(a6) ; start for new EOL position calculation
|
|
clr.w textPtrOffset(a6)
|
|
|
|
; set up textWidth: pixel width for displaying the text
|
|
moveq #0,d0
|
|
move.w teDestRect+right(a3),d0 ; right edge
|
|
sub.w teDestRect+left(a3),d0
|
|
swap d0 ; width is FIXED
|
|
move.l d0,width(a6) ; textWidth
|
|
|
|
; textLength: is necessary for CR test and unstyled text
|
|
moveq #0,d1 ; longize
|
|
move.w teLength(a3),d1 ; doc length
|
|
sub.w d6,d1 ; adjusted to lineStart position
|
|
move.l d1,length(a6)
|
|
|
|
; textPtr: pointer to current lineStart position.
|
|
movea.l teTextH(a3),a2 ; handle to start of text
|
|
movea.l (a2),a2 ; dereference
|
|
add.w d6,a2 ; begin search for CR here <17Nov88smb>
|
|
|
|
; if we are in CR only mode, just search for a CR
|
|
;; addq.w #1,d1 ; incr for initial decr below in dbeq test <17Nov88smb> <16>
|
|
|
|
tst.b teCROnly(a3)
|
|
bge.s @StyleCheck ; changed from beq to bge <2May89smb>
|
|
; notice: CCs are set to not equal AT THIS POINT based on test of CROnly.
|
|
bra.s @CheckLength ; zero check
|
|
@CRLoop
|
|
move.b (a2)+,d0 ; is it a CR? changed to byte <28Jan89smb>
|
|
Bsr TEEOLHook
|
|
@CheckLength
|
|
dbeq d1,@CRLoop
|
|
beq.s @GotCR
|
|
move.w teLength(a3),d0 ; return end of text if CR not found
|
|
bra @finis ; <17Mar89smb>
|
|
|
|
@GotCR
|
|
move.w teLength(a3),d0 ; doc length <15Mar89smb>
|
|
sub.l d1,d0 ; - characters left
|
|
;; addq #1,d0 ; go one beyond the CR <15Mar89smb> <16>
|
|
bra @finis ; <17Mar89smb>
|
|
; End of CR check
|
|
|
|
@StyleCheck
|
|
;; subq.w #1,d1 ; decr from CR test above <17Nov88smb> <16>
|
|
move.l a2,textPtr(a6)
|
|
move.l a2,initlTextPtr(a6)
|
|
|
|
; test for new style edit record
|
|
tst.w teSize(a3) ; check style flag
|
|
bpl @noStyle ; don't set style: old-style edit record
|
|
|
|
; test for single or multiple format runs in the text
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec
|
|
movea.l (a1),a1
|
|
cmpi.w #1,nRuns(a1)
|
|
beq.s @OneStyle ; bra if one style
|
|
|
|
moveq #1,d7 ; flag multiple styles to process
|
|
@OneStyle
|
|
moveq #0,d0
|
|
move.w d6,d0
|
|
bsr GetCurStyle ; a0: ptr to current style, d0: style index
|
|
addq.w #1,d0 ; index returned is 0 based but nRuns isn't
|
|
move.w d0,styleIndex(a6)
|
|
; test for last style run <5Dec88smb>
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec <5Dec88smb>
|
|
movea.l (a1),a1 ; <5Dec88smb>
|
|
cmp.w nRuns(a1),d0 ; <5Dec88smb>
|
|
bcs.s @StyleLoop ; <5Dec88smb> <26June89smb> made unsigned
|
|
moveq #0,d7 ; on last style run <5Dec88smb>
|
|
|
|
; Only one run so set up real length of run. The last entry in the styleRun table has
|
|
; a startChar posn equal to teLength+1. Must subtract the extra 1 to get the real length
|
|
; of the run. <28Nov88smb>
|
|
|
|
@StyleLoop
|
|
lea stStartSize(a0),a1
|
|
move.l a0,currStyle(a6) ; save for StyledLineBreak result test
|
|
move.l a1,nextStyle(a6)
|
|
Bsr SetStyle ; set grafport style from current style in a0
|
|
|
|
; Set up textPtr & length to the beginning of the script run. Call GetCurScript which returns
|
|
; the address of 1st style run in the script run in a0 and the length in d0 of all style runs
|
|
; comprising this script run. The script run may begin prior to this lineStart so must
|
|
; adjust the textPtr and length accordingly. Also use the script run to determine the offset
|
|
; value, on input, to StyledLineBreak. This value tells the routine if this is the first script
|
|
; run on the line, which affects the returned result and offset.
|
|
|
|
move.w d6,d0
|
|
bsr GetCurScript
|
|
; returns d0 = total length of script run, a0 = addr of first style run in script run
|
|
move.l #0,offset(a6) ; assume it's not the 1st script run <12June89smb>
|
|
|
|
; pin beginning of script run to beginning of line
|
|
move.w startChar(a0),d1 ; 1st style run of script run
|
|
cmp.w lineStart(a6),d1
|
|
blo.s @AdjustLength ; bra if textPtr ok
|
|
beq.s @AdjustOffset
|
|
sub.w lineStart(a6),d1 ; offset from lineStart to beginning of script run
|
|
move.l initlTextPtr(a6),a0 ; initial ptr at beginning of line
|
|
add.w d1,a0 ; adjust to beginning of script run <21Mar89smb>
|
|
move.l a0,textPtr(a6)
|
|
move.w d1,textPtrOffset(a6) ; need for adjusting textStart and End
|
|
bra.s @LengthOK
|
|
|
|
@AdjustLength
|
|
move.w lineStart(a6),d2
|
|
sub.w d1,d2 ; distance from start of script run to lineStart
|
|
sub.w d2,d0 ; adjust to current line start
|
|
@AdjustOffset
|
|
; Set the offset parameter to non-zero since this is the 1st script run on the line.
|
|
move.l #1,offset(a6) ; necc for corrections to SMgr routine <8June89smb>
|
|
@LengthOK
|
|
; not the last run yet so use real length of run
|
|
;; replaced next 3 lines <17July89smb>
|
|
;; move.w d0,-(sp) ; longize - (can't use 'ext' since SMgr expects
|
|
;; moveq #0,d0 ; 0s in the high word!)
|
|
;; move.w (sp)+,d0
|
|
swap d0 ; <17July89smb>
|
|
clr.w d0 ; clear high word for SMgr call <17July89smb>
|
|
swap d0 ; restore <17July89smb>
|
|
move.l d0,length(a6)
|
|
|
|
; set up textStart (beginning of style run) and textEnd (end of style run) as offsets from textPtr
|
|
; get the textStart, offset from textPtr
|
|
moveq #0,d1 ; longize
|
|
move.l currStyle(a6),a0
|
|
move.w startChar(a0),d1 ; get start of this format run
|
|
cmp.w lineStart(a6),d1 ; must pin to this LineStart!
|
|
|
|
bhs.s @UseStyleStart ; bra if should use start of style run
|
|
move.w d6,d1 ; use beginning of line
|
|
|
|
@UseStyleStart
|
|
move.l d1,start(a6)
|
|
; offset start and end from current textPtr posn
|
|
move.w lineStart(a6),d0
|
|
add.w textPtrOffset(a6),d0
|
|
sub.l d0,start(a6) ; adjust textStart to textPtr's offset
|
|
|
|
; get the textEnd, offset from textPtr
|
|
move.w stStartSize(a0),d1 ; end of style run
|
|
sub.l d0,d1
|
|
move.l d1,end(a6) ; adjust textEnd to end of format run
|
|
tst.w d7 ; test for one or last style
|
|
bne.s @SetUp ; multiple styles so can use next style run for length
|
|
sub.l #1,end(a6)
|
|
bra.s @SetUp
|
|
|
|
@noStyle
|
|
move.w #0,currStyle(a6) ; needed for a termination test
|
|
; set up textStart and textEnd for non-styled text
|
|
move.l #0,start(a6) ; absolute posn from beginning of text
|
|
move.l length(a6),end(a6)
|
|
; Set the offset parameter to non-zero since this is the 1st script run on the line (AND THE ONLY ONE!) <15Dec89smb>.
|
|
move.l #1,offset(a6) ; necc for corrections to SMgr routine <15Dec89smb>
|
|
|
|
; call StyledLineBreak
|
|
@SetUp
|
|
move.w #0,-(sp) ; allocate return
|
|
move.l textPtr(a6),-(sp) ; textPtr
|
|
move.l length(a6),-(sp) ; textLength
|
|
move.l start(a6),-(sp) ; textStart
|
|
move.l end(a6),-(sp) ; textEnd
|
|
move.l #0,-(sp) ; no slop
|
|
pea width(a6) ; var textWidth: pass @width
|
|
pea offset(a6) ; var textOffset: pass @offset
|
|
_StyledLineBreak ; call SMgr
|
|
|
|
clr.w d1
|
|
move.b (sp)+,d1 ; word, char, or overflow break?
|
|
cmpi.w #smBreakOverflow,d1
|
|
beq.s @noLineBreak ; overflow!
|
|
bra.s @FindLineDone ; broke on a char or word boundary in this fmt run (or
|
|
; possibly the previous one for word breaks)
|
|
@noLineBreak
|
|
; if the routine returns an overflow break (the display rectangle width was > the text width)
|
|
; then the text width is returned in width(a6). If another style exists, call StyledLineBreak
|
|
; again with the width returned.
|
|
|
|
tst.w d7
|
|
beq.s @FindLineDone ; only one or last style to process
|
|
|
|
; test if we just processed the second to last format run
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec <24Nov88smb>
|
|
movea.l (a1),a1
|
|
move.w styleIndex(a6),d0
|
|
addq.w #1,d0 ; for next style run
|
|
move.w d0,styleIndex(a6)
|
|
cmp.w nRuns(a1),d0 ; at last style run? <24Nov88smb>
|
|
bne.s @DoFmtRun
|
|
|
|
; last format run: last entry of style run table is a dummy entry = teLength + 1
|
|
moveq #0,d7 ; flag no more runs after this one
|
|
; special test for case of dummy RUN of 1 char, which is 1 longer than the teLength, as found
|
|
; in KanjiTalk. <9June89smb> test here to save some other processing.
|
|
move.l nextStyle(a6),a0
|
|
move.w stStartSize(a0),d6
|
|
sub.w startChar(a0),d6
|
|
subq.w #1,d6
|
|
beq.s @FindLineDone
|
|
|
|
@DoFmtRun
|
|
; use the next format to continue searching for a line break position.
|
|
; accumulate style offsets on line for line end
|
|
moveq #0,d0
|
|
move.w offset+2(a6),d1
|
|
sub.l start(a6),d1 ; get the offset relative to the text start
|
|
add.w d1,EOLCharPosn(a6)
|
|
move.l nextStyle(a6),a0
|
|
lea stStartSize(a0),a1
|
|
move.w startChar(a0),d6
|
|
bra @StyleLoop
|
|
|
|
@FindLineDone
|
|
; return d0 = length
|
|
moveq #0,d0
|
|
move.w offset+2(a6),d0 ; offset mod 64K
|
|
sub.l start(a6),d0 ; get the offset relative to the text start
|
|
add.w EOLCharPosn(a6),d0 ; absolute position
|
|
@finis
|
|
unlk a6
|
|
movem.l (sp)+,FindLineRegs ; restore
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
; PROCEDURE NewRomanFindLine
|
|
;
|
|
; Entry
|
|
; d6 start of line search assumed to be at 1st word?
|
|
; a3 dereferenced handle
|
|
; Exits
|
|
; d0 with line end after d6
|
|
; Register usage
|
|
; d4 width to measure
|
|
; d7 flag to indicate multiple styles in record
|
|
;----------------------------------------------------------------------
|
|
NewRomanFindLine
|
|
Movem.l FindLineRegs,-(sp) ; preserve whether use new or old FindLine
|
|
with LineBreakFrame
|
|
link a6,#localFrame
|
|
|
|
; textLength: is necessary for CR test and unstyled text
|
|
moveq #0,d1 ; longize
|
|
move.w teLength(a3),d1 ; doc length
|
|
sub.w d6,d1 ; adjusted to lineStart position
|
|
move.l d1,length(a6)
|
|
|
|
; textPtr: pointer to current lineStart position.
|
|
movea.l teTextH(a3),a2 ; handle to start of text
|
|
movea.l (a2),a2 ; dereference
|
|
add.w d6,a2 ; begin search for CR here
|
|
|
|
tst.b teCROnly(a3) ; do we only want to break on CRs?
|
|
bne @CROnlyMode ; yup.
|
|
|
|
; more initializations
|
|
move.l a2,textPtr(a6)
|
|
moveq #0,d7 ; flag multiple styles: init to single style
|
|
move.w d6,lineStart(a6)
|
|
move.w d6,EOLCharPosn(a6) ; start for new EOL position calculation
|
|
|
|
; set up textWidth: pixel width for displaying the text
|
|
moveq #0,d4
|
|
move.w teDestRect+right(a3),d4 ; right edge
|
|
sub.w teDestRect+left(a3),d4
|
|
;; subq #1,d4 ; reduce for caret indent <28>
|
|
move.l d4,width(a6) ; textWidth
|
|
|
|
; test for new style edit record
|
|
tst.w teSize(a3) ; check style flag
|
|
bpl @CallP2C ; old-style edit record
|
|
|
|
; test for single or multiple format runs in the text
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec
|
|
movea.l (a1),a1
|
|
cmpi.w #1,nRuns(a1)
|
|
beq.s @DoStyle ; bra if one style
|
|
|
|
moveq #1,d7 ; flag multiple styles to process
|
|
@DoStyle
|
|
moveq #0,d0
|
|
move.w d6,d0
|
|
bsr GetCurStyle ; a0: ptr to current style, d0: style index
|
|
addq.w #1,d0 ; index returned is 0 based but nRuns isn't
|
|
move.w d0,styleIndex(a6)
|
|
; test for last style run
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec
|
|
movea.l (a1),a1
|
|
cmp.w nRuns(a1),d0 ; is styleIndex < nRuns?
|
|
bcs.s @StyleLoop ; yes
|
|
moveq #0,d7 ; on last style run
|
|
|
|
; only one run so set up real length of run. The last entry in the styleRun table has
|
|
; a startChar posn equal to teLength+1. Must subtract the extra 1 to get the real length
|
|
; of the run.
|
|
|
|
@StyleLoop
|
|
move.l a0,currStyle(a6)
|
|
lea stStartSize(a0),a1
|
|
move.l a1,nextStyle(a6)
|
|
Bsr SetStyle ; set grafport style from current style in a0
|
|
|
|
; set up textStart (beginning of style run) and pin to lineStart
|
|
moveq #0,d1 ; longize
|
|
move.l currStyle(a6),a0
|
|
move.w startChar(a0),d1 ; get start of this format run
|
|
cmp.w lineStart(a6),d1 ; must pin to this LineStart!
|
|
bhs.s @GetLength ; bra if should use start of style run
|
|
move.w d6,d1 ; use beginning of line
|
|
|
|
@GetLength
|
|
; get the length
|
|
moveq #0,d0 ; longize
|
|
move.w stStartSize(a0),d0 ; end of style run
|
|
sub.w d1,d0 ; minus the style start
|
|
move.l d0,length(a6)
|
|
; test for one or last style to adjust length
|
|
tst.w d7
|
|
bne.s @CallP2C ; multiple styles so can use next style run for length
|
|
sub.l #1,length(a6)
|
|
;-----------------------------------------------
|
|
@CallP2C
|
|
; call Pixel2Char
|
|
move.l textPtr(a6),a0 ; textPtr
|
|
move.w length+2(a6),d0 ; textLength (style run length)
|
|
move.w width+2(a6),d1 ; width
|
|
clr.l d2 ; no slop
|
|
bsr TEHitTestHook ; call Pixel2Char
|
|
; returns:
|
|
; d0 (low word) pixel width to character offset in block
|
|
; (high word) boolean = TRUE (0001) if offset corresponding to
|
|
; the given pixel width was found (ONLY when hook is used!)
|
|
; d1.w character offset
|
|
; d2.w flagged (0001) if hit on leading edge of char (but not used here)
|
|
|
|
move.w d1,d3 ; save char offset until after CR test
|
|
sub.w d0,d4 ; update pixel width
|
|
bls.s @CRTest ; got a hit (width <= 0)
|
|
|
|
; if at the last style, and pixel width > 0, and the TEHitTestHook is replaced, then
|
|
; must check the high word of d0 to see if we REALLY got a hit! <2/16/90smb>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l HitTestHook(a0),a0
|
|
pea Pixel2Char
|
|
cmpa.l (sp)+,a0
|
|
beq.s @NotAHit
|
|
; we've been hooked out so test per the old interface specs for a hit.
|
|
swap d0
|
|
tst.b d0
|
|
bne.s @CRTest
|
|
;----------------------------------------------------------------------
|
|
@NotAHit
|
|
; test for CR
|
|
move.l textPtr(a6),a2
|
|
move.w length+2(a6),d1
|
|
bsr TestForCR
|
|
tst.b d0 ; did we find a CR?
|
|
beq.s @NoCR ; no, just measure
|
|
; found a CR
|
|
move.w length+2(a6),d0 ; style run length
|
|
sub.l d1,d0 ; - characters left (should make this .w) <27>x
|
|
add.w EOLCharPosn(a6),d0 ; new break posn
|
|
bra @finis
|
|
@NoCR
|
|
move.l d4,width(a6) ; and save as long.
|
|
add.w d3,EOLCharPosn(a6) ; update char offset
|
|
tst.w d7
|
|
beq @setResult ; only one style or last style to process
|
|
|
|
; test if we just processed the second to last format run
|
|
movea.l teStylesH(a3),a1 ; handle to teStyleRec
|
|
movea.l (a1),a1
|
|
move.w styleIndex(a6),d0
|
|
addq.w #1,d0 ; for next style run
|
|
move.w d0,styleIndex(a6)
|
|
cmp.w nRuns(a1),d0 ; at last style run?
|
|
bne.s @DoNextRun
|
|
|
|
; last format run: last entry of style run table is a dummy entry = teLength + 1
|
|
moveq #0,d7 ; flag no more runs after this one
|
|
; special test for case of dummy RUN of 1 char, which is 1 longer than the teLength, as found
|
|
; in KanjiTalk. Test here to save some other processing.
|
|
move.l nextStyle(a6),a0
|
|
move.w stStartSize(a0),d6
|
|
sub.w startChar(a0),d6
|
|
subq.w #1,d6
|
|
; MathCad creates a 0 length style run at the end of the StyleRun array of teLength->teLength, <24>
|
|
; instead of teLength->teLength+1, so we're testing for their bug here! <24>
|
|
ble @setResult ; problem of 0 length style run in MathCad <24>
|
|
;; beq @setResult ; change branching condition <24>
|
|
|
|
@DoNextRun
|
|
; use the next format to continue searching for a line break position.
|
|
; accumulate style offsets on line for line end
|
|
|
|
move.l nextStyle(a6),a0
|
|
move.w startChar(a0),d6
|
|
moveq #0,d0 ; clear high word before add <30>
|
|
move.w length+2(a6),d0
|
|
add.l d0,textPtr(a6) ; update textPtr to the next style run
|
|
bra @StyleLoop
|
|
|
|
;----------------------------------------------------------------------
|
|
; on the way out now…
|
|
;----------------------------------------------------------------------
|
|
|
|
@CRTest
|
|
; test for CR
|
|
move.l textPtr(a6),a2
|
|
move.w d3,d1 ; offset of char hit is length to use when searching for CR
|
|
bsr TestForCR
|
|
tst.b d0 ; did we find a CR?
|
|
bne.s @GotCR ; yes, done earlier than hit!
|
|
|
|
; no CR found, so use char offset but back up to word boundary
|
|
add.w d3,EOLCharPosn(a6) ; update char offset
|
|
move.w EOLCharPosn(a6),d0
|
|
; Must test if at a blank since FindWord will backup before testing if not @ posn. 0. <23>
|
|
; the problem this introduces is that we will not use an appications hook to teWordBreak if
|
|
; there is a blank or non-graphic character in this position.
|
|
tst.b d0 ; <23>
|
|
beq.s @CallFW ; <23>
|
|
@WrdBrkLoop
|
|
move.w d0,a1 ; CallBreak wants offset here <23>
|
|
bsr CallBreak ; calls Roman wordbreak hooked routine <23>
|
|
beq.s @CallFW ; CCs set if char<=$20 & d0 = wordstart <23>
|
|
; point past the break character and look for another break character until at EOD <23>
|
|
cmp.w teLength(a3),d0 ; is this break character at the EOD <23>
|
|
beq @HaveWordSt ; yes, so done <23>
|
|
; check if the break character is a CR! don't look ahead if so! <26>
|
|
movea.l teTextH(a3),a2 ; handle to start of text <26>
|
|
movea.l (a2),a2 ; dereference <26>
|
|
move.w d0,-(sp) ; save wordStart <26>
|
|
addq.w #1,(sp) ; incr beyond this break character <26>
|
|
move.b 0(a2,d0.w),d0 ; fetch the char to test <26>
|
|
Bsr TEEOLHook ; <26>
|
|
movem.w (sp)+,d0 ; don't change CCs <26>
|
|
; now bra based on result of TEEOLHook <26>
|
|
beq.s @finis ; found a CR so done <26>
|
|
; is a break char but not a CR so, try again <26>
|
|
;; addq #1,d0 ; no, so look ahead for next break character <23><26>
|
|
bra.s @WrdBrkLoop ; <23>
|
|
|
|
@CallFW
|
|
MoveQ #teFromFind,d2 ; say findLine is calling
|
|
bsr FindWord ; word start in d0, word end in d1
|
|
@HaveWordSt
|
|
|
|
; must pin word start to lineStart for the case that it breaks across a word
|
|
cmp.w lineStart(a6),d0 ; d6 changes for styled so use actual lineStart <23>
|
|
bls @setResult
|
|
; test for case of 0 returned if line has no blanks
|
|
; (XX) these two lines seem to be redundant!!! (XX)
|
|
tst.w d0 ; non-zero word start is ok
|
|
bne.s @finis
|
|
move.w EOLCharPosn(a6),d0 ; assume P2C result is less than word end found
|
|
cmp.w d1,d0 ; use smaller of two
|
|
bls @finis ; use P2C result
|
|
; (XX) we should never come here! (XX)
|
|
move.w d1,d0 ; use word end found
|
|
bra @finis
|
|
|
|
@GotCR
|
|
move.w d3,d0 ; style run length
|
|
sub.l d1,d0 ; - characters left (should make this .w) <27>x
|
|
add.w EOLCharPosn(a6),d0 ; new break posn
|
|
bra @finis
|
|
|
|
;-----------------------------------------------
|
|
@CROnlyMode
|
|
; since we are in CR only mode, just search for a CR
|
|
bsr TestForCR
|
|
tst.b d0 ; did we find a CR?
|
|
bne.s @FoundCR ; yes
|
|
move.w teLength(a3),d0 ; no, return end of text
|
|
bra @finis
|
|
@FoundCR
|
|
move.w teLength(a3),d0 ; doc length <15Mar89smb>
|
|
sub.l d1,d0 ; - characters left
|
|
bra @finis
|
|
; End of CR check
|
|
;-----------------------------------------------
|
|
@setResult move.w EOLCharPosn(a6),d0 ; want result in d0
|
|
@finis
|
|
unlk a6
|
|
movem.l (sp)+,FindLineRegs ; restore
|
|
rts
|
|
endWith
|
|
|
|
;----------------------------------------------------------------------
|
|
; PROCEDURE TestForCR
|
|
; Called by NewRomanFindLine to search for a carriage return.
|
|
; Entry
|
|
; d1.w = length to search
|
|
; a2.l = text pointer
|
|
; Exit
|
|
; d0.b = TRUE (FF) if CR found
|
|
; d1.w = characters left
|
|
; Uses d0,d1
|
|
;----------------------------------------------------------------------
|
|
TestForCR
|
|
tst.w d1 ; is the initial length 0?
|
|
beq.s NoCR
|
|
; notice: CCs are set to NOT EQUAL at this point.
|
|
bra.s @TestLength
|
|
@CRLoop
|
|
move.b (a2)+,d0 ; is it a CR? changed to byte
|
|
Bsr TEEOLHook
|
|
@TestLength
|
|
dbeq d1,@CRLoop
|
|
beq.s GotCR
|
|
bra NoCR ; no CR in this run, just measure
|
|
NoCR
|
|
sf d0 ; return F
|
|
rts
|
|
GotCR
|
|
st d0 ; return T
|
|
rts
|
|
;formfeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ReCalLines
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Recalibrates the line start array and sets dispStart/dispEnd to
|
|
; correct redraw spot. Starting with the selection, it figures out
|
|
; which line the selection is on. Then it recalibrates the line starts
|
|
; from there until the delta in D7 is consumed (the word wrap has
|
|
; petered out). It returns D2 and D4 to the redraw start and end.
|
|
; (It should return D3 instead of D2, but for compatibility it uses
|
|
; D2).
|
|
;
|
|
; Entry
|
|
; A4 points to handle
|
|
; A3 points to dereferenced TE object
|
|
; D7 contains delta in change = oldLength-newLength
|
|
; teLength(a3) reflects the new length (at least for deletion)
|
|
; Exit
|
|
; dispStart(D2) now set to redraw start
|
|
; dispEnd(D4) set to redraw end
|
|
; Uses
|
|
; d2 redraw start position (aka savedD2)
|
|
; d3 initialized to word boundary at selStart(a3)
|
|
; d4 redraw end position (aka savedD4)
|
|
; d5 for handle size
|
|
; a2 ptr to current lineStarts(a3) position
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ** <C105/3Sep86/MBK> ** Stages 2 and 3 of Recal were totally rewritten for
|
|
; speed. I decided the insert and delete cases were
|
|
; different enough to justify handling them separately.
|
|
;
|
|
ReCalLines
|
|
Move.L TERecal,-(SP)
|
|
Rts
|
|
XReCalLines
|
|
ReCalLinesRegs reg D3/D5-D6/A2
|
|
Link A6,#RecalLink
|
|
movem.l ReCalLinesRegs,-(SP) ; save regs
|
|
|
|
; initialize
|
|
Move.W teNLines(A3),oldNLines(A6) ; save old # of lines ** <C229/28oct86/MBK> **
|
|
Clr.W teNLines(A3) ; prime nLines:=0
|
|
Clr.W savedD2(A6) ; default redraw beginning
|
|
Move teLength(A3),savedD4(A6); default redraw end
|
|
|
|
Tst.W teLength(A3) ; any text?
|
|
Beq ClrLineSts ; <19Mar89smb> if not, nothing to recal
|
|
;; Beq.S ReCalDone ; if not, nothing to recal <C971/RWW102887>NO
|
|
|
|
Lea teLines(A3),A2 ; point to line starts
|
|
MoveQ #teFromRecal,D2 ; say ReCalLines is calling <EHB 01Oct85>
|
|
Move teSelStart(A3),D0 ; put start position in D0 <EHB 01Oct85>
|
|
Bsr FindWord ; get word around selstart for comparison <C971/RWW102887>NO
|
|
Move D0,D3 ; returned word boundary
|
|
|
|
; D3 contains the start point to recal from, so find the line containing D3
|
|
|
|
InitLineStLoop
|
|
Move (A2)+,D6 ; i(start):=lineStarts[line]
|
|
Move D6,savedD2(A6) ; save away as default redraw start
|
|
|
|
Cmp (A2),D3 ; while selWord<lineStarts[line+1]
|
|
Blo.S FoundLineBounds ; if inclusive (d3 contained between savedD2 & a2)
|
|
Beq.S AtNextLineStart ; if at next line start
|
|
|
|
AddQ #1,teNLines(A3) ; one more line, keep looking for
|
|
Bra.S InitLineStLoop ; line containing selStart(D3)
|
|
|
|
; The redraw start is in savedD2, which reflects the lineStart of d3.
|
|
;------------------------------------------------
|
|
AtNextLineStart
|
|
; d3 is on the boundary of the next lineStart
|
|
Bsr FindLine ; get line end after D6 <C971/RWW102887>NO
|
|
Cmp D0,D3 ; did the line break change? (ie - different from current a2)
|
|
Bne.S DrawWholeLine ; if so, must redraw whole thing<C971/RWW102887>NO
|
|
Move D3,savedD2(A6) ; "next" line OK if at beginning
|
|
Bra.S TestRedraw ; <C971/RWW102887>NO
|
|
|
|
;------------------------------------------------
|
|
FoundLineBounds
|
|
; d3 is contained between the lineStarts of this line
|
|
Bsr FindLine ; get line end after D6 <C971/RWW102887>NO
|
|
Cmp D0,D3 ; did the line break change? (is d3 beyond this line end?)
|
|
Bhs.S DrawWholeLine ; if so, must redraw whole thing
|
|
TestRedraw ; <EHB 05-Nov-85>
|
|
Tst.B WordRedraw ; should we redraw the whole word? <EHB 31-Oct-85>
|
|
Bgt.S DrawWholeLine ; => yes, app wants whole word <EHB 31-Oct-85>
|
|
Blt.S DoRecal ; => app wants whole line <EHB 01-Nov-85>
|
|
|
|
; final determination of redraw start position
|
|
Move teSelStart(A3),D3 ; reset d3 from word boundary to selStart
|
|
DrawWholeLine
|
|
|
|
IF forLocalizability THEN ; <40-YDS-2/5/92>
|
|
Cmp.w #teForceLeft,teJust(A3) ; are we forcing left ?
|
|
Beq.S @1 ; if so, skip the TESysJust test.
|
|
ENDIF
|
|
|
|
Tst.W teJust(A3) ; see what format: for right or
|
|
Bne.S DoRecal ; centered, must use linestart (not selStart)
|
|
|
|
Tst.W TESysJust ; check text direction ** <C105/14aug86/MBK> **
|
|
Bne.S DoRecal ; not left ** <C105/14aug86/MBK> **
|
|
|
|
; Special case: redraw line didn't work because FoundLineBounds jumped here w/o checking the redraw flag.
|
|
@1 Tst.B WordRedraw ; should we redraw the whole word? ** <C454/21nov86/MBK> **
|
|
Blt.S DoRecal ; => app wants whole line ** <C454/21nov86/MBK> ** <19>
|
|
; restored to original state <19>
|
|
;; Bne.S DoRecal ; => app wants whole line for double-byte as well! <12/14/88smb><19>
|
|
|
|
; if here, then teJust = teSysJust = 0 AND wordRedraw = 0 or 1.
|
|
Move D3,savedD2(A6) ; return word start-1
|
|
Beq.S DoRecal
|
|
; must call DoubleByte here to backup to the correct position <25>
|
|
subq #1,savedD2(a6)
|
|
tst.b wordRedraw ; if Roman then don't call DoubleByte <25>
|
|
beq.s DoRecal ; <25>
|
|
movem.l d0-d4/d6/d7/a2,-(sp) ; save regs across call (better safe than sorry!) <25>
|
|
move.w d3,d6 ; DoubleByte wants offset here <25>
|
|
move.w #-1,d3 ; incremental direction to move <25>
|
|
bsr DoubleByte ; <25>
|
|
move.w d6,savedD2(a6) ; <25>
|
|
movem.l (sp)+,d0-d4/d6/d7/a2 ; <25>
|
|
;; Bra.S DoRecal <16> unnecessary
|
|
|
|
DoRecal
|
|
; d3 reflects the start position for the recalibration of the line
|
|
Move.W D0,D3 ; save next line start in D3
|
|
|
|
;------------------------------------------------
|
|
If &TYPE('&RWWDebug') <> 'UNDEFINED' Then
|
|
Tst.W D7 ; insertion or deletion?
|
|
Ble.S @0
|
|
|
|
; If some characters on a line are replaced by (a fewer number of) CRs
|
|
; the deletion algorithm does not work correctly because it is not
|
|
; prepared to add new lines. So now I just call the insertion algorithm
|
|
; except for this special case, when character(s) at the beginning of
|
|
; the line are being deleted (the insertion algoritm doesn't work
|
|
; in this case). Maybe someday this whole recalibration thing will
|
|
; get rewritten!
|
|
; Changed this once again. Selstart will equal selEnd whenever TEDelete was called.
|
|
; Only call InsertRecal if this was an insertion that was shorter than the selection.
|
|
|
|
Move.W teSelStart(A3),D0
|
|
Cmp.W teSelEnd(A3),D0
|
|
Bne.S @0
|
|
|
|
Bsr.S DeleteRecal ; recal for deletions
|
|
Bra.S ReCalDone
|
|
|
|
EndIf ; <PMAB381/RWW020488>
|
|
;------------------------------------------------
|
|
|
|
@0
|
|
IF &TYPE('&RWWDebug') = 'UNDEFINED' THEN
|
|
Bsr.s InsertRecal ; recal for insertions
|
|
ELSE
|
|
Bsr InsertRecal ; recal for insertions
|
|
ENDIF
|
|
|
|
Bra.s ReCalDone ; <19Mar89smb>
|
|
ClrLineSts ; <19Mar89smb> clear first two words of lineStarts array
|
|
move.l #0,teLines(a3)
|
|
;------------------------------------------------
|
|
|
|
ReCalDone Bsr SetLineHite ; reset line heights ** <C229/28oct86/MBK> **
|
|
Move.W savedD4(A6),D4 ; return start and end ** MBK 6/18/86 **
|
|
Move.W savedD2(A6),D2 ; ** MBK 6/18/86 **
|
|
|
|
; ** <C971/RWW102287> Rudy D. memorial lineStarts hack.
|
|
; Force TERecord to be proper length.
|
|
cutBackSlop Equ 8
|
|
|
|
Move.L A4,A0 ; How fat is TERecord now? <C971/RWW102987>
|
|
_GetHandleSize ; <C971/RWW102987>
|
|
Tst.L D0 ; check for error <C971/RWW102987>
|
|
Bpl.S @2
|
|
_SysError ; fly away if system error <C971/RWW102987>
|
|
|
|
@2 Sub.L #teRecSize,D0 ; lose header <C971/RWW102987>
|
|
LsR.L #1,D0 ; account for word sized table <C971/RWW102987>
|
|
And.L #$7FFF,D0 ; gotta be fewer than 32K lines <C971/RWW102987>
|
|
Sub.W teNLines(A3),D0 ; blow off cutback <C971/RWW102987>
|
|
Bz.S @1 ; didn't change at all <C971/RWW102987>
|
|
Bmi.S @1 ; got larger. Munger handled it <C971/RWW102987>
|
|
Cmp.W #cutBackSlop,D0 ; is difference less than slop <C971/RWW102987>
|
|
Blo.S @1 ; Yes, so don't bother memory mgr <C971/RWW102987>
|
|
|
|
MoveQ #0,D0 ; Gotta talk longs, here <PMAB345/C990/RWW121687>
|
|
Move.W teNLines(A3),D0 ; Fetch number of lines <PMAB345/C990/RWW121687>
|
|
|
|
LsL.L #1,D0 ; account for word offset <C971/RWW102287>
|
|
Add.L #teRecSize,D0 ; Add in rest of record <C971/RWW102287>
|
|
Move.L A4,A0 ; TEHandle is what we're resizing <C971/RWW102287>
|
|
Bsr MySetHandleSize ; Go do it <C971/RWW102287>
|
|
@1 ; <C971/RWW102287>
|
|
|
|
MoveM.L (SP)+,ReCalLinesRegs ; restore regs
|
|
Unlk A6
|
|
|
|
Rts ; see you later
|
|
|
|
;formFeed
|
|
;------------------------------------------------------------------
|
|
; PROCEDURE InsertRecal
|
|
;
|
|
; Only called from ReCalLines.
|
|
;
|
|
; Entry
|
|
; d3 line start of next line
|
|
; d6 lineStart(a3) of line containing savedD2(a6) (redraw start position)
|
|
; d7 delta = oldLength-newLength
|
|
; a2 line starts array
|
|
; savedD2(a6) redraw start position
|
|
;
|
|
; Uses
|
|
; d4 loop terminator for determining next line end; initialized to selEnd
|
|
; d5 lineStart counter
|
|
; ** <C105/3Sep86/MBK> ** Stages 2 and 3 for insertion only
|
|
;------------------------------------------------------------------
|
|
InsertRecal
|
|
MoveM.L D2/D4,-(SP) ; save stuff
|
|
|
|
MoveQ #0,D5 ; size of temp line start array
|
|
Move.W teSelEnd(A3),D4
|
|
|
|
If &TYPE('&RWWDebug') = 'UNDEFINED' Then
|
|
Tst.W D7 ; Only do "subtraction" if negative <PMAB381/RWW020488>
|
|
Bpl.S @PosDeltaLength ; <PMAB381/RWW020488>
|
|
EndIf
|
|
|
|
Sub.W D7,D4 ; new terminator: selEnd + delta
|
|
@PosDeltaLength
|
|
|
|
; ** <C393/10nov86/MBK> ** MyNewHandle unlocks the TEHandle for memory allocation and
|
|
; resets the A3 ptr, so the A2 ptr must also be reset
|
|
Sub.L A3,A2 ; save A2 as an offset ** <C393/10nov86/MBK> **
|
|
Move.L #defBufSize,D0 ; don't want to reset too often ** <C381/6nov86/MBK> **
|
|
Move.L D0,D2 ; save initial handle size
|
|
Bsr MyNewHandle ; temp handle for line starts ** <C381/7nov86/MBK> **
|
|
_HLock ; play it safe
|
|
Move.L (A0),A1 ; save ptr
|
|
Move.L A0,startHndl(A6) ; save handle
|
|
|
|
Add.L A3,A2 ; restore A2 as a ptr ** <C393/10nov86/MBK> **
|
|
Move.L A2,savePtr(A6) ; current line start ptr
|
|
|
|
;------------------------------------------------
|
|
iLineLoop
|
|
|
|
; If the width of a single character > the width of the window, Recal keeps
|
|
; finding the same line (line 1) forever. If this happens, don't keep trying
|
|
; to wrap, just advance to the next character.
|
|
Cmp.W D6,D3 ; same as old value? ** <C440/18nov86/MBK> **
|
|
Bne.S @CharWidthOK ; ok if not ** <C440/18nov86/MBK> **
|
|
AddQ #1,D3 ; else advance to next char ** <C440/18nov86/MBK> **
|
|
@CharWidthOK
|
|
|
|
Cmp D4,D3 ; beyond selEnd?
|
|
Bls.S SaveLineSt ; if not, save lineStart and fetch next one
|
|
|
|
; have calculated all necessary lineStarts: proceed!
|
|
; test for CR
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.B -1(A0,D3),D0 ; THESE TWO LINES REPLACE PREVIOUS <C971/RWW110387>
|
|
Bsr TEEOLHook ; <C971/RWW110387>
|
|
|
|
Bne.S @3 ; keep going if not CR
|
|
|
|
Move.L A2,A0 ; set current ptr
|
|
Move.W D3,D0 ; get line start
|
|
Add.W D7,D0 ; minus delta (D7 is neg) <not always!>
|
|
|
|
; find the old value of this line start for moving down remaining line starts
|
|
@OldLineStLoop
|
|
Cmp.W (A0)+,D0
|
|
Bhi.S @OldLineStLoop ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
SubQ #2,A0 ; got over-incremented
|
|
Move.L A0,savePtr(A6) ; save it
|
|
Bra iStage3 ; on to stage 3 <SM7> CSS
|
|
|
|
@3
|
|
; D5 (temp lineStart array) may be greater than the old number of lines, so skip the
|
|
; delta check if so. This was a really obscure bug which only hurt us when
|
|
; D0 happened to be equal to D7.
|
|
MoveQ #0,D0 ; clear entire register
|
|
Move.W oldNLines(A6),D0 ; get old # of lines
|
|
Add.W D0,D0 ; double for word entries
|
|
Cmp.L D0,D5 ; have we exceeded the length of the array?
|
|
Bhs.S SaveLineSt ; skip delta check if so
|
|
|
|
Move.W 0(A2,D5.L),D0 ; get old start
|
|
Sub D3,D0 ; oldStart - newStart
|
|
|
|
Cmp D0,D7 ; compare to delta
|
|
Bne.S SaveLineSt ; keep trying if not same
|
|
|
|
Add.L D5,savePtr(A6) ; set old start for move down
|
|
Bra.S iStage3
|
|
|
|
SaveLineSt
|
|
; increase sizes of temporary arrays if needed
|
|
Cmp.L D5,D2 ; time to increase sizes?
|
|
Bgt.S @0
|
|
|
|
Move.L startHndl(A6),A0 ; temp line starts handle
|
|
_HUnlock
|
|
Add.L #defBufSize,D2 ; inc size for line starts ** <C381/6nov86/MBK> **
|
|
Move.L D2,D0
|
|
Sub.L (A0),A1 ; make ptr an offset
|
|
Bsr MySetHandleSize ; reset handle size ** <C381/7nov86/MBK> **
|
|
_HLock
|
|
Add.L (A0),A1 ; make the offset a ptr again
|
|
|
|
@0 Move D3,(A1)+ ; lines[nLines]:=i
|
|
Move D3,D6 ; now start with the next line
|
|
AddQ #1,teNLines(A3) ; increment # lines
|
|
AddQ.L #2,D5
|
|
|
|
Cmp teLength(A3),D6 ; while i < length do
|
|
Blo.S @FindNextLine ; keep finding lines ** <C229/28oct86/MBK> **
|
|
|
|
Move.W oldNLines(A6),D0 ; get old # of lines ** <C229/28oct86/MBK> **
|
|
AddQ.W #1,D0 ; plus 1 to pt to end ** <C229/28oct86/MBK> **
|
|
Add.W D0,D0 ; double for word entries ** <C229/28oct86/MBK> **
|
|
Lea teLines(A3,D0),A0 ; plus base address ** <C229/28oct86/MBK> **
|
|
Move.L A0,savePtr(A6) ; save it for replace ** <C229/28oct86/MBK> **
|
|
Bra.S iStage3A ; go munge ** <C229/28oct86/MBK> **
|
|
|
|
@FindNextLine
|
|
Bsr FindLine ; get line after D6 <C971/RWW102887>NO
|
|
Move D0,D3 ; findline returns in D0
|
|
Bra iLineLoop ; <C971/RWW102887>NO
|
|
|
|
;------------------------------------------------
|
|
; Fill out following line offsets with delta and return in D4 the redraw end
|
|
iStage3
|
|
Move D3,savedD4(A6) ; found it, record in dispEnd
|
|
|
|
; Still need to munge if D5 is 0, in case something was inserted over a CR.
|
|
; Line which skipped munging if D5 = 0 was deleted.
|
|
Move.L savePtr(A6),D0
|
|
Sub.L A2,D0 ; change in # of lines?
|
|
Sub.L D5,D0
|
|
Beq.S iStage3A
|
|
|
|
Move.W teLength(A3),D3 ; if so, must display all
|
|
|
|
iStage3A Move D3,savedD4(A6) ; found it, record in dispEnd
|
|
|
|
Move.L A4,A0
|
|
_HUnLock ; unlock TEHandle
|
|
SubQ.L #4,SP ; room for ret value
|
|
Move.L A4,-(SP) ; TEHandle
|
|
Move.L A2,D0
|
|
Sub.L A3,D0 ; offset to line preceding insert
|
|
Move.L D0,-(SP)
|
|
Move.L #0,-(SP) ; Nil ptr
|
|
|
|
Move.L savePtr(A6),D0 ; end of insertion
|
|
Sub.L A2,D0 ; - beg of insertion
|
|
Move.L D0,-(SP)
|
|
Move.L startHndl(A6),A0
|
|
Move.L (A0),-(SP) ; ptr to new line starts
|
|
Move.L D5,-(SP) ; length of insertion
|
|
Sub.L A3,A2 ; save as offset
|
|
|
|
_Munger;(TEHandle, preInsertPoint, NIL, selectionLen, newLineStarts, insertLen);
|
|
AddQ.L #4,SP ; don't care
|
|
Move.L A4,A0
|
|
_HLock ; relock TEHandle
|
|
Move.L (A4),A3 ; deref
|
|
Add.L A3,A2 ; restore as ptr
|
|
|
|
Add.L D5,A2 ; adjust ptr for move down
|
|
|
|
sameLine Move.L startHndl(A6),A0 ; get rid of line starts handle
|
|
_DisposHandle
|
|
|
|
Cmp teLength(A3),D6 ; if i >= length quit
|
|
Bhs.S endIRecal ;
|
|
iStage3B
|
|
; update the table with new start
|
|
AddQ #1,teNLines(A3) ; increment # lines
|
|
Sub D7,(A2) ; lines[nLines]:=lines[nLines]-delta
|
|
|
|
Move (A2)+,D6 ; see if done
|
|
Cmp teLength(A3),D6 ; while i < length do
|
|
Blo.S iStage3B
|
|
|
|
endIRecal MoveM.L (SP)+,D2/D4 ; other stuff
|
|
Rts
|
|
|
|
;formFeed
|
|
;------------------------------------------------
|
|
If &TYPE('&RWWDebug') <> 'UNDEFINED' Then
|
|
;------------------------------------------------------------------
|
|
; PROCEDURE DeleteRecal
|
|
;
|
|
; Called only by ReCalLines, although it appears that
|
|
; Russ has removed it from ever being used ever again....
|
|
; hmmmm.....
|
|
;
|
|
; ** <C105/3Sep86/MBK> ** Stages 2 and 3 for deletion only
|
|
;------------------------------------------------------------------
|
|
|
|
DeleteRecal
|
|
Move.L teTextH(A3),A0 ; text handle
|
|
Move.L (A0),A1 ; deref into A1
|
|
|
|
dStage2
|
|
; If the width of a single character > the width of the window, Recal keeps
|
|
; finding the same line (line 1) forever. If this happens, don't keep trying
|
|
; to wrap, just advance to the next character.
|
|
|
|
Cmp.W D6,D3 ; same as old value? ** <C440/18nov86/MBK> **
|
|
Bne.S @0 ; ok if not ** <C440/18nov86/MBK> **
|
|
AddQ #1,D3 ; else advance to next char ** <C440/18nov86/MBK> **
|
|
@0
|
|
Cmp teSelEnd(A3),D3 ; not ready for stage 3 if not yet
|
|
Bls.S dSkip3 ; past selEnd
|
|
|
|
Move.L A2,savePtr(A6) ; save ptr for move up
|
|
|
|
Move.W (A2),D0 ; old line start
|
|
Sub D3,D0 ; oldStart - newStart
|
|
Cmp D0,D7 ; compare to delta
|
|
Beq.S dStage3
|
|
|
|
; ** <C971/RWW110387> Added this code to support tabs
|
|
; Cmp.B #returnChar,-1(A1,D3) ; get the last char
|
|
|
|
Move.B -1(A1,D3),D0 ; THESE TWO LINES REPLACE PREVIOUS <C971/RWW110387>
|
|
Bsr TEEOLHook ; <C971/RWW110387>
|
|
|
|
Bne.S dSkip3 ; if CR stage 2 is over
|
|
|
|
; look for the old value of this line
|
|
Move.L A2,A0
|
|
Move.W D3,D0 ; line start + delta
|
|
Add.W D7,D0
|
|
|
|
@1 Cmp.W (A0)+,D0 ; must be a match
|
|
Bhi.S @1 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
SubQ #2,A0 ; got over-incremented
|
|
Move.L A0,savePtr(A6) ; save ptr for move up
|
|
Bra.S dStage3
|
|
dSkip3
|
|
; update the table with new start
|
|
AddQ #1,teNLines(A3) ; inc # of lines
|
|
Move D3,(A2)+ ; lines[nLines]:=i
|
|
Move D3,D6 ; now start with the next line
|
|
|
|
Cmp teLength(A3),D6 ; while i < length do
|
|
Bhs.S endDRecal ;
|
|
|
|
Bsr FindLine ; get line after D6 <C971/RWW102887>NO
|
|
Move D0,D3 ; findline returns in D0
|
|
Bra.S dStage2 ; if so, never do background
|
|
|
|
; Fill out following line offsets with delta and return in D4 the redraw end
|
|
dStage3
|
|
Move.L A2,A0
|
|
|
|
Move.L savePtr(A6),A0 ; source ptr
|
|
Cmp.L A2,A0 ; same as dest ptr?
|
|
Beq.S @3 ; if so, no lines deleted
|
|
|
|
Move.W teLength(A3),D3 ; else, redraw everything
|
|
|
|
@3 Move D3,savedD4(A6) ; found it, record in dispEnd
|
|
|
|
dStage3A
|
|
; update the table with new start
|
|
AddQ #1,teNLines(A3) ; increment # lines
|
|
Move.W (A0)+,D0
|
|
Sub D7,D0 ; lines[nLines]:=lines[nLines]-delta
|
|
|
|
Move.W D0,(A2)
|
|
Move (A2)+,D6 ; see if done
|
|
Cmp teLength(A3),D6 ; while i < length do
|
|
Blo.S dStage3A
|
|
|
|
endDRecal Rts
|
|
|
|
EndIf ; <PMAB381/RWW020488>
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetLineHite
|
|
;
|
|
; ** Added 6/18/86 by MBK **
|
|
;
|
|
; Called only by ReCalLines
|
|
;
|
|
; SetLineHite takes the maximum height for the current line
|
|
; (which was determined in FindLine) and stores it in the
|
|
; array of maximum line heights.
|
|
;
|
|
; ** <C229/28oct86/MBK> ** Changed to reset all heights at end of recal
|
|
;
|
|
; Entry:
|
|
; A4 is pointing into array in which to insert line heights and
|
|
; ascents
|
|
; a6 stack frame of RecalLink
|
|
;----------------------------------------------------------------------
|
|
SetLineHite
|
|
MoveM.L D2-D6/A2/A4,-(SP) ; save registers
|
|
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl endSetLH ; quit if not
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; deref
|
|
Move.L lhTab(A0),A0 ; line heights array
|
|
_GetHandleSize ; get current size
|
|
Move.W D0,D3 ; save size in D3
|
|
AsR.W #2,D3 ; get # of lines
|
|
|
|
MoveQ #0,D0 ; clear whole reg
|
|
Move.W teNLines(A3),D0 ; get # of lines
|
|
AddQ.L #1,D0 ; + 1 for last entry
|
|
LsL.L #2,D0 ; for 2 integers
|
|
Bsr MySetHandleSize ; reset handle size ** <C381/7nov86/MBK> **
|
|
|
|
Move.L teStylesH(A3),A1 ; handle to style info ** <C381/6nov86/MBK> **
|
|
Move.L (A1),A1 ; deref ** <C381/6nov86/MBK> **
|
|
Move.L lhTab(A1),A4 ; line heights array
|
|
Move.L (A4),A4 ; deref
|
|
|
|
Tst.W teLength(A3) ; any text?
|
|
Bne.S @GetStyles ; no default needed if so ** <C381/6nov86/MBK> **
|
|
|
|
; If all text was deleted, set line height according to only remaining style.
|
|
Move.W runs+2(A1),D0 ; style index to 1st style (in runs array) ** <C440/19nov86/MBK> **
|
|
Bsr GetStyle ; get ptr to 1st style ** <C440/19nov86/MBK> **
|
|
Move.W stHeight(A0),(A4)+ ; store line height ** <C440/19nov86/MBK> **
|
|
Move.W stAscent(A0),(A4) ; store the ascent ** <C440/19nov86/MBK> **
|
|
Bra endSetLH ; and quit ** <C440/19nov86/MBK> **
|
|
|
|
@GetStyles
|
|
Move.L styleTab(A1),A0 ; styles array
|
|
Move.L (A0),A0 ; deref
|
|
Lea runs(A1),A1 ; pt to style runs
|
|
Lea teLines(A3),A2 ; pt to line starts
|
|
MoveQ #0,D1 ; set max
|
|
MoveQ #0,D2 ; set starting line #
|
|
Move.L #-1,D4 ; starting redraw line ** <C381/8nov86/MBK> **
|
|
Move.W (A4),D5 ; save old value ** <C381/8nov86/MBK> **
|
|
|
|
setLoop Move.W styleIndex(A1),D0 ; index to current style
|
|
MulU #stRecSize,D0 ; multiply index by size of record
|
|
Cmp.W stHeight(A0,D0.L),D1 ; compare to current max ** <C381/6nov86/MBK> ** made D0 long
|
|
Bge.S @CmpStarts ; already have max
|
|
|
|
Move.W stHeight(A0,D0.L),D1 ; else save as new max ** <C381/6nov86/MBK> ** made D0 long
|
|
Cmp.W D2,D3 ; is this a new entry?
|
|
Ble.S @SetEntry ; just set it if so
|
|
|
|
Tst.W (A4) ; else, see if it should be set
|
|
Bmi.S @CmpStarts ; if neg don't reset (high bit set indicates user set entry)
|
|
|
|
@SetEntry
|
|
Move.W D1,(A4) ; else set height
|
|
Move.W stAscent(A0,D0.L),2(A4) ; set ascent ** <C381/6nov86/MBK> ** made D0 long
|
|
|
|
@CmpStarts
|
|
Move.W 2(A2),D0 ; get next line start
|
|
Cmp.W stStartSize(A1),D0 ; cmp to next style start
|
|
Blo.S @GetNxtLine ; multiple lines of a style; made this unsigned ** <C381/6nov86/MBK> **
|
|
Beq.S @GetNxtStyle ; next style (style end = line end)
|
|
|
|
AddQ.L #stStartSize,A1 ; pt to next style (multiple styles on a line)
|
|
Bra.S setLoop ; keep checking this line
|
|
|
|
@GetNxtStyle
|
|
AddQ.L #stStartSize,A1 ; pt to next style
|
|
@GetNxtLine
|
|
AddQ.L #2,A2 ; pt to next line
|
|
Tst.L D4 ; line to start redraw from ** <C381/8nov86/MBK> **
|
|
Bpl.S @4 ; don't reset it ** <C381/8nov86/MBK> **
|
|
|
|
Cmp.W (A4),D5 ; compare to old max ** <C381/8nov86/MBK> **
|
|
Beq.S @4 ; ok if same ** <C381/8nov86/MBK> **
|
|
|
|
MoveQ #0,D4 ; clear neg value in hi word ** <C381/8nov86/MBK> **
|
|
Move.W D2,D4 ; store line # for redraw ** <C381/8nov86/MBK> **
|
|
|
|
@4 AddQ.L #4,A4 ; next line height entry
|
|
Move.W (A4),D5 ; save old value ** <C381/8nov86/MBK> **
|
|
MoveQ #0,D1 ; reset max
|
|
AddQ #1,D2 ; inc counter
|
|
Cmp.W teNLines(A3),D2 ; check counter
|
|
Blo.S setLoop ; loop if more lines ** <C381/6nov86/MBK> ** changed BNE to BCS
|
|
|
|
Move.L -4(A4),(A4) ; last dummy entry
|
|
|
|
Tst.L D4 ; change in heights? ** <C381/8nov86/MBK> **
|
|
Bmi.S endSetLH ; quit if not ** <C381/8nov86/MBK> **
|
|
|
|
Move.W teLength(A3),savedD4(A6) ; must redraw to bottom ** <C381/8nov86/MBK> **
|
|
Add.W D4,D4 ; double the line # ** <C381/8nov86/MBK> **
|
|
Move.W teLines(A3,D4),D0 ; get start of line ** <C381/8nov86/MBK> **
|
|
Cmp.W savedD2(A6),D0 ; don't reset if new start ** <C381/8nov86/MBK> **
|
|
Bhs.S endSetLH ; is greater than old start ** <C381/8nov86/MBK> **
|
|
|
|
Move.W D0,savedD2(A6) ; store as new display start ** <C381/8nov86/MBK> **
|
|
|
|
endSetLH MoveM.L (SP)+,D2-D6/A2/A4 ; restore registers
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ShowCaret
|
|
; PROCEDURE HideCaret
|
|
; PROCEDURE DrawCaret
|
|
; PROCEDURE EraseCaret
|
|
;
|
|
; Entry:
|
|
; A3 contains dereferenced handle
|
|
;
|
|
;----------------------------------------------------------------------
|
|
ShowCaret
|
|
Tst.B teActive(A3) ; do nothing if not active
|
|
Beq noDrawIt ; <C971/RWW102887>NO
|
|
|
|
Move teSelStart(A3),D0 ; see if should be turned on
|
|
Cmp teSelEnd(A3),D0
|
|
Bne noDrawIt ; if selection <> 0 then escape
|
|
ST teCarAct(A3) ; activate caret
|
|
|
|
DrawCaret
|
|
Tst.B teCarOn(A3) ; see if caret is on
|
|
Bne.S noDrawIt ; don't draw it if so
|
|
ST teCarOn(A3) ; caret marked on
|
|
ForceCaret
|
|
Bra.S DrawIt ; force a redraw
|
|
|
|
HideCaret
|
|
Tst.B teActive(A3) ; do nothing if not active
|
|
Beq.S noDrawIt ; <C971/RWW102887>NO
|
|
|
|
SF teCarAct(A3) ; deactivate caret
|
|
|
|
EraseCaret
|
|
Tst.B teCarOn(A3) ; see if caret is on
|
|
Beq.S noDrawIt ; don't draw it if so
|
|
SF teCarOn(A3) ; caret marked on
|
|
|
|
;Must be called with sorted selStart and selEnd
|
|
DrawIt
|
|
MoveM.L D0-D7,-(SP)
|
|
|
|
Move teSelStart(A3),D3 ; dispStart:=selStart
|
|
Move D3,D4 ; dispEnd:=same
|
|
|
|
MoveQ #teCaret,D7 ; does nothing except moves pen
|
|
Bsr DoText ; draw the caret
|
|
@Cursor2
|
|
Move.L teCarHook(A3),D0 ; do the inversion via hook if there
|
|
|
|
; Call new procedure for caret highlighting, so that color highlighting
|
|
; won't be used.
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; color QD around? <C971/RWW112487>
|
|
Bnz.S @1 ; nope <C971/RWW112487>
|
|
Bsr CaretHook ; <C971/RWW112487>
|
|
Bra.S @2 ; <C971/RWW112487>
|
|
@1 Bsr InvertHook ; <C971/RWW112487>
|
|
@2
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
Bsr CaretHook ; <C971/RWW102887>NO
|
|
Else
|
|
Bsr InvertHook ; <C971/RWW102887>NO
|
|
EndIf
|
|
|
|
; test if a second cursor must be drawn <28Oct88smb>
|
|
tst.w teSize(a3)
|
|
bmi.s @Test4Cursor2 ; bra if styled text
|
|
tst.b WordRedraw
|
|
;; bpl.s @done ; bra if Roman/double-byte old style edit record
|
|
bmi.s @Test4Cursor2 ; <6July89smb>
|
|
tst.b teSysJust ; <6July89smb>
|
|
; bra if Roman/dbl-byte, unstyled and lineDir = LR <6July89smb>
|
|
beq.s @done ; <6July89smb>
|
|
|
|
@Test4Cursor2
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
tst.b ExpandMemRec.emTwoCursorsFlag(a0)
|
|
beq.s @done
|
|
|
|
; draw a 2nd rectangle for split cursors:Top,Left,Bottom,Right
|
|
;;unnecc <26Nov89smb> move.l ExpandMem,a0 ; <1Feb89smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
move.l (a0)+, teSelRect+top(a3)
|
|
move.l (a0), teSelRect+bottom(a3)
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
sf ExpandMemRec.emTwoCursorsFlag(a0)
|
|
;;???<26Nov89smb> sf (a0)
|
|
bra.s @Cursor2
|
|
@done
|
|
MoveM.L (SP)+,D0-D7
|
|
noDrawIt
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEActivate( h: TEHandle )
|
|
; PROCEDURE TEDeActivate( h: TEHandle )
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEActivate
|
|
with OutlineFrame
|
|
bsr StdEntry ; <C971/RWW102887>NO
|
|
link a6,#OutlineFrameSz ; only link if outlining
|
|
|
|
tst.b teActive(A3) ; see if already active
|
|
bne.s goGoHome
|
|
|
|
; fix the selection when inactive
|
|
bsr.s InitOutline
|
|
move teSelStart(a3),d0 ; Only enable the caret
|
|
cmp teSelEnd(a3),d0
|
|
bne.s @notSelPt
|
|
|
|
st teCarAct(a3) ; activate caret
|
|
; hide the caret when outline highlight on <2Oct89smb>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq.s @notSelPt ; no outlining desired
|
|
bsr DrawIt ; hide the caret
|
|
@notSelPt
|
|
st teActive(a3) ; flag as active
|
|
|
|
bsr HiLite
|
|
bra.s DoneActivate ; rejoin flow of control
|
|
|
|
;----------------------------------------------------------------------
|
|
TEDeactivate
|
|
with OutlineFrame
|
|
bsr StdEntry ; <C971/RWW102887>NO
|
|
link a6,#OutlineFrameSz ; only link if outlining
|
|
|
|
tst.b teActive(a3)
|
|
beq.s goGoHome
|
|
|
|
move teSelStart(a3),d0 ; is this a selection point?
|
|
cmp teSelEnd(a3),d0
|
|
bne.s @drawRegion ; fall through for caret processing
|
|
|
|
; is outlining desired?
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq.s @drawRegion ; outline bit not on
|
|
; if caret on invert it
|
|
tst.b teCarOn(a3)
|
|
beq.s @noDraw
|
|
bsr DrawIt
|
|
@noDraw
|
|
; turn on flag in case off - want to display an outlined caret
|
|
st teCarOn(a3) ; will be turned off in HideCaret
|
|
@drawRegion
|
|
bsr.s InitOutline
|
|
bsr HideCaret ; hide the caret
|
|
bsr HiLite ; Remove old selection
|
|
sf teActive(A3) ; flag as inactive
|
|
; drop through to common exit
|
|
;-----------------------------------------
|
|
|
|
DoneActivate
|
|
bsr.s TEOutlineHilite ; outline hilite now
|
|
goGoHome
|
|
unlk a6
|
|
bra goHome
|
|
|
|
;----------------------------------------------------------------------
|
|
; PROCEDURE InitOutline
|
|
; <20Sept89smb>
|
|
; Test for outline highlighting after setting up teRec
|
|
;----------------------------------------------------------------------
|
|
InitOutline
|
|
with OutlineFrame
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq.s @RegHilite
|
|
_OpenRgn
|
|
move.l teHiHook(a3),oldHighHook(a6) ; save
|
|
move.l teCarHook(a3),oldCaretHook(a6) ; save
|
|
lea FrameHook,a0 ; just frame it
|
|
move.l a0,teHiHook(a3) ; stuff it!
|
|
move.l a0,teCarHook(a3) ; stuff it!
|
|
st paintFlag(a6) ; init to always paint region <16Oct89smb>
|
|
@RegHilite
|
|
rts
|
|
;-----------------------------------------
|
|
FrameHook
|
|
_FrameRect
|
|
Rts
|
|
;----------------------------------------------------------------------
|
|
; PROCEDURE TEOutlineHilite
|
|
; <20Sept89smb>
|
|
;----------------------------------------------------------------------
|
|
TEOutlineHilite
|
|
|
|
with OutlineFrame
|
|
; do we need anything fancy
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFOutlineHilite,d0
|
|
beq @DoneTEOutlineHilite ; don't do fancy stuff!
|
|
|
|
; now do the outlining <20Sept89smb>
|
|
move.l a4,-(sp) ; save TE handle
|
|
subq.l #4,sp ; handle to outline region
|
|
_NewRgn
|
|
; handle to outline region still on stack
|
|
move.l (sp),a2 ; save outline region
|
|
_CloseRgn
|
|
subq.l #4,sp ; handle to view region
|
|
_NewRgn
|
|
; handle to view region still on stack
|
|
move.l (sp),a4 ; save view region
|
|
pea teViewRect(a3) ; view Rectangle
|
|
_RectRgn
|
|
move.l a4,-(sp) ; view region
|
|
move.l a2,-(sp) ; outline region
|
|
move.l a2,-(sp) ; intersection of view and outline regions
|
|
_SectRgn
|
|
move.l a4,-(sp) ; view region
|
|
_DisposRgn
|
|
|
|
; set up for drawing
|
|
pea oldPenState(a6)
|
|
_GetPenState
|
|
move.w #1,-(sp)
|
|
move.w #1,-(sp)
|
|
_PenSize
|
|
move.l GrafGlobals(a5),a0 ; get graf globals
|
|
move.w teSelStart(a3),d0
|
|
cmp.w teSelEnd(a3),d0
|
|
bne.s @NoCaret
|
|
; got a caret
|
|
lea gray(a0),a4 ; modified a bit <2Oct89smb>
|
|
move.w #PatXOr,d2
|
|
bra.s @doPen
|
|
@NoCaret
|
|
lea black(a0),a4 ; @black pattern
|
|
; test if color QD available
|
|
move.w #PatXOr,d2 ; assume no color QD
|
|
move.l #gestaltQuickdrawVersion,d0
|
|
_Gestalt ; result returned in a0
|
|
tst.w d0 ; OSErr result returned here
|
|
bne SysErr
|
|
move.l a0,d0 ; test result in a0!
|
|
beq.s @doPen ; no color QD available
|
|
move.w #50,d2 ; hilite
|
|
@doPen
|
|
move.w d2,-(sp)
|
|
_PenMode
|
|
move.l a4,-(sp)
|
|
_PenPat
|
|
; draw
|
|
move.w teSelStart(a3),d0
|
|
cmp.w teSelEnd(a3),d0
|
|
beq.s @Caret
|
|
; no caret so outline
|
|
move.l a2,-(sp)
|
|
_FrameRgn
|
|
tst.b paintFlag(a6) ; don't paint for Updating <16Oct89smb>
|
|
beq.s @NoPaint
|
|
@Caret
|
|
move.l a2,-(sp)
|
|
_PaintRgn
|
|
@NoPaint
|
|
move.l a2,-(sp)
|
|
_DisposRgn
|
|
move.l (sp)+,a4 ; restore TE handle
|
|
|
|
pea oldPenState(a6)
|
|
_SetPenState
|
|
|
|
move.l oldHighHook(a6),teHiHook(a3) ; restore
|
|
move.l oldCaretHook(a6),teCarHook(a3) ; restore
|
|
@DoneTEOutlineHilite
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEIdle( h: TEHandle )
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEIdle
|
|
Bsr StdEntry ; <C971/RWW102887>NO
|
|
|
|
Tst.B teCarAct(A3) ; see if active
|
|
Beq.S goHome
|
|
|
|
SubQ #4,SP ; make room for result
|
|
_TickCount ; Get current time
|
|
Move.L (SP)+,A0 ; use A0 for auto extend
|
|
|
|
Cmp.L teCarTime(A3),A0 ; see if done
|
|
Blo.S goHome
|
|
|
|
Add.L CaretTime,A0 ; next time
|
|
Move.L A0,teCarTime(A3)
|
|
|
|
IF forLocalizability THEN ; <31p-YDS-8/27/91>
|
|
Not.B teCarOn(A3) ; flip the flag
|
|
Bsr DrawIt ; flip the caret
|
|
ELSE
|
|
Bsr DrawIt ; flip the caret
|
|
Not.B teCarOn(A3) ; flip the flag
|
|
ENDIF
|
|
|
|
goHome
|
|
Bra epilog4
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEPaste( h: TEHandle );
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEPaste
|
|
Bsr StdEntry
|
|
|
|
MoveQ #0,D7 ; flag says normal paste
|
|
Bsr.S DoPaste ; <C971/RWW102887>NO
|
|
|
|
Bra.S goHome ; {epilog4} <C971/RWW102887>NO
|
|
|
|
|
|
DoPaste
|
|
|
|
; ** <C207/15oct86/MBK> ** Don't wipe out desk scrap for old TERecs in case applications
|
|
; use it for Undo
|
|
Tst.W teSize(A3) ; record with style?
|
|
Bpl.S @2 ; paste from TEscrap if not
|
|
|
|
; allocate a new handle for the text scrap contents
|
|
MoveQ #0,D0 ; min size ** MBK 6/20/86 **
|
|
Bsr MyNewHandle ; get a temp handle ** <C381/7nov86/MBK> **
|
|
Move.L A0,D6 ; save the handle ** MBK 6/20/86 **
|
|
Move.L A0,-(SP) ; push it ** MBK 6/20/86 **
|
|
|
|
; copy desk scrap to my temp scrap
|
|
SubQ.L #4,SP ; room for VAR ** MBK 6/20/86 **
|
|
Move.L SP,A1 ; save this address ** MBK 6/20/86 **
|
|
SubQ.L #4,SP ; make room for result ** MBK 6/20/86 **
|
|
Move.L A0,-(SP) ; push new handle ** MBK 6/20/86 **
|
|
Move.L #'TEXT',-(SP) ; scrap type ** <C381/5nov86/MBK> **
|
|
Move.L A1,-(SP) ; push address ** MBK 6/20/86 **
|
|
_GetScrap ; get desk scrap ** MBK 6/20/86 **
|
|
Move.L (SP)+,D0 ; error code ** MBK 6/20/86 **
|
|
AddQ.L #4,SP ; don't care ** MBK 6/20/86 **
|
|
Tst.L D0 ; error? ** MBK 6/20/86 **
|
|
Ble.S @1 ; no text scrap ** MBK 6/20/86 **
|
|
|
|
Move.L D0,D5 ; length of scrap ** MBK 6/20/86 **
|
|
Move.L D6,A0 ; ** MBK 6/20/86 **
|
|
|
|
_HLock ; lock text scrap ** MBK 6/20/86 **
|
|
Move.L (A0),D6 ; ptr to scrap ** MBK 6/20/86 **
|
|
|
|
Bsr PasteGuts ; go paste the scrap <C971/RWW102887>NO <SM7> CSS
|
|
|
|
@1 Move.L (SP)+,A0 ; temp scrap handle ** MBK 6/20/86 **
|
|
_DisposHandle ; get rid of it ** MBK 6/20/86 **
|
|
Bra.S @3
|
|
|
|
; ** <C207/15oct86/MBK> ** paste from old TEScrp, for old TERecs only
|
|
@2 Move.L TEScrpHandle,A0 ; insertion = scrap
|
|
_HLock ; lock it
|
|
Move.L (A0),D6 ; now dereference
|
|
MoveQ #0,D5 ; clear whole reg
|
|
Move TEScrpLength,D5 ; insertion length
|
|
|
|
Bsr.S PasteGuts ; go paste the scrap
|
|
|
|
Move.L TEScrpHandle,A0 ; insertion = scrap
|
|
_HUnLock ; unlock it
|
|
|
|
@3 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEStylPaste( h: TEHandle );
|
|
;
|
|
; ** Added 6/20/86 by MBK **
|
|
;
|
|
; TEStylePaste pastes the 'styl' scrap as well as the 'TEXT'
|
|
; scrap. TEPaste, on the other hand, simply extends the current
|
|
; style in the text to include the pasted text. Both work
|
|
; the old way for records without style.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;iTEStylePaste ; comment out for now <45>
|
|
iTEStylPaste
|
|
MoveQ #1,D7 ; flag says normal paste
|
|
Bsr.S DoPaste ; <C971/RWW102887>NO
|
|
|
|
MoveQ #6,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE PstRsrved;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to paste the reserved style if there
|
|
; is one, and otherwise just to extend the current style.
|
|
;----------------------------------------------------------------------
|
|
|
|
PstRsrved
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullStyle(A0),A0 ; get reserved handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullScrap(A0),A1 ; get handle to scrap for null selection
|
|
|
|
Move.L A1,-(SP) ; save for unlocking later
|
|
|
|
Move.L (A1),A0 ; deref
|
|
Tst.W scrpNStyles(A0) ; is there a style?
|
|
Beq.S @0 ; do extend if not
|
|
MoveM.L D3/A4,-(SP)
|
|
Move.L A1,A4 ; put scrap handle in A4
|
|
|
|
; Gotta lock down null scrap!
|
|
Move.L A1,A0
|
|
_HLock
|
|
|
|
MoveQ #0,D3 ; clear whole register
|
|
Move.W teSelStart(A3),D3 ; PstStylGuts wants this
|
|
Bsr PstStylGuts ; go paste it
|
|
MoveM.L (SP)+,D3/A4
|
|
Bra.S @1
|
|
|
|
@0 Bsr ExtendStyle ; just extend
|
|
@1
|
|
; Unlock previously locked null scrap
|
|
Move.L (SP)+,A0
|
|
_HUnlock
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE PasteGuts
|
|
;
|
|
;
|
|
; Entry:
|
|
; D7 = 0, if ExtendStyle should be used to update style table
|
|
; 1, if PasteStyle should be used to update style table
|
|
; D5 = insert length after the delete
|
|
; D6 = pointer to text to insert
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
PasteGuts
|
|
; The following routines cannot trash D5/D6
|
|
Move.W D7,-(SP) ; save flag
|
|
Bsr HideCaret ; <C971/RWW102887>NO
|
|
Bsr HiLite ; remove selection <C971/RWW102887>NO
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @1 ; no, skip style paste
|
|
Tst.W (SP) ; paste or extend?
|
|
Beq.S @0
|
|
|
|
Bsr.S PasteStyle ; paste associated style <C971/RWW102887>NO
|
|
Bra.S @1 ; no, skip style paste
|
|
|
|
@0 Bsr.S PstRsrved ; get the style <C971/RWW102887>NO
|
|
|
|
@1 Bsr SelSort ; sort select (A2 ^selStart/End)<C971/RWW102887>NO
|
|
|
|
Move D0,D7 ; calc delta amount(selEnd in D0)
|
|
Sub (A2),D7 ; ...for ReCalLines (A2 ^selStart)
|
|
|
|
Bsr MungeSetup ; setup for the paste replace
|
|
|
|
Move D7,-(SP) ; length for delete
|
|
Clr -(SP) ; fake long length
|
|
Move.L D6,-(SP) ; pointer to insert = p2
|
|
Move.L D5,-(SP) ; length to insert = l2
|
|
_Munger ; use sloppy munger
|
|
AddQ.L #4,SP ; pop result
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
_Hlock ; and relock it
|
|
|
|
Sub D7,teLength(A3) ; length:=length -(selEnd-selStart)
|
|
Add D5,teLength(A3) ; adjust length by insert amount
|
|
Sub D5,D7 ; adjust delta amount for ReCalLines
|
|
Bsr RecalDraw ; redo the line stuff
|
|
|
|
Bsr ConcatRuns ; <25June89smb>
|
|
|
|
Lea teSelStart(A3),A0 ; point to selStart
|
|
Add D5,(A0) ; selStart:=selstart + insert amount
|
|
Move (A0)+,(A0) ; selEnd:=selStart
|
|
|
|
Bsr ShowCaret ; <C971/RWW102887>NO
|
|
|
|
Bsr SelView ; insure selection is visible
|
|
|
|
AddQ.L #2,SP ; remove flag from stack
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE PasteStyle
|
|
;
|
|
; ** Added 5/28/86 by MBK **
|
|
;
|
|
; PasteStyle inserts the style scrap into the TERec style array
|
|
; if txSize is set to -1 (otherwise this is considered a record
|
|
; without style).
|
|
;
|
|
; Entry:
|
|
; D5: length of pasted text
|
|
; A3: ptr to TERec
|
|
;
|
|
;
|
|
;----------------------------------------------------------------------
|
|
PasteStyle
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S EndPStyl ; only like stylish records <C971/RWW102887>NO
|
|
|
|
MoveM.L D2-D6/A2/A4,-(SP) ; save stuff
|
|
|
|
Bsr SelSort ; get selStart, selEnd
|
|
Move.W D0,D4 ; selEnd
|
|
Swap D0
|
|
MoveQ #0,D3 ; make sure all clear ** <C207/13oct86/MBK> **
|
|
Move.W D0,D3 ; selStart
|
|
|
|
; allocate a new handle for the styl scrap contents
|
|
MoveQ #0,D0 ; min size
|
|
Bsr MyNewHandle ; get a temp handle ** <C381/7nov86/MBK> **
|
|
Move.L A0,A4 ; store the handle for locking & call to PstStylGuts
|
|
Move.L A0,-(SP) ; save the handle for disposing later
|
|
|
|
; copy desk scrap to my temp scrap
|
|
SubQ.L #4,SP ; room for VAR
|
|
Move.L SP,A1 ; save this address
|
|
SubQ.L #4,SP ; make room for result
|
|
Move.L A0,-(SP) ; push new handle
|
|
Move.L #'styl',-(SP) ; scrap type ** <C381/5nov86/MBK> **
|
|
Move.L A1,-(SP) ; don't care what this is
|
|
_GetScrap ; get desk scrap
|
|
Move.L (SP)+,D0 ; error code
|
|
AddQ.L #4,SP ; don't care
|
|
Tst.L D0 ; style found?
|
|
Bpl.S @0 ; there was a style in scrap!
|
|
|
|
Bsr PstRsrved ; get the style
|
|
Bra.S @4 ; extend current style <C971/RWW102887>NO
|
|
|
|
; 'styl' scrap was found, delete styles formerly associated with the selection
|
|
@0 Move.L A4,A0
|
|
_HLock ; lock scrap handle while deleting
|
|
Move.W D3,D0 ; selStart
|
|
Move.W D4,D1 ; selEnd
|
|
Bsr DeleteStyle ; delete associated styles
|
|
|
|
|
|
Bsr.S PstStylGuts ; do the paste
|
|
|
|
; get rid of temp scrap handle
|
|
@4 Move.L (SP)+,A0 ; temp scrap handle
|
|
_DisposHandle ; get rid of it
|
|
|
|
MoveM.L (SP)+,D2-D6/A2/A4 ; restore stuff
|
|
|
|
EndPStyl Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE PstStylGuts
|
|
;
|
|
; ** Separated out from PasteStyle 23jan87 by MBK **
|
|
;
|
|
; PstStylGuts inserts the style info pointed at by the A4
|
|
; handle into the TERec style array.
|
|
;
|
|
; Entry:
|
|
; D3: selStart (high word must be clear!)
|
|
; D5: length of pasted text
|
|
; A3: ptr to TERec
|
|
; A4: handle to style info
|
|
;
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
PstStylGuts
|
|
; set up ptr to where new styles will be inserted
|
|
Move.W D3,D0 ; get selStart
|
|
SubQ #1,D0 ; pre-decrement
|
|
Bsr GetCurStyle ; get current style
|
|
|
|
Move.W D0,D4 ; index to current style
|
|
Move.L (A4),A4 ; dereference
|
|
Move.W scrpNStyles(A4),D2 ; get # of styles in scrap
|
|
Lea scrpStyleTab(A4),A4 ; ptr to style array
|
|
Move.W D3,D0 ; selStart
|
|
|
|
Bne.S @0 ; dup if not 0
|
|
Tst.W D2 ; make sure num styles <> 0
|
|
Beq.S @05
|
|
SubQ #1,D4 ; adjust index for this style
|
|
Bra.S @05
|
|
@0
|
|
Bsr DupStyle ; make copy of style if needed
|
|
Add.L #stStartSize,A0 ; pt to next style
|
|
@05
|
|
Add.W D2,D4 ; save index to last style
|
|
Bsr.S MakeRoom ; make room in array <C971/RWW102887>NO
|
|
|
|
Move.L A0,A2 ; updated ptr
|
|
Move.L teStylesH(A3),A0 ; lock handle because
|
|
_HLock ; you'll be munging
|
|
|
|
; loop over styles in scrap, adding them to styles array if not there already
|
|
@1 Move.L scrpStartChar(A4),D1 ; get scrap start offset ** <C207/13oct86/MBK> **
|
|
Add.L D3,D1 ; plus current offset ** <C207/13oct86/MBK> **
|
|
|
|
Cmp.L #$FFFF,D1 ; offset cannot be > 64K ** <C381/6nov86/MBK> **
|
|
Bhi.S @3 ; if it is don't add it ** <C207/13oct86/MBK> **
|
|
|
|
Move.W D1,-(SP) ; save offset ** <C207/13oct86/MBK> **
|
|
Move.L A4,A0 ; ptr to stuff that counts
|
|
|
|
; The count is a longint in the scrap style table, so I should be adding
|
|
; 2 to point to where a regular style record would be pointing. Otherwise,
|
|
; FindStyle will not find this style in the table.
|
|
AddQ.L #2,A0
|
|
|
|
Bsr FindStyle ; look for it
|
|
|
|
Tst.L D0 ; do we have it already?
|
|
Bne.S @2 ; yes
|
|
|
|
Move.L A4,A0
|
|
AddQ.L #2,A0 ; skip high word ** <C207/13oct86/MBK> **
|
|
Bsr AddStyle ; else, add it
|
|
|
|
Move.W #1,stCount(A1) ; A1 is still pointing to style entry
|
|
|
|
; in either case insert new style descriptor in runs array
|
|
@2 Move.W (SP)+,D1 ; restore offset
|
|
Move.W D1,(A2)+ ; store style start
|
|
Move.W D0,(A2)+ ; store style index
|
|
|
|
@3 Add.L #scrpRecSize,A4 ; pt to next scrap style
|
|
SubQ.W #1,D2 ; dec style counter (make word len!) <PMAB381/RWW020488>
|
|
Bne.S @1 ; keep looping if more
|
|
SubQ #stStartSize,A2
|
|
|
|
; add size of pasted text to all following style starts
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
_HUnlock ; ok to unlock it now
|
|
Move.L A2,A0 ; ptr to last style
|
|
Move.W D4,D0 ; index to last style
|
|
Bsr RecalStStarts ; inc following style starts
|
|
Bsr ConcatStyles ; allow no duplications ** <C182/2oct86/MBK> **
|
|
Bsr ClearRsrved ; clear reserved handle
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE MakeRoom
|
|
;
|
|
; ** Added 6/19/86 by MBK **
|
|
;
|
|
; MakeRoom moves down the contents of the runs array
|
|
; to make room for new entries.
|
|
;
|
|
; Entry:
|
|
; D2: # of new entries
|
|
; A0: ptr from which to move
|
|
; Exit:
|
|
; A0: new ptr value (after resizing)
|
|
;
|
|
;----------------------------------------------------------------------
|
|
MakeRoom
|
|
MoveM.L D2-D3/A2,-(SP)
|
|
|
|
Move.L A0,A2 ; ptr from which to move
|
|
Move.L teStylesH(A3),A0 ; style runs
|
|
_HUnlock ; do this before setting D0
|
|
|
|
Move.L (A0),A1
|
|
MoveQ #1,D0 ; + 1 for dummy end ** <C381/6nov86/MBK> **
|
|
Add.W nRuns(A1),D0 ; current # of style runs ** <C381/6nov86/MBK> **
|
|
Add.W D2,nRuns(A1) ; new # of styles
|
|
LsL.L #2,D0 ; * stStartSize ** <C381/6nov86/MBK> **
|
|
Move.L D0,D3 ; preserve size for block move
|
|
Add.L #stBaseSize,D0 ; add rest of handle size ** <C381/7nov86/MBK> **
|
|
|
|
Lea runs(A1),A1 ; pt to start of style runs
|
|
Sub.L A1,A2 ; preserve ptr as an offset ** <C381/6nov86/MBK> **
|
|
|
|
Sub.L A2,D3 ; amount to be moved down
|
|
Ext.L D2 ; make it a long ** <C381/6nov86/MBK> **
|
|
LsL.L #2,D2 ; * stStartSize ** <C381/6nov86/MBK> **
|
|
Add.L D2,D0 ; new size of block
|
|
Bsr MySetHandleSize ; reset handle size ** <C381/7nov86/MBK> **
|
|
|
|
Move.L (A0),A1 ; dereference
|
|
Lea runs(A1),A1 ; pt to start of style runs
|
|
Add.L A2,A1 ; source ** <C381/6nov86/MBK> **
|
|
_HLock ; assume locked state ** <C381/7nov86/MBK> **
|
|
Move.L A1,A0
|
|
Add.L D2,A1 ; destination
|
|
Move.L D3,D0 ; length
|
|
_StripAddress ; clean up high byte of length <5June89smb>
|
|
_BlockMove ; make room
|
|
|
|
|
|
MoveM.L (SP)+,D2-D3/A2
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DupStyle
|
|
;
|
|
; ** Added 6/11/86 by MBK **
|
|
;
|
|
; DupStyle makes a duplicate copy of the current style ptr
|
|
; if no new style starts at the current cursor position.
|
|
; This is used when the style is about to be broken up by
|
|
; newly inserted styles (such as from TEStylePaste).
|
|
;
|
|
; Entry:
|
|
; D0: selStart
|
|
; A0: ptr to current style
|
|
;
|
|
;----------------------------------------------------------------------
|
|
DupStyle
|
|
Move.L D2,-(SP)
|
|
|
|
Move.L A0,A1
|
|
|
|
Add.L #stStartSize,A0 ; pt to next
|
|
move.w d0,d2 ; temp storage <5July89smb>
|
|
; if in the last style run in the record, the real end of the run is really one char back. <5July89smb>
|
|
move.w (a0),d0 ; <5July89smb>
|
|
cmp.w teLength(a3),d0 ; <5July89smb>
|
|
bls.s @NotLastRun ; <5July89smb>
|
|
sub.w #1,d0 ; at the last run: fix the end <5July89smb>
|
|
;;<5July89smb> Cmp.W startChar(A0),D0 ; does a new style start here?
|
|
@NotLastRun
|
|
exg d0,d2 ; restore <5July89smb>
|
|
cmp.w d0,d2 ; does a new style start here? <5July89smb>
|
|
Beq.S @0 ; if so, no need to dup
|
|
|
|
Move.W D0,-(SP)
|
|
MoveQ #1,D2 ; one style to insert
|
|
Bsr.S MakeRoom ; make room for it <C971/RWW102887>NO
|
|
Move.L A0,A1 ; copy it
|
|
SubQ #stStartSize,A1 ; point to prev style
|
|
Move.W (SP)+,startChar(A0) ; get style start
|
|
Move.W styleIndex(A1),D0 ; get style's index ** <C381/7nov86/MBK> **
|
|
Move.W D0,styleIndex(A0) ; copy style index ** <C381/7nov86/MBK> **
|
|
|
|
; ** <C381/7nov86/MBK> ** obscure bug found by Andy H.; DupStyle should inc the stCount
|
|
Bsr GetStyle ; get the style ** <C381/7nov86/MBK> **
|
|
AddQ #1,stCount(A0) ; and inc the count
|
|
|
|
@0 Move.L (SP)+,D2
|
|
Move.L A1,A0
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE FindStyle
|
|
;
|
|
; ** Added 5/29/86 by MBK **
|
|
;
|
|
; FindStyle looks for a style in the style array matching the
|
|
; style pointed at by A0.
|
|
;
|
|
; Entry:
|
|
; A0: ptr to style being sought
|
|
; A3: TEHandle
|
|
; Exit:
|
|
; D0(High): 1 if style was found, 0 otherwise
|
|
; D0(Low): style index if style is found, 0 otherwise
|
|
; A0: ptr to entry in style array if style is found,
|
|
; No change otherwise
|
|
;
|
|
;----------------------------------------------------------------------
|
|
FindStyle
|
|
Move.L D2,-(SP) ; save stuff
|
|
|
|
; get ptr to 1st style in text
|
|
Move.L teStylesH(A3),A1 ; get style handle
|
|
Move.L (A1),A1 ; dereference
|
|
Move.W nStyles(A1),D2 ; get # of styles in text <24July89smb> changed to nStyles
|
|
Move.L styleTab(A1),A1 ; handle to styles array
|
|
Move.L (A1),A1 ; dereference
|
|
Lea stFont(A0),A0 ; set ptr to relevent data
|
|
Move.W D2,D1 ; init to # of styles
|
|
|
|
; loop over styles comparing to the one being sought
|
|
@0 Tst.W stCount(A1) ; is this style being used?
|
|
Beq.S @1 ; doesn't count if not
|
|
|
|
Bsr.S CompareStyles ; do the styles match? <C971/RWW102887>NO
|
|
; Tst.W D0 ; REDUNDANT! <PMAB381/RWW020488>
|
|
Beq.S @2 ; go if you have a match
|
|
|
|
@1 Add.L #stRecSize,A1 ; point to next style
|
|
SubQ #1,D1 ; dec counter
|
|
Bne.S @0 ; keep trying
|
|
|
|
MoveQ #0,D0 ; clear flag to indicate not found
|
|
Bra.S @3
|
|
|
|
; a matching style was found, set flag and style index
|
|
@2 MoveQ #1,D0 ; indicates style found ** <C381/6nov86/MBK> **
|
|
Swap D0 ; faster than MOVE.L #$10000,D0 ** <C381/6nov86/MBK> **
|
|
Sub.W D1,D2 ; get the difference
|
|
Move.W D2,D0 ; return index in D0(Low)
|
|
AddQ.W #1,stCount(A1) ; inc the count
|
|
Move.L A1,A0 ; return ptr in A0
|
|
|
|
@3 Move.L (SP)+,D2 ; restore stuff
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE CompareStyles
|
|
;
|
|
; ** Added 5/29/86 by MBK **
|
|
;
|
|
; CompareStyles compares two styles byte by byte.
|
|
;
|
|
; Entry:
|
|
; A0: ptr to one style
|
|
; A1: ptr to another style
|
|
; Exit:
|
|
; D0: non-zero if styles don't match, 0 if they do
|
|
;
|
|
;----------------------------------------------------------------------
|
|
CompareStyles
|
|
MoveM.L A0-A1,-(SP) ; save ptrs
|
|
|
|
Lea stFont(A1),A1 ; set ptr to relevent data
|
|
Move.L #styleSize,D0 ; get size of style descriptor
|
|
@0 CmpM.B (A0)+,(A1)+ ; compare a byte
|
|
Bne.S @1 ; quit if not equal
|
|
SubQ #1,D0 ; else dec the counter
|
|
Bne.S @0 ; keep comparing if not 0
|
|
|
|
@1 MoveM.L (SP)+,A0-A1 ; restore ptrs
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE AddStyle
|
|
;
|
|
; ** Added 5/30/86 by MBK **
|
|
;
|
|
; AddStyle adds a new style to the styles array.
|
|
;
|
|
; Entry:
|
|
; A0: ptr to style to be added
|
|
; A3: TEHandle
|
|
; Exit:
|
|
; D0: style index
|
|
;
|
|
;----------------------------------------------------------------------
|
|
AddStyle
|
|
MoveM.L D2-D3/A2,-(SP)
|
|
|
|
; Get # of styles and handle to them
|
|
Move.L teStylesH(A3),A1 ; get handle to style info
|
|
Move.L (A1),A2 ; dereference
|
|
Move.W nStyles(A2),D0 ; get # of styleRecs <24July89smb> changed to nStyles
|
|
Move.W D0,D3 ; save it
|
|
Move.L styleTab(A2),A1 ; handle to styleRecs
|
|
Move.L (A1),A1 ; dereference
|
|
|
|
; If a style has a count of 0, its location may be reused by the new style
|
|
@0 Tst.W stCount(A1) ; style being used?
|
|
Beq.S @1 ; if not, it can be reused
|
|
|
|
Add.L #stRecSize,A1 ; else, pt to next style rec
|
|
SubQ #1,D0 ; dec the counter
|
|
Bne.S @0 ; keep trying
|
|
|
|
; No empty slots found, so create room at the end
|
|
Move.L A0,-(SP) ; save ptr to new style
|
|
AddQ #1,nStyles(A2) ; inc # of styleRecs <24July89smb> changed to nStyles
|
|
Move.L styleTab(A2),A0 ; handle to styleRecs
|
|
_GetHandleSize ; how big is it?
|
|
Move.L D0,D2 ; save size
|
|
Add.L #stRecSize,D0 ; inc size by 1 record
|
|
|
|
; ** <C381/6nov86/MBK> ** didn't need to reset A0 again since GetHandleSize doesn't trash it
|
|
Move.L A0,A2 ; handle to styleRecs ** <C381/6nov86/MBK> **
|
|
Bsr MySetHandleSize ; reset handle size ** <C381/7nov86/MBK> **
|
|
Move.L (SP)+,A0 ; restore ptr to new style
|
|
|
|
Move.L (A2),A1 ; dereference
|
|
Add.L D2,A1 ; add record at end
|
|
MoveQ #0,D0 ; will be using last slot
|
|
|
|
@1 Sub.W D0,D3 ; get the index
|
|
Move.L #stRecSize,D0 ; size of record
|
|
_BlockMove ; copy it to styleRec array
|
|
|
|
Move.W D3,D0 ; return the index
|
|
|
|
MoveM.L (SP)+,D2-D3/A2
|
|
|
|
Rts
|
|
|
|
|
|
; A3 the standard record w/selstart for the offset
|
|
; trashes A1
|
|
; leaves stack setup to l1
|
|
|
|
MungeSetup
|
|
Move.L (SP)+,A1 ; get local RTS
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
_HUnlock
|
|
|
|
SubQ.L #4,SP ; room for result
|
|
Move.L A0,-(SP) ; push handle
|
|
Move teSelStart(A3),-(SP) ; start index for insert
|
|
Clr -(SP) ; fake long for index
|
|
Clr.L -(SP) ; fake p1
|
|
|
|
Jmp (A1)
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE InsRsrved;
|
|
;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to insert the reserved style if there
|
|
; is one, and otherwise just to extend the current style.
|
|
;----------------------------------------------------------------------
|
|
InsRsrved
|
|
Tst.W D5 ; anything being inserted?
|
|
Beq.S @1 ; quit if not
|
|
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullStyle(A0),A0 ; get reserved handle
|
|
Move.L (A0),A0 ; deref
|
|
Move.L nullScrap(A0),A1 ; get handle to scrap for null selection
|
|
Move.L (A1),A0 ; deref
|
|
Tst.W scrpNStyles(A0) ; is there a style?
|
|
Beq.S @0 ; do extend if not
|
|
|
|
movem.l d3/a1/a4,-(SP) ; added a1 for unlocking later <20>
|
|
Move.L A1,A4 ; put scrap handle in A4
|
|
; Gotta lock down null scrap! <20>
|
|
move.l a1,a0 ; <20>
|
|
_HLock ; <20>
|
|
MoveQ #0,D3 ; clear whole register
|
|
Move.W teSelStart(A3),D3 ; PstStylGuts wants this
|
|
Bsr PstStylGuts ; go paste it
|
|
movem.l (sp)+,d3/a1/a4 ; added a1 for unlocking <20>
|
|
; Unlock previously locked null scrap <20>
|
|
move.l a1,a0 ; <20>
|
|
_HUnlock ; <20>
|
|
|
|
Bsr ClearRsrved ; selection is different now
|
|
; text already inserted by InsGuts so okay to call ConcatRuns now
|
|
bsr ConcatRuns ; <25June89smb>
|
|
Bra.S @1
|
|
|
|
@0 Move.W teSelStart(A3),D0 ; get selStart
|
|
SubQ #1,D0 ; pre-decrement
|
|
Bsr GetCurStyle ; get current style
|
|
Bsr RecalStStarts ; adjust start points
|
|
|
|
@1 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE InsGuts
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Takes the text pointed to by D6 of length D5 and inserts it
|
|
; at selStart. It then adjusts teLength by the inserted length.
|
|
; It also adjusts D7, the delta accumulator for RecalLines.
|
|
;
|
|
; Entry:
|
|
; D5 length of text
|
|
; D6 pointer to text
|
|
; D7 pending delta amount for recalLines
|
|
; Exit:
|
|
; D7 Adjusted by insert amount
|
|
;
|
|
;----------------------------------------------------------------------
|
|
InsGuts
|
|
Bsr.S MungeSetup ; setup for the insert <C971/RWW102887>NO
|
|
|
|
Clr.L -(SP) ; fake l1
|
|
Move.L D6,-(SP) ; pointer to insert = p2
|
|
Move.L D5,-(SP) ; length to insert = l2
|
|
_Munger ; use sloppy munger
|
|
AddQ.L #4,SP ; pop result
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
_Hlock ; and relock it
|
|
|
|
Add D5,teLength(A3) ; adjust length by insert amount
|
|
Sub D5,D7 ; adjust delta amount for ReCalLines
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; no, you're done ** MBK 6/18/86 **
|
|
|
|
Bsr.S InsRsrved ; insert the style <C971/RWW102887>NO
|
|
@0
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEInsert( pText: PTR; l: LONGINT; h: TEHandle );
|
|
;
|
|
; This inserts the passed text/length just before the selection
|
|
; but doesn't touch the scrap. The selection too is "untouched"
|
|
; because it is offset by the inserted amount to point to the same
|
|
; range. Just after a TENew this can be used as a replacement for
|
|
; the old TESetText because the selection and length are all zero.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEInsert
|
|
Bsr StdEntry
|
|
|
|
Bsr HideCaret ; <C971/RWW102887>NO
|
|
Bsr HiLite ; remove selection <C971/RWW102887>NO
|
|
|
|
MoveQ #0,D7 ; delta = 0(No deletion)
|
|
MoveM.L (A2)+,D5-D6 ; A2 points to l param
|
|
Bsr.S InsGuts ; go insert the scrap
|
|
|
|
Bsr RecalDraw ; redo the line stuff
|
|
|
|
Add D5,teSelStart(A3) ; selStart:=selstart + insert amount
|
|
Add D5,teSelEnd(A3) ; selEnd:=selEnd + insert amount
|
|
|
|
Bsr ShowCaret
|
|
Bsr HiLite ; restore selection <C971/RWW102887>NO
|
|
|
|
epilog12 MoveQ #12,D0
|
|
Bra StdExit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEKey( key: CHAR; h: TEHandle );
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEKey
|
|
; turn off textBuffering bit before calling StdEntry since want to process below <17Sept89smb>
|
|
move.l 4(sp),a1 ; teHandle (before the return address)
|
|
move.l (a1),a1 ; need the ptr to the teRec
|
|
move.l teDispatchH(a1),a1
|
|
move.l (a1),a1
|
|
move.l newTEFlags(a1),-(sp)
|
|
move.l #0,newTEFlags(a1)
|
|
|
|
Bsr TEKeyStdEntry
|
|
;; Bsr StdEntry ; <C971/RWW102887>NO
|
|
|
|
; reset textBuffering bit <17Sept89smb>
|
|
move.l teDispatchH(a3),a1
|
|
move.l (a1),a1
|
|
move.l (sp)+,newTEFlags(a1)
|
|
|
|
_ObscureCursor ; nice knowing you cursor
|
|
|
|
Move.W (A2),D1 ; store char away
|
|
move.b d1,d0 ; get char for comparison
|
|
MoveQ #1,D2 ; assume going down
|
|
|
|
; Cursor Key support - Added from 'Lonely Hearts' patch 14Jan86
|
|
; left: If selStart isn't 0 it decrements it and places the caret there
|
|
; right: Increments selEnd and places caret there
|
|
; up: simulates a click one line above current selStart point
|
|
; down: simulates a click one line below current selStart point
|
|
|
|
IF 0 THEN ; bye bye for now <29>
|
|
cmp.b #forwardDeleteChar,d0 ; is this the extended keyboard function key? <20>
|
|
bne.s @CursorKeys ; <20>
|
|
|
|
st teLftCaret(A3) ; jam caret to left cause its nota cursor key <20>
|
|
; be sure d6 is not used in any subroutines called from here!!!!
|
|
st d6 ; tell backspace that we are going forward <20>
|
|
bra backspace ; do common backspace code <20>
|
|
@CursorKeys
|
|
ENDIF ; <29>
|
|
subi.b #downArrowChar,d0
|
|
Beq.S downArrow
|
|
bhi.s normalChar ; optimize normal characters
|
|
|
|
subi.b #upArrowChar-downArrowChar,d0
|
|
Beq.S upArrow
|
|
|
|
subi.b #rightArrowChar-upArrowChar,d0
|
|
Beq rightArrow
|
|
|
|
subi.b #leftArrowChar-rightArrowChar,d0
|
|
Beq leftArrow
|
|
|
|
st teLftCaret(A3) ; jam caret to left, UNLESS a cursor key <7Aug89smb>
|
|
IF 0 THEN ; bye bye for now <29>
|
|
; be sure d6 is not used in any subroutines called from here!!!!
|
|
sf d6 ; tell backspace that we are going backward <20>
|
|
ENDIF ; <29>
|
|
|
|
subi.b #backspaceChar-leftArrowChar,d0
|
|
Beq backSpace
|
|
|
|
normalChar
|
|
; test if want text buffering <12June89smb>
|
|
st teLftCaret(a3) ; jam caret to left, UNLESS a cursor key <7Aug89smb>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0
|
|
btst #teFTextBuffering,d0
|
|
beq PasteChar ; little mod <15June89smb>
|
|
|
|
;; Bra.S PasteChar ; => go paste in the character
|
|
bsr TEBufferText ; <30Jan89smb>
|
|
bra Epilog6 ; <30Jan89smb>
|
|
|
|
upArrow
|
|
;; subtract 2 rather than 1 <1/25/90smb> MoveQ #-1,D2 ; going up
|
|
MoveQ #-2,D2 ; going up
|
|
downArrow
|
|
Move D2,-(SP) ; save D2
|
|
|
|
; dump text buffer before processing cursor key <14Sept89smb>
|
|
Move.L teDispatchH(a3),a0
|
|
Move.L (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <15Sept89smb>
|
|
btst #teFTextBuffering,d0 ; <15Sept89smb>
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
; Call HideCaret to fix problems with old and new teLftClick <1/25/90smb>
|
|
bsr HideCaret ; erase old caret <1/25/90smb>
|
|
Move teSelStart(A3),D3 ; pass selStart=selEnd
|
|
Move D3,D4
|
|
moveq #teCaret,d7 ; position pen to caret <03July89smb>
|
|
bsr DoText ; the port ret. in A0
|
|
|
|
move (sp)+,d2 ; restore D2
|
|
|
|
;-------------------------------------------------------------------------------------
|
|
; In order to go down from a line end position to a line whose line height is less than the current
|
|
; line height, must back up one position to get the hite for the correct line (when FindLineHite
|
|
; calls GetLine and the current position is at the end of a line, it thinks it's at the
|
|
; beginning of the next line so the wrong height is returned. <1/30/90smb>
|
|
movem.l a2/d3,-(sp)
|
|
tst.b teLftCaret(a3)
|
|
bne.s @OffsetOK
|
|
move.w d3,d0 ; offset
|
|
beq.s @OffsetOK
|
|
lea teLines(a3),a2
|
|
bsr GetLine ; get line that d3 is on
|
|
cmp.w (a2),d3 ; cmp offset position to line start found
|
|
bne.s @OffsetOK
|
|
subq.w #1,d3 ; backup to get correct line in FindLineHite
|
|
@OffsetOK
|
|
bsr FindLineHite ; get current line hite in d1 ** MBK 6/18/86 **
|
|
movem.l (sp)+,a2/d3
|
|
; end of changes <1/30/90smb>
|
|
;-------------------------------------------------------------------------------------
|
|
|
|
;; <1/25/90smb> muls d1,d2 ; get delta -- a SIGNED 16-bit value<09Dec85 JTC>
|
|
; if we are going down (d2 = 1), then add linehite (d1) <1/25/90smb>
|
|
; if we are going up (d2 = -2), then subtract 2, just enough to get into the previous line's Rect <1/25/90smb>
|
|
tst.w d2 ; up or down <1/25/90smb>
|
|
blt.s @DeltaOk ; up = -1 <1/25/90smb>
|
|
move.w d1,d2 ; move in delta <1/25/90smb>
|
|
@DeltaOk
|
|
|
|
; assume whole caret or high caret in teSelRect <26Nov89smb>
|
|
move.l teSelRect(a3),teSelPoint(a3) ; pass caret point
|
|
;-------------------------------------------------------------------------------------
|
|
; set teSelPoint(a3) from the high caret position! <26Nov89smb>
|
|
move.l ExpandMem,a0 ; <26Nov89smb>
|
|
cmpi.w #$FFFF,ExpandMemRec.emTwoCursorsFlag(a0) ; <26Nov89smb>
|
|
bne.s @UseSelRect ; bra if high caret loc in teSelRect <26Nov89smb>
|
|
|
|
; use rect stored in emCursor2Rect: this is the high caret location. <26Nov89smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; <26Nov89smb>
|
|
move.l (a0),teSelPoint(a3) ; pass high caret point <26Nov89smb>
|
|
@UseSelRect
|
|
;-------------------------------------------------------------------------------------
|
|
add d2,teSelPoint(a3) ; adjust v value
|
|
bsr DoFind ; the port ret. in A0
|
|
|
|
;; <5Aug89smb> screws up DoCaret! ST teLftCaret(A3) ; force clean clicks
|
|
move.b teLftClick(a3),teLftCaret(a3) ; <10Aug89smb>
|
|
Bra.w leftRight ; setselect'll force autoscroll
|
|
|
|
rightArrow
|
|
Move teSelEnd(A3),D6 ; get start
|
|
MoveQ #1,d3 ; if 2byte char, incr posn <27June88smb>
|
|
bra.s HorizArrows ; <6Mar89smb>
|
|
leftArrow
|
|
Move teSelStart(A3),D6 ; get start
|
|
beq.s HorizArrows ; <13Mar89smb> special case at 0th position
|
|
MoveQ #-1,d3 ; if 2byte char, decr posn <27June88smb>
|
|
HorizArrows
|
|
|
|
; dump text buffer before processing cursor key <14Sept89smb>
|
|
Move.L teDispatchH(a3),a0
|
|
Move.L (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops <15Sept89smb>
|
|
btst #teFTextBuffering,d0 ; <15Sept89smb>
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
|
|
tst.b WordRedraw ; <9Jan89smb>
|
|
blt.s @RLText ; <22June89smb> includes RL directional text
|
|
tst.b teSysJust ; <22June89smb>
|
|
beq.s @LRLineDir ; <22June89smb> LR text on a LR line
|
|
@RLText
|
|
; may be RL text on any directioned line OR LR text on a RL line
|
|
bsr CursorMovement ; <9Jan89smb>
|
|
; <31k-YDS-8/27/91>
|
|
; supports the single carret corect display
|
|
IF forLocalizability THEN ; when on cluster boundry, syncronize allways to the
|
|
; style with the that his just = teSysJust
|
|
tst.b WordRedraw ; have L->R script ?
|
|
bge.s leftRight ; no, do the old way
|
|
tst.w teSize(a3) ; if unstyled ?
|
|
bpl.s leftRight ; do the old way for unstyled
|
|
move.w d6,d0 ; GetCurStyle needs offset in d0
|
|
bsr GetCurStyle ; get the current style
|
|
cmp.w startChar(a0),d6 ; are we on a boundry ?
|
|
bne.s leftRight ; if not do it the old way
|
|
move.l a0,-(sp) ; keep a0 (the style) from being trashed
|
|
Bsr HideCaret ; hide caret
|
|
Bsr HiLite ; unhilite
|
|
Move d6,teSelEnd(A3) ; set set start
|
|
Move d6,teSelStart(A3) ; set sel end
|
|
move.l (sp)+,a0 ; restore style ptr (in a0)
|
|
bsr GetDirection ; get style direction
|
|
cmp.b TESysJust,d1 ; same as TESysJust ?
|
|
beq @setStyle ; yes ! set the style for it.
|
|
move.w d6,d0 ; no ! get the prev style, put offset into d0
|
|
sub.w #1,d0 ; be in prev
|
|
bsr GetCurStyle ; get this style
|
|
@setStyle bsr SetStyle ; set the font/style in the grafport
|
|
move.w d6,d0 ; char offset in d0 needed by SetKeyboard2Font
|
|
bsr SetKeyboard2Font ; sync keyboard to font
|
|
Bsr HiLite ; Hilite
|
|
Bsr SelView ; insure selection is visible
|
|
Bsr ShowCaret ;
|
|
Bra epilog6
|
|
ELSE
|
|
bra.s leftRight ; <9Jan89smb>
|
|
ENDIF
|
|
|
|
@LRLineDir
|
|
Bsr DoubleByte ; middle of char? Fix starting point <27June88smb>
|
|
leftRight
|
|
Ext.L D6 ; D6 comes back char loc
|
|
Move.L D6,-(SP) ; pass start
|
|
Move.L D6,-(SP)
|
|
Move.L A4,-(SP)
|
|
_TESetSelect
|
|
|
|
Bsr DrawCaret ; force caret ON
|
|
IF 0 THEN ; bye bye for now <29>
|
|
Bra epilog6 ; <29>
|
|
ELSE ; <29>
|
|
Bra.w epilog6
|
|
ENDIF ; <29>
|
|
|
|
PasteChar
|
|
; Go paste the character
|
|
Move.L A2,D6 ; point to the character
|
|
AddQ #1,D6 ; character in lower half
|
|
MoveQ #1,D5 ; one long
|
|
Bsr BufferChar ; buffer if 2 byte character <27June88smb>
|
|
IF 0 THEN ; bye bye for now <29>
|
|
blt epilog6 ; the result isn't unsigned! <31Aug89smb> <29>
|
|
ELSE ; <29>
|
|
blt.w epilog6 ; the result isn't unsigned! <31Aug89smb>
|
|
ENDIF ; <29>
|
|
|
|
moveq #0,D7 ; want to call ExtendStyle
|
|
bsr PasteGuts
|
|
;; <1/9/90smb> move.l ExpandMem,a0 ; <1Feb89smb> finished w/ character
|
|
;;<6Nov89smb> clr.w ExpandMemRec.emBufferPtr(a0) ; empty buffer; temp use of space <2Feb89smb>
|
|
;; <1/9/90smb> clr.w ExpandMemRec.emBufferLen(a0) ; empty buffer <6Nov89smb>
|
|
move.l teDispatchH(a3),a0 ; <1/9/90smb> finished w/ character so empty storage
|
|
move.l (a0),a0
|
|
IF forLocalizability THEN ; <31b-YDS-8/27/91>
|
|
move.w #0,TwoByteCharBuffer(a0)
|
|
ELSE
|
|
move.l #0,TwoByteCharBuffer(a0)
|
|
ENDIF
|
|
bra.w epilog6
|
|
|
|
backSpace
|
|
; dump text buffer before backspacing <14Sept89smb>
|
|
Move.L teDispatchH(A3),A0
|
|
Move.L (A0),A0
|
|
move.l newTEFlags(a0),d0
|
|
btst #teFTextBuffering,d0
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; <30Jan89smb> dump text from buffer
|
|
@noBuffer
|
|
Move teSelStart(A3),D0 ; see if null selection
|
|
Cmp teSelEnd(A3),D0
|
|
Bne.S cutit
|
|
|
|
;------------------------
|
|
IF 0 THEN ; bye bye for now <29>
|
|
; add support for the forward delete key <7jan91 fjs><20>
|
|
tst.b d6 ; is this forward delete ? <20>
|
|
beq.s @normalBS ; if 0 do normal backspace work <20>
|
|
|
|
; since there is no selection, eat characters to the right
|
|
; first, check if we are at the extreme right already
|
|
cmp.w teLength(a3),d0 ; at extreme right of text? (really, the end… think R-L)<20>
|
|
bge.s epilog6 ; yes, skip this <20>
|
|
bsr HideCaret ; remove the caret <20>
|
|
|
|
; check for double-byte characters and fix starting point
|
|
move.w teSelEnd(a3),d6 ; current position <20>
|
|
moveq #1,d3 ; direction to move <20>
|
|
bsr DoubleByte ; middle of char? Fix starting point. <20>
|
|
move.w d6,teSelEnd(a3) ; adjust selection <20>
|
|
bra.s cutit ; fall into the cut case <7jan91 fjs><20>
|
|
@normalBS
|
|
ENDIF ; <29>
|
|
;------------------------
|
|
|
|
; since there's no selection eat characters to the left.
|
|
Tst D0 ; see if at extreme left (really, the beginning… think R-L)
|
|
Beq.w epilog6 ; skip if so
|
|
|
|
Bsr HideCaret ; remove the caret
|
|
;; SubQ #1,teSelStart(A3) ; adjust selection
|
|
|
|
; check for double-byte characters and fix starting point. <27June88smb>
|
|
|
|
move.w teSelStart(a3),d6 ; current position <27June88smb>
|
|
moveQ #-1,d3 ; direction to move <27June88smb>
|
|
Bsr DoubleByte ; middle of char? Fix starting point <27June88smb>
|
|
move.w d6,teSelStart(A3) ; adjust selection
|
|
|
|
cutit
|
|
; Need to synchronize keyboard to the font <2/28/90smb>; moved here from DelGuts.
|
|
; This must be done before the call to TEDelete in order to synchronize the kbd to
|
|
; the style that corresponds to the current selStart.
|
|
tst.w teSize(a3) ; if unstyled, try synch keyboard to font anyway>
|
|
IF forLocalizability THEN ; even if we dont have all info
|
|
bpl.s @syncUnStyled ; sync for unstyled <31n-YDS-8/27/91>.
|
|
ELSE
|
|
bpl.s @JustCut ; <2/28/90smb>
|
|
ENDIF
|
|
move.w teSelStart(a3),d0 ; use current offset position <2/28/90smb>
|
|
bsr GetCurStyle ; <2/28/90smb>
|
|
bsr SetStyle ; <2/28/90smb>
|
|
bsr SetKeyboard2Font ; synch keyboard to font <2/28/90smb>
|
|
|
|
IF forLocalizability THEN ; synch for unstyled too <31n-YDS-8/27/91>
|
|
bra @JustCut ; go to the cut if didn't come with a bpl.s
|
|
@syncUnStyled
|
|
IF 0 THEN ; now using 'itlb' flag in CubeE <45>
|
|
;; tst.b WordRedraw ; is it a R->L script ? <34>
|
|
;; bge.w @JustCut ; don't synch. <34>
|
|
; Really want to synchronize for unstyled text in ALL scripts. However, this will cause problems for <34>
|
|
; input methods, so we will skip this code in this case. (WordRedraw only indicates the <34>
|
|
; types of scripts installed and not the current one…) <34>
|
|
subq #2,sp ; result space for Font2Script & GetScript <34>
|
|
move.w teFont(a3),-(sp) ; app font id <34>
|
|
_Font2Script ; it's a non-roman char so get script font <34>
|
|
move.w (sp)+,d0 ; <34>
|
|
beq @UseFont ; if Roman then always synchronize <34>
|
|
cmp.w #smEastEurRoman,d0 ; Extended Roman? <38>
|
|
beq @JustCut ; If so, never synchronize <38>
|
|
subq #4,sp ; result space <34>
|
|
move.w d0,-(sp) ; script <34>
|
|
move.w #smScriptRedraw,-(sp) ; <34>
|
|
_GetScript ; <34>
|
|
move.l (sp)+,d1 ; <34><37>
|
|
tst.b d1 ; leave in d1 for later <34><37>
|
|
bgt @JustCut ; if double-byte script don't synchronize <34>
|
|
; otherwise, we have a single-byte non-Roman font <34>
|
|
; IF SysVers > $610 THEN
|
|
; move.l teDispatchH(a3),a0 ;
|
|
; move.l (a0),a0
|
|
; move.l newTEFlags(a0),d0 ; move into reg the flags
|
|
; btst #teFInlineInput,d0 ; are we in an inline input window ?
|
|
; bne.w @JustCut ; yes, don't synch keyboard.
|
|
; ENDIF
|
|
|
|
ELSE ; now using 'itlb' flag in CubeE <45>
|
|
; optimize for Roman-only: do not have to synch font & kbd <50>
|
|
with smgrRecord ; <50>
|
|
GetSMgrCore a0 ; load SMgr globals pointer. <50>
|
|
cmp.b #1,smgrEnabled(a0) ; how many scripts enabled? <50>
|
|
beq @JustCut ; skip synchronization for Roman-only system <50>
|
|
endwith ; <50>
|
|
|
|
subq #6,sp ; result space for Font2Script & GetScript <45>
|
|
move.w teFont(a3),-(sp) ; app font id <45>
|
|
_Font2Script ; get script font <45>
|
|
; script left on stack ; <45>
|
|
move.w #smScriptFlags,-(sp) ; now get script-specific flags <45>
|
|
_GetScript ; <45>
|
|
move.l (sp)+,d0 ; <45>
|
|
and.l #(1<<smsfSynchUnstyledTE),d0 ; leave only the synchronize bit <45>
|
|
beq @JustCut ; 0=> do not synchronize <45>
|
|
; otherwise synchronize
|
|
ENDIF ; now using 'itlb' flag in CubeE <45>
|
|
|
|
Move.w teSelStart(a3), d6 ; <33-YDS-10/1/91> d6 was set only for a one char delete, not for a selection delete
|
|
; Check char to determine how to synch
|
|
move.l teTextH(a3),a2 ; handle to text <37>
|
|
move.l (a2),a0 ; ptr to text <37>
|
|
move.b 0(a0,d6.w),d0 ; get character <37>
|
|
cmp.b #$20,d0 ; control char? <37>
|
|
blo.s @JustCut ; if so, don't synch <37>
|
|
move.b d1,-(sp) ; save scriptRedraw <37>
|
|
subq #2,sp ; room for return
|
|
move.l a0,-(sp) ; push text ptr on stack <37>
|
|
move.w d6,-(sp) ; offset on stack
|
|
_CharType ; what char is it
|
|
move.w (sp)+,d0 ; take result
|
|
move.b (sp)+,d1 ; recover scriptRedraw <37>
|
|
|
|
; Mask off what interested in: the Type ($000F) and the Direction ($2000) <34>
|
|
; Want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman <34>
|
|
; which can be smCharAscii (1) or smCharEuro (7) or smCharPunct (0). <34>
|
|
;
|
|
; New approach. Different behavior for bidi and non-bidi scripts, because of caret <37>
|
|
; requirements for bidi scripts. <37>
|
|
bne.s @doBidi ; check scriptRedraw for bidi <37>
|
|
; For non-bidirectional scripts, set keyboard to Roman for Roman letters, <37>
|
|
; sync to font for script letters, dont sync for anything else. <37>
|
|
and.w #smcTypeMask,d0 ; isolate info we need <37>
|
|
cmp.w #smCharPunct,d0 ; non-letter? <37>
|
|
beq.s @JustCut ; if so, don't synch keyboard <37>
|
|
cmp.w #smCharAscii,d0 ; low-ASCII Roman? <37>
|
|
beq.s @isRoman ; if so, go set keyboard <37>
|
|
cmp.w #smCharEuro,d0 ; Extended ASCII Roman? <37>
|
|
beq.s @isRoman ; if so, go set keyboard <37>
|
|
bra.s @UseFont ; otherwise, sync keyboard to font <37>
|
|
; For bidirectional scripts, don't synch control chars (stripped out above) or low-ASCII <37>
|
|
; (L-R) digits; synch other L-R chars to Roman, and everything else to font script. <37>
|
|
@doBidi ; <37>
|
|
and.w #smcTypeMask+smcClassMask+smcRightMask,d0 ; isolate info we need <37>
|
|
cmp.w #smCharPunct+smPunctNumber+smCharLeft,d0 ; is char a low-ASCII digit? <37>
|
|
beq.s @JustCut ; if so, don't synch <37>
|
|
and.w #smcRightMask,d0 ; now just check direction <37>
|
|
beq.s @isRoman ; if left-right, sync to Roman <37>
|
|
|
|
; Otherwise, synch the font to the script of the character <34>
|
|
@UseFont
|
|
subq #2,sp ; room for return
|
|
move.w teFont(a3),-(sp) ; app font id
|
|
_Font2script ; it's a non-roman char so get app font
|
|
; leave script on stack
|
|
bra.s @SetKbd
|
|
|
|
@isRoman move.w #smRoman,-(sp) ; we think it is roman
|
|
@SetKbd
|
|
move.w (sp), d0 ; script param on the stack
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0 ;
|
|
move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript
|
|
_KeyScript ; set keyboard
|
|
ENDIF
|
|
|
|
@JustCut
|
|
Move.L A4,-(SP) ; pass the handle
|
|
_TEDelete ; and cut it (A3 no good after)
|
|
|
|
epilog6 MoveQ #6,D0
|
|
Bra StdExit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; TEBufferText
|
|
; <30Jan89smb>
|
|
;
|
|
; Buffer input characters (graphic). This is to help performance for
|
|
; Asian systems.
|
|
;
|
|
; Input
|
|
; (a2) character (or half a character in the case of double-byte chars)
|
|
; to be buffered
|
|
;
|
|
; Uses a0,a1,d0
|
|
;----------------------------------------------------------------------
|
|
TEBufferText
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vTEBufferText(a0),a0
|
|
jmp (a0)
|
|
|
|
xTEBufferText
|
|
|
|
; does a pointer to a buffer already exist?
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
;; tst.w ExpandMemRec.emBufferLen(a1) ; <14Sept89smb> test for zero len <18>
|
|
tst.l ExpandMemRec.emBufferHandle(a1) ; test for no buffer (using handle now for consistency) <18>
|
|
bne.s @HaveBuffer
|
|
@GetBuffer
|
|
moveq #BufferSize,d0 ; longize <18>
|
|
bsr.s GetHandle ; allocate handle for buffer; in a0
|
|
; dereference the handle and save
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
move.l a0,ExpandMemRec.emBufferHandle(a1) ; save handle
|
|
|
|
@HaveBuffer
|
|
; if keybd changes in the middle of buffering must dump the buffer and synch the font to the keybd. <1/26/90smb>
|
|
; must set d0 to the current position before calling SetFont2Keyboard<2/28/90smb>
|
|
tst.w teSize(a3) ; check style flag
|
|
bpl.S @DontSet ; don't set style
|
|
move.w teSelStart(a3),d0 ; pass current position <2/28/90smb>
|
|
beq.s @SynchUp ; skip test if zero <2/28/90smb>
|
|
sub.w #1,d0 ; backup one to get previous style <2/28/90smb>
|
|
@SynchUp
|
|
bsr SetFont2Keyboard ; <1/26/90smb>
|
|
IF hasBufferingFix THEN ; <18>
|
|
move.l ExpandMem,a1 ; reload ExpandMem ptr <18>
|
|
; SetFont2Keyboard may have called DumpBuffer so test for a deallocated handle <18>
|
|
tst.l ExpandMemRec.emBufferHandle(a1) ; is this zero? <18>
|
|
beq.s @GetBuffer ; if so, then get another storage handle <18>
|
|
ENDIF ; <18>
|
|
|
|
@DontSet
|
|
move.l ExpandMemRec.emBufferHandle(a1),a0 ; get handle of storage space <13Nov89smb>
|
|
move.l (a0),a0 ; get to storage space <13Nov89smb>
|
|
IF hasBufferingFix THEN ; <18>
|
|
moveq #0,d0 ; longize <18>
|
|
ENDIF ; <18>
|
|
move.w ExpandMemRec.emBufferLen(a1),d0 ; <1Feb89smb> length = number of bytes already in buffer
|
|
; have we maxed out on the buffer?
|
|
cmpi.w #BufferSize,d0
|
|
bne.s @MoreRoom
|
|
bsr.s DumpBuffer
|
|
IF hasBufferingFix THEN ; <18>
|
|
tst.l ExpandMemRec.emBufferHandle(a1) ; the high byte of a char may be in the buffer <18>
|
|
beq.s @GetBuffer ; if empty then ok to get another handle <18>
|
|
ELSE ; <18>
|
|
bra.s @GetBuffer
|
|
ENDIF ; <18>
|
|
@MoreRoom
|
|
move.b 1(a2),(a0,d0.l) ; char in lower byte
|
|
addq.w #1,ExpandMemRec.emBufferLen(a1)
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetHandle
|
|
; <30Jan89smb>
|
|
; Allocate a handle.
|
|
;
|
|
; Input
|
|
; d0.l = number of bytes to allocate
|
|
; Output
|
|
; a0 = handle allocated
|
|
; Used by TEBufferText and GetStyleStorage.
|
|
;----------------------------------------------------------------------
|
|
GetHandle
|
|
_NewHandle ,SYS,CLEAR ; allocate and clear a block and return handle in a0 <21>
|
|
bne.s sysErr ; exit if system error
|
|
|
|
_HLock
|
|
bne.s CleanUp
|
|
|
|
rts
|
|
|
|
; OH NO!!!! can't get no memory!
|
|
CleanUp
|
|
; deallocate handle in a0
|
|
move.l d0,-(sp) ; save initial error
|
|
_DisposHandle
|
|
move.l (sp)+,d0 ; restore initial error
|
|
sysErr
|
|
_SysError ; go bye-bye with error in d0
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; DumpBuffer
|
|
; <30Jan89smb>
|
|
;
|
|
; Dump the text buffer. Either it's full or we've
|
|
; encountered a condition for dumping (teIdle, control char, etc.)
|
|
;----------------------------------------------------------------------
|
|
DumpBuffer
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vDumpBuffer(a0),a0
|
|
jmp (a0)
|
|
|
|
xDumpBuffer
|
|
|
|
dumpRegs reg d0-d7/a1-a2 ; don't save a3/a4! creating a dangling ptr w/ a3 <21>
|
|
movem.l dumpRegs,-(sp)
|
|
moveq.l #0,d3
|
|
move.l ExpandMem,a2 ; <1Feb89smb> buffer is 0 -> n-1
|
|
lea ExpandMemRec.emBufferLen(a2),a2 ; changed to lea <12July89smb>
|
|
move.w (a2),d2 ; buffer length, n
|
|
; test if buffer is empty
|
|
beq @Empty ; nothing to dump
|
|
|
|
; test last (n-1) character in buffer to see if is double-byte char
|
|
subq.w #1,d2
|
|
move.l ExpandMem,a1 ; <1Feb89smb> pointer to buffer of chars
|
|
move.l ExpandMemRec.emBufferHandle(a1),a1 ; <13Nov89smb>
|
|
move.l (a1),a1 ; deref for pointer <13Nov89smb>
|
|
|
|
; <12Sept89smb> we want the font of the last character in the buffer to be set in the grafport before calling CharByte.
|
|
movem.l a1/d2,-(sp) ; preserve, for unstyled too!<17Nov89smb>
|
|
tst.w teSize(a3) ; if unstyled, can't synch font to keyboard <12Sept89smb>
|
|
bpl.s @NoSynch ; <12Sept89smb>
|
|
move.w teSelStart(a3),d0 ; pass current position <12Sept89smb>
|
|
beq.s @ZeroOffset ; skip test if zero <12Sept89smb>
|
|
sub.w #1,d0 ; backup one to get previous style <12Sept89smb>
|
|
@ZeroOffset
|
|
; just need to use the current position's font: no need to call SetFont2Keyboard! <1/29/90smb>
|
|
;; <1/29/90smb> bsr SetFont2Keyboard ; <12Sept89smb>
|
|
bsr GetCurStyle ; <1/29/90smb>
|
|
bsr SetStyle ; <1/29/90smb>
|
|
movem.l (sp),a1/d2 ; restore but don't pop yet <13Nov89smb>
|
|
@NoSynch
|
|
clr.w -(sp) ; room for return
|
|
move.l a1,-(sp) ; use a1 now not the contents of it! <13Nov89smb>
|
|
move.w d2,-(sp) ; offset in buffer
|
|
_CharByte
|
|
move.w (sp)+,d7 ; pop result
|
|
movem.l (sp)+,a1/d2 ; restore <13Nov89smb>
|
|
tst.w d7 ; high byte of character?
|
|
bge.s @GoDump ; no
|
|
|
|
; yep, gotta save it
|
|
move.b (a1,d2.w),d3 ; changed to d2.w <7Dec89smb>
|
|
subq.w #1,(a2) ; new length to paste
|
|
beq.s @Only1Char ; short cut <13Nov89smb>
|
|
@GoDump
|
|
; must turn off buffering bit since PasteGuts calls TEPinScroll which calls StdEntry.
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),-(sp)
|
|
bclr #teFTextBuffering,newTEFlags+3(a0)
|
|
|
|
; setUp for buffer dump
|
|
move.l a1,d6 ; pointer to text to insert (for PasteGuts) <13Nov89smb>
|
|
moveq #0,d5 ; need high word cleared (for PasteGuts) <14Sept89smb>
|
|
move.w (a2),d5 ; length of text to insert
|
|
|
|
movem.l d3/a1/a2,-(sp)
|
|
moveq #0,d7 ; want to call ExtendStyle
|
|
bsr PasteGuts
|
|
movem.l (sp)+,d3/a1/a2
|
|
|
|
; restore buffering bit
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l (sp)+,newTEFlags(a0)
|
|
|
|
; test if need to rebuffer 1st byte of double-byte character.
|
|
tst.b d3 ; place holder for character
|
|
beq.s @DeleteHandle
|
|
; last byte in buffer was 1st byte of a double-byte charaacter. Rebuffer it.
|
|
move.b d3,(a1) ; <13Nov89smb>
|
|
@Only1Char
|
|
move.w #1,(a2) ; incr length for byte
|
|
bra.s @Empty
|
|
|
|
@DeleteHandle
|
|
; deallocate the handle
|
|
move.l ExpandMem,a0
|
|
move.l ExpandMemRec.emBufferHandle(a0),a0 ; get to handle! <19Sept89smb>
|
|
_DisposHandle
|
|
bne SysErr ; <19Sept89smb>
|
|
move.w #0,(a2) ; set buffer length to zero. Used as a flag.
|
|
IF hasBufferingFix THEN ; <18>
|
|
move.l ExpandMem,a0 ; length is initially zero so clear storage for handle <18>
|
|
clr.l ExpandMemRec.emBufferHandle(a0) ; flags a disposed handle <18>
|
|
ENDIF ; <18>
|
|
@Empty
|
|
movem.l (sp)+,dumpRegs
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE CursorMovement();
|
|
; <10Jan89smb>
|
|
;
|
|
; For mixed directional text, must do extensive testing to
|
|
; determine the next position for the cursor ( and to have the
|
|
; high caret in the position corresponding to the cursor
|
|
; movement) based on the arrow key struck. On entry we know that
|
|
; the teRecord has mixed-directional text.
|
|
;
|
|
; Entry
|
|
; d1 = arrow key
|
|
; d6 = teSelStart (current position of cursor)
|
|
; a2 = pointer to arrow key
|
|
; a3 = pointer to teRec
|
|
; Exit
|
|
; d6 = modified to reflect new character offset
|
|
;
|
|
; Register Usage
|
|
; d0 = scratch
|
|
; d1 = p, initially: m[p], where p = 0/1
|
|
; = r, finally: (previous) format run index
|
|
; d2 = q: m[q], where q = 1/0 (opposite of p)
|
|
; m[0] = 0: index to leftmost format on line (in fmtOrderingArray)
|
|
; m[1] = n: index to rightmost format on line (in fmtOrderingArray)
|
|
; d3 = start = 0/1 (opposite of end)
|
|
; d4 = end = 1/0 (opposite of start)
|
|
; d5 = character delta = -1/1
|
|
; d6 = character offset (input/output)
|
|
; d7 = format index delta = -1/1
|
|
;
|
|
; Assumptions for basis of conditions:
|
|
; m[0] = 0: index to leftmost format on line (in fmtOrderingArray)
|
|
; m[1] = n: index to rightmost format on line (in fmtOrderingArray)
|
|
; l[0] = lineStart
|
|
; l[1] = lineEnd
|
|
; f[i] = format run i
|
|
; f[i,0] = start offset for format run i
|
|
; f[i,1] = end offset for format run i
|
|
; cd = cursor direction; ld = line direction, c = char offset (d6)
|
|
;----------------------------------------------------------------------
|
|
CursorMovement
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vCursorMovement(a1),a1
|
|
jmp (a1)
|
|
|
|
xCursorMovement
|
|
|
|
CursorMoveRegs reg d2-d5/d7/a2
|
|
with CursorFrame,TEFormatOrder
|
|
link a6,#CursorFrameSz
|
|
movem.l CursorMoveRegs,-(sp)
|
|
|
|
; Initializations
|
|
sf FormatEndFlag(a6) ; <17Jan89smb>
|
|
|
|
; ***** cd = left? *****
|
|
cmpi.b #leftArrowChar,d1 ; left arrow? <2Aug89smb> cmp byte not word
|
|
beq.s @SetLeftCD
|
|
; right arrow
|
|
move.b #$FF,d0 ; cursor direction = right
|
|
move.w #1,d7 ; fmt run index delta (in cursor direction [R])
|
|
move.b #1,d2 ; q: m[q] = m[1] = n = rightmost fmt index boundary
|
|
moveq #0,d1 ; p: m[p] = m[0] = 0 = leftmost fmt index boundary
|
|
|
|
bra.s @GetLineDir
|
|
@SetLeftCD
|
|
moveq #0,d0 ; cursor direction = left
|
|
move.w #-1,d7 ; fmt run index delta (in cursor direction [L])
|
|
moveq #0,d2 ; q: m[q] = m[0] = 0 = leftmost fmt index boundary
|
|
move.b #1,d1 ; p: m[p] = m[1] = n = rightmost fmt index boundary
|
|
|
|
; ***** cd = ld? *****
|
|
@GetLineDir
|
|
; get line direction
|
|
cmp.b TESysJust,d0
|
|
beq.s @CDequalsLD
|
|
; CD <> LD: cursor direction <> line direction (left arrow, RL line dir; right arrow, LR line dir)
|
|
move.w #-1,d5 ; character delta
|
|
move.b #1,d3 ; start
|
|
moveq #0,d4 ; end
|
|
bra.s @NeedLine
|
|
@CDequalsLD
|
|
; CD = LD: cursor direction = line direction (left arrow, LR line dir; right arrow, RL line dir)
|
|
move.w #$1,d5 ; character delta
|
|
moveq #0,d3 ; start
|
|
move.b #1,d4 ; end
|
|
@NeedLine
|
|
; need to test line ends so get current line containing character offset
|
|
move.w d6,d0
|
|
lea teLines(a3),a2
|
|
movea.l a2,a0
|
|
bsr GetLine
|
|
|
|
; special case! if at end of document (test if on last line) and cd <> ld don't
|
|
; want to add charDelta<17Jan89smb>
|
|
move.w teNLines(a3),d0 ; number of lines
|
|
lsl.w #1,d0
|
|
add.w d0,a0 ; want end of last line
|
|
cmpa.l a0,a2 ; on last line?
|
|
bne.s @OtherLineStuff
|
|
tst.b d5
|
|
blt @done ; at EOD, done.
|
|
|
|
@OtherLineStuff
|
|
; yet another special case! If at the lineStart, and cd = ld, then want to be on
|
|
; previous line. <16Jan89smb>
|
|
cmp.w (a2),d6
|
|
bne.s @OnCorrectLine ; not at lineStart
|
|
cmpi.w #0,d6
|
|
beq.s @OnCorrectLine ; not beginning of text
|
|
tst.b d5
|
|
blt.s @OnCorrectLine ; cd <> ld
|
|
subq #2,a2 ; previous line
|
|
@OnCorrectLine
|
|
movem.w d1/d2,-(sp)
|
|
bsr GetFormatOrdering ; <8Mar89smb>
|
|
movem.w (sp)+,d1/d2 ; restore
|
|
|
|
; ***** if c = l[s] then c = c *****
|
|
; if s = 0, then l[s] = lineStart
|
|
; if s = 1, then l[s] = lineEnd
|
|
move.b d3,d0 ; start
|
|
bsr TestLineEnds
|
|
bne @done ; c = c. done
|
|
|
|
; ***** if c = l[e] then r1 = m[p] *****
|
|
; if e = 0, then l[e] = lineStart
|
|
; if e = 1, then l[e] = lineEnd
|
|
move.b d4,d0 ; end
|
|
bsr TestLineEnds
|
|
beq.s @FindRun
|
|
; ***** r1 = m[p] *****
|
|
; d1 = p as input
|
|
bsr SetRun ; returns d1.w = r1: leftmost or rightmost format
|
|
; ***** d(r1) = ld? *****
|
|
bsr TestRunDirection ; d1 = r1 (format index)
|
|
bne @CSubDelta ; True: equal
|
|
bra @OneCharacterTest
|
|
@FindRun
|
|
; find r s.t. f[r,0]<c<f[r,1] OR
|
|
; ((f[r,0]=c or f[r,1]=c) AND IF on a cluster boundary then d(r)=ld
|
|
; Else find r s.t. c = f[r,e])
|
|
bsr FindStyleRun ; returns a0 pointing to style run of d6, d1 = r
|
|
cmp.w startChar(a0),d6
|
|
beq.s @OnBoundary
|
|
bsr FixFormatEnd ; <17Jan89smb> if last format run, must decrement
|
|
cmp.w d0,d6 ; <17Jan89smb>
|
|
bcs.s @InMiddle ; <17Jan89smb> <26June89smb> made unsigned
|
|
st FormatEndFlag(a6) ; <17Jan89smb> on end of style run
|
|
@OnBoundary
|
|
; on boundary: test for cluster boundary <17Jan89smb>
|
|
; get this style run's script direction
|
|
movem.l d1/d2,-(sp) ; save r (d1) and style
|
|
bsr GetDirection
|
|
move.b d1,d0
|
|
movem.l (sp)+,d1/d2 ; <20Jan89smb>
|
|
cmp.b TESysJust,d0 ; <20Jan89smb>
|
|
beq @TakeRightBranch ; <20Jan89smb>
|
|
move.b d0,RunDirection(a6) ; <20Jan89smb>
|
|
|
|
; get other boundary style run
|
|
tst.b FormatEndFlag(a6) ; test if at start or end of style run
|
|
bne.s @GetNextRun ; at end of this style run
|
|
; at start of this style run so get previous style run in backing-store order
|
|
subq.l #stStartSize,a0
|
|
bra.s @GetScriptDir
|
|
@GetNextRun
|
|
; get next style run in backing-store since at end of this style run
|
|
addq.l #stStartSize,a0
|
|
@GetScriptDir
|
|
; get the other style run's script direction
|
|
movem.l d1/d2,-(sp) ; save r (d1) and style
|
|
bsr GetDirection
|
|
move.b d1,d0
|
|
movem.l (sp)+,d1/d2
|
|
; compare script directions to see if on a cluster boundary
|
|
cmp.b RunDirection(a6),d0
|
|
bne.s @ClusterBoundary
|
|
|
|
; On a style run boundary with both runs of the same script <17Jan89smb>
|
|
; ***** d(r) = ld? *****
|
|
; d(r) <> ld so find r s.t. c = f[r,e]
|
|
; get original boundary style again <25June89smb>
|
|
tst.b FormatEndFlag(a6) ; test if at start or end of style run
|
|
bne.s @GetPrevRun ; at end of this style run
|
|
; at start of this style run so get previous style run in backing-store order
|
|
add.l #stStartSize,a0
|
|
bra.s @TestStylEnd
|
|
@GetPrevRun
|
|
; get next style run in backing-store since at end of this style run
|
|
subq.l #stStartSize,a0
|
|
@TestStylEnd
|
|
move.w d1,-(sp) ; save original r
|
|
move.b d4,d1 ; end
|
|
move.w d6,d0 ; save d6
|
|
bsr GetStyleEnd ; returns style start or end in d6
|
|
move.w (sp)+,d1 ; restore r
|
|
exg d6,d0 ; want original char offset in d6
|
|
cmp.w d0,d6 ; does c = f[r,e]?
|
|
beq.s @GetNewIndex ; yep
|
|
bsr FindStyleRun ; d1 = r s.t. c = f[r,e]
|
|
|
|
@GetNewIndex
|
|
; ***** r1 = r + fmtDelta *****
|
|
add.w d7,d1 ; format delta
|
|
bra.s @NewFmtIndex ; <20Jan89smb> must check for 1 char in style run
|
|
|
|
@ClusterBoundary
|
|
; find r s.t. (f[r,0]=c or f[r,1]=c) AND d(r)=ld <17Jan89smb>
|
|
; Since the character is on a cluster boundary, we want the style run with it's
|
|
; direction = the line direction (LD).
|
|
; ***** d(r) = ld? *****
|
|
bsr FindStyleRun ; find other boundary run with d(r) = ld; d1 = r
|
|
bra.s @TakeRightBranch ; True: d(r) = ld
|
|
|
|
@InMiddle
|
|
; firmly in the middle. Test the line direction to determine the branch to take <17Jan89smb>
|
|
; ***** d(r) = ld? *****
|
|
bsr TestRunDirection ; does the direction of the run = line direction?
|
|
bne.s @TakeRightBranch ; True: d(r) = ld
|
|
; d(r) <> ld
|
|
; ***** c <> f[r,e] - charDelta? ***** are we one away from a style boundary?
|
|
move.w d1,-(sp)
|
|
move.b d4,d1 ; end
|
|
move.w d6,d0 ; save d6
|
|
bsr GetStyleEnd ; returns style start or end in d6
|
|
move.w (sp)+,d1
|
|
|
|
; must adjust for double-byte characters <2Sept89smb>
|
|
movem.l a0/d0-d3,-(sp) ; save <2Sept89smb>
|
|
move.w d5,d3 ; <2Sept89smb>
|
|
neg.w d3 ; <2Sept89smb>
|
|
; f[r,e] - charDelta (where the delta may be -2/2 rather than -1/1)
|
|
Bsr DoubleByte ; <2Sept89smb>
|
|
movem.l (sp)+,a0/d0-d3 ; <2Sept89smb>
|
|
exg d6,d0 ; want original char offset in d6
|
|
;;<2Sept89smb> sub.w d5,d0 ; character delta
|
|
cmp.w d0,d6
|
|
;------------------------------------------------------------------------------------
|
|
; must pin to line end to get correct offset, so to truly be done: <22Nov89smb>
|
|
; c <> l[e] - charDelta
|
|
beq.s @TstFmtIndeces ; <22Nov89smb>
|
|
; if e = 0, then l[e] = lineStart
|
|
; if e = 1, then l[e] = lineEnd
|
|
move.w 2(a2),d0 ; assume e=1 so use lineEnd ; <22Nov89smb>
|
|
cmpi.b #0,d4 ; end ; <22Nov89smb>
|
|
beq.s @IsLineStart ; <22Nov89smb>
|
|
bra.s @SubDelta ; <22Nov89smb>
|
|
@IsLineStart
|
|
move.w (a2),d0 ; <22Nov89smb>
|
|
@SubDelta
|
|
sub.w d5,d0 ; - charDelta <22Nov89smb>
|
|
cmp.w d6,d0 ; <22Nov89smb>
|
|
bne @CAddDelta ; done
|
|
;-----------------------------------------------------------------------------------
|
|
|
|
@TstFmtIndeces
|
|
; ***** r = m[q]? *****
|
|
; in the leftmost or rightmost format? test format indeces
|
|
move.w d1,d0 ; save r(n)
|
|
move.b d2,d1 ; q
|
|
bsr SetRun ; returns m[q] in d1.w (0/n)
|
|
cmp.w d0,d1
|
|
beq.s @CUseLineSt ; yep, r = m[q]: c = l[s]
|
|
|
|
; ***** r1 = r + fmtDelta *****
|
|
add.w d7,d0 ; format delta
|
|
move.w d0,d1 ; want r1 in d1
|
|
; ***** d(r1) = ld? *****
|
|
@NewFmtIndex
|
|
bsr TestRunDirection ; does the direction of the run = line direction?
|
|
beq.s @CAddDelta ; False: d(r1) <> ld ; c = c + CharDelta ; True: d(r1) = ld
|
|
; ***** c = f[r1,e] *****
|
|
move.b d4,d1 ; end
|
|
bsr GetStyleEnd ; returns new char offset in d6
|
|
bra.s @done
|
|
|
|
@TakeRightBranch
|
|
; (either on a boundary or firmly in the middle) AND d(r) = ld
|
|
; ***** c <> f[r,s]? *****
|
|
tst.b d3 ; start
|
|
bne.s @EndOffset ; s = 1
|
|
; c <> f[r,0]? => start offset for format run r
|
|
cmp.w startChar(a0),d6
|
|
bne.s @CSubDelta
|
|
bra.s @TestFmtArrayEnds
|
|
@EndOffset
|
|
; c <> f[r,1]? => end offset for format run r
|
|
bsr FixFormatEnd ; <17Jan89smb> if last format run, must decrement
|
|
cmp.w d0,d6
|
|
bne.s @CSubDelta
|
|
|
|
@TestFmtArrayEnds
|
|
; ***** r = m[q]? *****
|
|
; in the leftmost or rightmost format? test format indeces
|
|
move.w d1,d0 ; save r(n)
|
|
move.b d2,d1 ; q
|
|
bsr.s SetRun ; returns m[q] in d1.w (0/n)
|
|
cmp.w d0,d1
|
|
beq.s @done ; yep, r = m[q]: c = c
|
|
; ***** r1 = r + fmtDelta *****
|
|
add.w d7,d0 ; format delta
|
|
move.w d0,d1 ; want r1 in d1
|
|
; ***** d(r1) = ld? *****
|
|
bsr.s TestRunDirection ; does the direction of the run = line direction?
|
|
bne.s @CSubDelta ; True: equal
|
|
|
|
@OneCharacterTest
|
|
; no, style run direction <> line direction
|
|
; ***** f[r1,1] - f[r1,0] <> 1? *****
|
|
; test if there is only one character in the run.
|
|
; move.w stStartSize(a0),d0 ; <17Jan89smb>
|
|
bsr FixFormatEnd ; <17Jan89smb> if last format run, must decrement
|
|
sub.w startChar(a0),d0
|
|
cmpi.w #1,d0
|
|
bhi.s @CUseStartDelta ; c = f[r1,s] + charDelta <26June89smb> made unsigned
|
|
|
|
; ***** r1 = m[q]? *****
|
|
; in the leftmost or rightmost format? test format indeces
|
|
move.w d1,d0 ; save r(n)
|
|
move.b d2,d1 ; q
|
|
bsr.s SetRun ; returns m[q] in d1.w (0/n)
|
|
cmp.w d0,d1
|
|
beq.s @CUseStart ; terminator is direction test
|
|
; ***** r2 = r1 + fmtDelta *****
|
|
add.w d7,d0 ; format delta
|
|
move.w d0,d1 ; want r1 in d1
|
|
; ***** d(r2) = ld? *****
|
|
bsr.s TestRunDirection ; does the direction of the run = line direction?
|
|
beq.s @CUseStartDelta ; d(r2) <> ld: c = f[r1,s] + charDelta
|
|
@CUseStart
|
|
; ***** c = f[r1,s] ******
|
|
move.b d3,d1 ; start
|
|
bsr GetStyleEnd ; returns new char offset in d6
|
|
bra.s @done
|
|
|
|
@CUseStartDelta
|
|
;***** c = f[r1,s] + charDelta *****
|
|
move.b d3,d1 ; start
|
|
bsr.s GetStyleEnd ; returns new char offset in d6
|
|
bra.s @CAddDelta
|
|
|
|
@CUseLineSt
|
|
; ***** c = l[s] *****
|
|
; sf teLftCaret(A3) ; set so will go to previous line in DoCaret
|
|
move.b d3,d1 ; start
|
|
tst.b d1
|
|
bne.s @UseLineEnd
|
|
; c = l[0] = lineStart
|
|
move.w (a2),d6
|
|
bra.s @done
|
|
@UseLineEnd
|
|
; c = l[1] = lineEnd
|
|
move.w 2(a2),d6
|
|
bra.s @done
|
|
;;@CSubDelta
|
|
;;<2Sept89smb> sub.w d5,d6 ; c = c-charDelta(a6)
|
|
;;<2Sept89smb> bra.s @done
|
|
|
|
;;@CAddDelta
|
|
;;<2Sept89smb> add.w d5,d6 ; c = c+charDelta(a6)
|
|
|
|
; if double-byte character fix the offset posn.<2Sept89smb>
|
|
@CSubDelta
|
|
neg.w d5 ; <2Sept89smb>
|
|
@CAddDelta
|
|
move.w d5,d3 ; DoubleByte wants charDelta here <2Sept89smb>
|
|
Bsr DoubleByte ; <2Sept89smb>
|
|
@done
|
|
movem.l (sp)+,CursorMoveRegs
|
|
unlk a6
|
|
rts
|
|
endWith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TestLineEnds();
|
|
; Test whether the character offset is the lineStart or lineEnd.
|
|
; Entry
|
|
; d0.b = start or end
|
|
; a2 = line containing character offset (d6)
|
|
; Exit
|
|
; d0.b = T/F
|
|
; condition codes set accordingly
|
|
;----------------------------------------------------------------------
|
|
TestLineEnds
|
|
; ***** test if c = l[s] or c = l[e] *****
|
|
cmpi.b #0,d0 ; l[0] = lineStart; l[1] = lineEnd
|
|
bne.s @testEnd
|
|
; test lineStart now
|
|
cmp.w (a2),d6
|
|
bne.s @done
|
|
st d0
|
|
bra.s @done
|
|
@testEnd
|
|
clr.b d0
|
|
; test lineEnd now
|
|
cmp.w 2(a2),d6
|
|
bne.s @done
|
|
st d0 ; c = c. done.
|
|
@done
|
|
tst.b d0 ; <6Mar89smb>
|
|
rts
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetRun();
|
|
; Set the format run index from the first or last format on the
|
|
; line.
|
|
; Entry
|
|
; d1.b = format index boundary (0 = leftmost, 1 = rightmost)
|
|
; Exit
|
|
; d1.w = 0 or n, where n = number of runs
|
|
;----------------------------------------------------------------------
|
|
SetRun
|
|
; r = m[d1]
|
|
tst.b d1
|
|
bne.s @RightMost
|
|
; r = m[0] = 0 = first (leftmost) format
|
|
moveq #0,d1 ; r1 = 0
|
|
bra.s @done
|
|
@RightMost
|
|
; r = m[1] = n = last (rightmost) format
|
|
move.w numberOfRuns(a6),d1 ; r1 = n
|
|
subq.w #1,d1
|
|
@done
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TestRunDirection();
|
|
; Determine if the direction of the style run is equal to the
|
|
; direction of the line.
|
|
; Entry
|
|
; d1 = format index
|
|
; Exit
|
|
; d0.b = T/F
|
|
; condition codes set accordingly
|
|
;----------------------------------------------------------------------
|
|
TestRunDirection
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vTestRunDirection(a1),a1
|
|
jmp (a1)
|
|
|
|
xTestRunDirection
|
|
|
|
; ***** d(r) = ld? *****
|
|
movem.w d1/d2,-(sp)
|
|
move.w d1,fmtOrderingIndex(a6) ; d1 = r
|
|
bsr GetNextDisplayStyle ; r is index into FmtOrderingArray
|
|
; does the direction of this style run = line direction?
|
|
clr.w d0 ; result register
|
|
bsr GetDirection
|
|
cmp.b TESysJust,d1
|
|
bne.s @done ; not equal
|
|
st d0 ; T
|
|
@done
|
|
movem.w (sp)+,d1/d2 ; restore
|
|
tst.b d0 ; <6Mar89smb>
|
|
rts
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetStyleEnd();
|
|
; Set the new character offset as the format's start or end
|
|
; offset, depending on value in d0.
|
|
;
|
|
; Entry
|
|
; d1 = indicator for start or end position of format run
|
|
; a0 = ptr to current style run
|
|
; Exit
|
|
; d6 = f[r1,d1]
|
|
; d0 preserved
|
|
;----------------------------------------------------------------------
|
|
GetStyleEnd
|
|
move.w d0,-(sp) ; <17Jan89smb>
|
|
tst.b d1
|
|
bne.s @UseEnd
|
|
; f[r1,0] = start offset for format run at format index r1.
|
|
move.w startChar(a0),d6
|
|
; must pin style run to lineStart! <26Nov89smb>
|
|
cmp.w (a2),d6
|
|
bhs.s @done ; style start on this line <26Nov89smb>
|
|
move.w (a2),d6 ; use lineStart <26Nov89smb>
|
|
bra.s @done
|
|
|
|
@UseEnd
|
|
; f[r1,1] = end offset for format run at format index r1.
|
|
; move.w stStartSize(a0),d6 ; new character offset
|
|
bsr.s FixFormatEnd ; <17Jan89smb> if last format run, must decrement
|
|
move.w d0,d6 ; <17Jan89smb>
|
|
|
|
; must pin style run to line end if it breaks across the line! <26Nov89smb>
|
|
cmp.w 2(a2),d6 ; <26Nov89smb>
|
|
bls.s @done ; <26Nov89smb>
|
|
move.w 2(a2),d6 ; <26Nov89smb>
|
|
@done
|
|
move.w (sp)+,d0 ; restore <17Jan89smb>
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE FixFormatEnd()
|
|
; <17Jan89smb>
|
|
; If in the last format run in the record want the real end
|
|
; of the run, which is style end - 1.
|
|
;
|
|
; Input:
|
|
; a0 = pointer to style run
|
|
; Output:
|
|
; d0 = correct end to use
|
|
;----------------------------------------------------------------------
|
|
FixFormatEnd
|
|
|
|
move.w stStartSize(a0),d0 ; check for last format run in record
|
|
cmp.w teLength(a3),d0
|
|
bls.s @done ; not in last format run so use style end <26June89smb> made unsigned
|
|
move.w teLength(a3),d0 ; in last format: use real end of run
|
|
@done
|
|
rts
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE FindStyleRun();
|
|
; <17Jan89smb>
|
|
; Find r s.t. f[r,0] <= c <= f[r,1]
|
|
;
|
|
; Input
|
|
; d6 = character offset
|
|
; Output
|
|
; a0 = pointer to style run containing d6
|
|
; d1 = r = fmtOrderingIndex(a6) - 1
|
|
;----------------------------------------------------------------------
|
|
FindStyleRun
|
|
|
|
with CursorFrame,TEFormatOrder
|
|
@RunLoop
|
|
bsr GetNextDisplayStyle
|
|
move.w fmtOrderingIndex(a6),d1
|
|
addq #1,fmtOrderingIndex(a6) ; incr the style run counter
|
|
cmp.w startChar(a0),d6
|
|
bhi.s @CheckUpperBound ; in middle? <26June89smb> made unsigned
|
|
beq.s @done
|
|
bra.s @RunLoop
|
|
@CheckUpperBound
|
|
bsr.s FixFormatEnd ; <17Jan89smb> if last format run, must decrement
|
|
cmp.w d0,d6 ; <17Jan89smb>
|
|
bhi.s @RunLoop ; <26June89smb> made unsigned
|
|
@done
|
|
rts
|
|
endwith
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE BufferChar();
|
|
; Test if inputing a double-byte character; if so, buffer the first byte,
|
|
; get the next byte, and then insert as a double-byte character
|
|
;
|
|
; On input,
|
|
; A2 points to word containing character (char in lower half)
|
|
; D6 points to character to insert (differs from A2 by +1)
|
|
; D5 contains the length of the character
|
|
; If processing a double-byte char, TwoByteCharBuffer in TEDispatchRec
|
|
; may contain the high byte of the character.
|
|
; On output,
|
|
; A2 unchanged
|
|
; If processing a double-byte character,
|
|
; - and have the first byte, D5 and D6 unchanged
|
|
; - if the second byte,
|
|
; D6 - points to the address of emBufferHandle
|
|
; D5 - set to 2, length of character.
|
|
; Condition codes set for test upon return.
|
|
;
|
|
; A0, D0 used as scratch.
|
|
;
|
|
; ** Created 3May88 by SMB **
|
|
;
|
|
;----------------------------------------------------------------------
|
|
BufferChar
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vBufferChar(a0),a0
|
|
jmp (a0)
|
|
|
|
xBufferChar
|
|
;----------------------------------------------------------------------
|
|
; now buffering a double-byte character in the newTEFlags space off the dispatch record. <1/9/90smb> move.l teDispatchH(a3),a0
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
lea TwoByteCharBuffer(a0),a0 ; move into reg for modulo 32 bit ops
|
|
tst.b (a0) ; test for existance of first byte
|
|
beq.s Empty
|
|
; have 2nd byte now - paste!
|
|
move.b 1(a2),1(a0) ; 2nd byte of double byte char
|
|
move.l a0,d6 ; pointer to 2byte character (f. PasteGuts)
|
|
add.w #1,d5 ; length = 2 bytes (f. PasteGuts), sets cc for rts
|
|
bra.s GoPaste
|
|
|
|
Empty ; possible first byte of 2 byte char
|
|
move.b 1(a2),(a0) ; buffer character; 2 byte?
|
|
tst.w teSize(A3) ; check style flag
|
|
bpl.S @DontSet ; don't set style
|
|
|
|
move.w teSelStart(a3),d0 ; pass current position
|
|
beq.s @1 ; skip test if zero
|
|
sub.w #1,d0 ; backup one to get previous style
|
|
@1
|
|
; On a Kanji script system when the styled teRec is created, the current grafport's font is
|
|
; the font in the initial style run of 0 characters. If it's created with a Roman
|
|
; font and then the keyboard is switched to Japanese to enter Kanji, via the input window
|
|
; (different unstyled teRec), the font for the 0th posn is still Roman, rather than Kanji,
|
|
; when it's used here. Hence must set the grafport via the SetFont2Keyboard code. <2Sept89smb>
|
|
|
|
bsr.s SetFont2Keyboard ; <2Sept89smb>
|
|
@DontSet
|
|
; now test with charbyte
|
|
clr.w -(sp) ; room for return
|
|
move.l d6,-(sp) ; pointer to character
|
|
move.w #0,-(sp) ; offset in buffer
|
|
_CharByte
|
|
tst.w (sp)+ ; high byte of character?
|
|
GoPaste
|
|
rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DoubleByte();
|
|
; on input,
|
|
; d3 contains a value (1, -1) that represents the incremental
|
|
; direction to move
|
|
; d6 current position in selection range (teSelStart or teSelEnd)
|
|
;
|
|
; ** Created 2May88 by SMB **
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
DoubleByte
|
|
; check for double-byte characters and fix starting point. <27June88smb>
|
|
|
|
; find the font!
|
|
|
|
add.w d3,d6 ; fix position
|
|
tst.w teSize(A3) ; check style flag
|
|
bpl.S @DontSet ; don't set style
|
|
|
|
move.w d6,d0 ; pass current position
|
|
bsr GetCurStyle ; current style ptr in a0
|
|
bsr SetStyle ; set grafport style from current
|
|
@DontSet
|
|
; now test with charbyte
|
|
|
|
clr.w -(sp) ; room for return
|
|
move.l teTextH(a3),a0 ; get handle
|
|
move.l (a0),-(sp) ; pointer to start of text
|
|
move.w d6,-(sp) ; offset in text
|
|
_CharByte
|
|
tst.w (sp)+ ; middle of character?
|
|
ble.s @Done ; no, continue
|
|
add.w d3,d6 ; fix position
|
|
@Done
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ExtendStyle
|
|
;
|
|
; ** Added 6/6/86 by MBK **
|
|
;
|
|
; Handles deletion or extension of styles.
|
|
;
|
|
; Entry:
|
|
; D5 length of text being inserted (preserved)
|
|
;
|
|
;----------------------------------------------------------------------
|
|
ExtendStyle
|
|
Move.W D5,-(SP) ; save length
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @1 ; quit if not
|
|
|
|
; get selStart, selEnd and see if it's an insertion pt
|
|
|
|
Bsr SelSort ; sorts selStart, selEnd
|
|
Move.W D0,D1 ; selEnd
|
|
Swap D0 ; selStart in low byte now
|
|
Cmp.W D0,D1 ; is it an insertion pt?
|
|
Beq.S @0 ; no styles to delete if so
|
|
|
|
; If insertion is replacing a selection, you want to use the style of the
|
|
; first character of the selection (whereas if it's an insertion pt, you
|
|
; use the previous character's style).
|
|
|
|
SubQ #1,D5 ; dec insertion length
|
|
AddQ #1,D0 ; pt to next char
|
|
|
|
Bsr DeleteStyle ; else, delete excess styles from selStart+1 -> selEnd
|
|
|
|
@0 Tst.W D5 ; anything to insert?
|
|
Beq.S @1 ; you're done if not
|
|
|
|
SubQ #1,D0 ; pre-decrement
|
|
Bsr GetCurStyle ; else get current style
|
|
Bsr RecalStStarts ; update style starts
|
|
|
|
@1 Move.W (SP)+,D5 ; restore length
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; SetFont2Keyboard
|
|
;
|
|
; <5Sept89smb>
|
|
;
|
|
; When get a key and keyboard is different from font @ teSelStart
|
|
; change the font to match the keyboard. Will never come here
|
|
; for an unstyled teRecord.
|
|
;
|
|
; Entry:
|
|
; d0 = teSelStart (or one posn before it)
|
|
; Uses:
|
|
; d0,d1,a0,a1. Preserves d4,a2
|
|
;----------------------------------------------------------------------
|
|
SetFont2Keyboard
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vSetFont2Keyboard(a0),a0
|
|
jmp (a0)
|
|
|
|
xSetFont2Keyboard
|
|
bsr GetCurStyle
|
|
; if only 1 script installed none of this is necessary
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1)
|
|
beq @Done ; only one script => keyboard set just fine!
|
|
|
|
movem.l d4/a2,-(sp) ; save
|
|
; get the keyboard script
|
|
move.l a0,a2 ; save style ptr
|
|
clr.l -(sp)
|
|
move.w #smKeyScript,-(sp) ; verb
|
|
_GetEnvirons
|
|
move.l (sp)+,d4 ; actually only a word
|
|
|
|
;---------------------------------------------------------------------------------
|
|
; If have an unsynchronized font & keyboard, and the KeyScript is not Roman, then synchronize
|
|
; the font and keyboard. <3Dec89smb>
|
|
move.l ExpandMem,a0
|
|
tst.b ExpandMemRec.emUnsynchedFlag(a0)
|
|
beq.s @TstNullStyle ; bra if synched up
|
|
; we are unsynchronized but are the keyScripts different?
|
|
sf ExpandMemRec.emUnsynchedFlag(a0) ; assume will synch up
|
|
cmp.w #smRoman,d4 ; if unsynchronized, the keyScript was Roman
|
|
bne.s @TstNullStyle ; bra if want to synch up ?
|
|
|
|
st ExpandMemRec.emUnsynchedFlag(a0) ; don't synch up
|
|
move.w styleIndex(a2),d0 ; get index to styleRec
|
|
bsr GetStyle ; get the styleRec in a0
|
|
move.l a0,-(sp) ; temp save
|
|
move.l a2,a0 ; restore current style ptr
|
|
bsr SetStyle ; set the grafport; preserves a0
|
|
move.l (sp)+,a0 ; restore styleRec
|
|
move.w stFont(a0),d0 ; want current font here when branch!
|
|
bra.s @SetFont ; bra if equ: want to stay unsynched
|
|
|
|
; the new keyScript is non-Roman and we're currently unsynchronized so synch up
|
|
@TstNullStyle
|
|
;---------------------------------------------------------------------------------
|
|
IF NOT hasBufferingFix THEN ; <18>
|
|
; before synchronizing dump the text buffer: could change the keyboard in the middle of buffering <1/26/90smb>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFTextBuffering,d0
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
ENDIF ; <18>
|
|
|
|
; if a null style exists and it's font corresponds to the keyScript, use it!
|
|
bsr AnyNullStyle ; returns a0 pointing to the null scrap record; cc's set
|
|
beq.s @styleLoop ; nope
|
|
lea scrpStyleTab(a0),a0 ; point to start of table
|
|
|
|
; must test if font is of the same script before using it
|
|
move.l a0,-(sp) ; save scrpStyleTab
|
|
sub.w #2,sp ; allocate return, 1 int
|
|
move.w scrpFont(a0),-(sp) ; scrpFont
|
|
_Font2Script ; get script from font
|
|
move.w (sp)+,d1 ; fontScript
|
|
move.l (sp)+,a0 ; restore scrpStyleTab
|
|
move.w scrpFont(a0),d0 ; want current font here when branch!
|
|
|
|
cmp.w d1,d4 ; is the scrpFont's script = the keyscript?
|
|
beq.s @SetFont ; already rsrved but must write to grafport
|
|
|
|
IF hasBufferingFix THEN ; <18>
|
|
; before synchronizing dump the text buffer: could change the keyboard in the middle of buffering <1/26/90smb>
|
|
; Dump here rather than inside the styleLoop below and after we are sure that things aren't synched.<18>
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d0 ; move into reg for modulo 32 bit ops
|
|
btst #teFTextBuffering,d0
|
|
beq.s @noBuffer
|
|
bsr DumpBuffer ; dump text from buffer
|
|
@noBuffer
|
|
ENDIF ; <18>
|
|
|
|
; no null style exists or bad font
|
|
; d4.b = the keyScript
|
|
; a2.l = the current style ptr.
|
|
|
|
; Test if the current font is the correct script If not, use the keyScript to determine
|
|
; a font to use. Will find the font by looking back in the styleRun array until we find
|
|
; a font whose script corresponds to the keyScript. If none exist, we'll use the script
|
|
; system's default font.
|
|
|
|
@styleLoop
|
|
move.w styleIndex(a2),d0 ; get index to styleRec
|
|
bsr GetStyle ; get the styleRec in a0
|
|
move.l a0,-(sp) ; temp save
|
|
|
|
; set the grafport now since in the case of a selection SetRsrved does nothing (must set for BufferChar).
|
|
move.l a2,a0 ; restore a0
|
|
bsr SetStyle ; preserves a0
|
|
sub.w #2,sp ; allocate return, 1 int
|
|
_FontScript ; get script from font in grafport
|
|
move.w (sp)+,d1 ; fontScript
|
|
move.l (sp)+,a0 ; restore styleRec
|
|
move.w stFont(a0),d0 ; want current font here when branch!
|
|
|
|
; test if the keyboard script is the same as the fontScript
|
|
cmp.w d1,d4 ; is the font's script = the keyscript?
|
|
beq.s @SetFont ; yep, use it.
|
|
|
|
cmpi.w #0,startChar(a2) ; are we at the start of the styleRun array yet?
|
|
beq.s @UseKbdScript ; yes.
|
|
subq #stStartSize,a2 ; no, next!
|
|
bra.s @styleLoop
|
|
|
|
@UseKbdScript
|
|
; no more styles to check, use script system's application font
|
|
clr.l -(sp) ; allocate return
|
|
move.w d4,-(sp) ; script
|
|
;; move.w #smScriptSysFond,-(sp) ; verb
|
|
move.w #smScriptAppFond,-(sp) ; verb: use application font <3Dec89smb>
|
|
_GetScript
|
|
move.l (sp)+,d0 ; font is only a word
|
|
|
|
@SetFont
|
|
; are we replacing a selection? <6Sept89smb>
|
|
move.w teSelStart(a3),d1 ; get selection start
|
|
cmp.w teSelEnd(a3),d1 ; same as selEnd?
|
|
beq.s @notSelection
|
|
; is a selection so delete selection and then set
|
|
move.l d0,d4 ; save the font
|
|
move.l a4,-(sp) ; pass the handle
|
|
_TEDelete
|
|
move.l d4,d0 ; restore the font and set it!
|
|
@notSelection
|
|
; load new font as in textStyle.tsFont
|
|
; d0 = font to use
|
|
move.l ExpandMem,a0 ; textStylePtr: actually only font attribute
|
|
move.w d0,ExpandMemRec.emNewFont(a0)
|
|
move.l a0,a2
|
|
lea ExpandMemRec.emNewStyle(a2),a2
|
|
lea ExpandMemRec.emNewFont(a0),a0
|
|
; redraw flag and mode already set at init time above
|
|
move.l a0,2(a2) ; only stuffed the font: need address of emNewFont
|
|
bsr SetRsrved ; call this routine, which TESetStyle calls
|
|
movem.l (sp)+,d4/a2
|
|
@Done
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ClickKeyboard2Font
|
|
;
|
|
; <3Dec89smb>
|
|
;
|
|
; When click in Roman text (whether as an insertion point or selection),
|
|
; in a non-Roman font, set the keyboard to Roman. This is the only
|
|
; time we will allow an unsynchronized font and keyboard. Used by TEClick
|
|
; and TESetSelect since for hit-down or cursor movement.
|
|
; This is only used for styled text.
|
|
;
|
|
; ENTRY
|
|
; The font must have been set in the grafport upon entry
|
|
; d0 = the current char offset or teSelStart
|
|
; USES
|
|
; a1,d0-d2
|
|
; preserves a0/d3/d4
|
|
;----------------------------------------------------------------------
|
|
ClickKeyboard2Font
|
|
|
|
; if only 1 script installed none of this is necessary
|
|
movem.l a0/a2/d3/d4,-(sp) ; save style ptr <34> added a2 for text ptr
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1)
|
|
beq @done ; only one script => keyboard set just fine!
|
|
|
|
move.w d0,d3 ; char offset to use for synching <3Dec89smb>
|
|
; get the script (the font must have been set in the grafport already)
|
|
sub.w #2,sp ; allocate return, 1 int
|
|
_FontScript ; get script from font in grafport
|
|
;---------------------------------------------------------------------
|
|
; Will now allow a Roman keyboard and a non-Roman font for hit-down; KanjiTalk wants
|
|
; to be able to input Roman text from a Kanji font <3Dec89smb>
|
|
|
|
; if we're in single-byte Roman text, and the font is non-Roman then
|
|
; want keyboard to be Roman <3Dec89smb>
|
|
move.l ExpandMem,a0 ; initialize to false <3Dec89smb>
|
|
sf ExpandMemRec.emUnsynchedFlag(a0) ; <3Dec89smb>
|
|
|
|
; if the font script = Roman then synch keyboard to the font
|
|
move.w (sp)+,d4 ; font script
|
|
beq.s @UseFont
|
|
|
|
; Always synchronize the keyboard & font unless a double-byte script. <34>
|
|
subq #4,sp ; <34>
|
|
move.w d4,-(sp) ; <34>
|
|
move.w #smScriptRedraw,-(sp) ; <34>
|
|
_GetScript ; <34>
|
|
move.l (sp)+,d0 ; <34>
|
|
tst.b d0 ; result is a byte <34>
|
|
ble @UseFont ; 0 = single byte LR script, -1 = RL script, 1 = double-byte script <34>
|
|
|
|
; If we're not in single-byte Roman text then synch keyboard to the font
|
|
; now test with CharByte to see if we're in Roman text
|
|
subq #2,sp ; room for return
|
|
move.l teTextH(a3),a2 ; get handle
|
|
move.l (a2),a2 ; save text ptr to re-use <34>
|
|
move.l a2,-(sp) ; pointer to start of text <34>
|
|
move.w d3,-(sp) ; offset in text
|
|
_CharByte
|
|
tst.w (sp)+ ; high byte of character?
|
|
bne.s @UseFont ; if not single byte text, synch to font script
|
|
|
|
; Is a single byte character…
|
|
; Is this Roman text?
|
|
subq #2,sp ; room for return
|
|
move.l a2,-(sp) ; pointer to start of text
|
|
move.w d3,-(sp) ; offset in text
|
|
_CharType
|
|
move.w (sp)+,d0 ; now let's see what "type" of char we have!
|
|
|
|
; Mask off what interested in: the Type ($000F) and the Direction ($2000)
|
|
; Want a char whose Direction is LR (smCharLeft, $0000) and whose Type is Roman letter
|
|
; which can be smCharAscii (1) or smCharEuro (7). smCharPunct (0) should not synch to Roman.
|
|
and.w #smcTypeMask+smcRightMask,d0
|
|
;; beq.s @UseFont ; smCharPunct = 0
|
|
cmp.w #smCharAscii,d0
|
|
beq.s @Set2Roman
|
|
cmp.w #smCharEuro,d0 ; not really necc f. 2-byte scripts… <34>
|
|
bne.s @UseFont ; otherwise, must use the font script
|
|
@Set2Roman
|
|
; want the keyboard to be Roman rather than synchronized to the font script <3Dec89smb>
|
|
move.w #smRoman,d4
|
|
move.l ExpandMem,a0 ; indicate that we have an anamoly now! <3Dec89smb>
|
|
st ExpandMemRec.emUnsynchedFlag(a0) ; <3Dec89smb>
|
|
@UseFont
|
|
move.w d4,-(sp)
|
|
;---------------------------------------------------------------------
|
|
; change the keyboard to match the current selection's script.
|
|
|
|
IF forLocalizability THEN ; <31f-YDS-8/27/91>
|
|
Move.w (sp), d0 ; script param on the stack from FontScript call !!!
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0 ;
|
|
move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript
|
|
ENDIF
|
|
|
|
_KeyScript ; script param on the stack from FontScript call
|
|
@done
|
|
movem.l (sp)+,a0/a2/d3/d4 ; restore style ptr <34> added a2
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; SetKeyboard2Font
|
|
;
|
|
; <10Nov88smb>
|
|
;
|
|
; When click in text (whether as an insertion point or selection),
|
|
; synch keyboard to font. Will never come here for an
|
|
; unstyled teRecord. <10Nov88smb>
|
|
;
|
|
; ENTRY
|
|
; The font must have been set in the grafport upon entry
|
|
; USES
|
|
; a1,d0-d2
|
|
; preserves a0
|
|
;----------------------------------------------------------------------
|
|
SetKeyboard2Font
|
|
move.l ExpandMem,a1 ; <28June89smb>
|
|
move.l ExpandMemRec.vSetKeyboard2Font(a1),a1
|
|
jmp (a1)
|
|
|
|
xSetKeyboard2Font
|
|
|
|
; if only 1 script installed none of this is necessary
|
|
move.l a0,-(sp) ; save style ptr
|
|
move.l ExpandMem,a1 ; <1Feb89smb>
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a1)
|
|
beq.s @done ; only one script => keyboard set just fine!
|
|
|
|
; turn off the flag set when TE creates an unsynchronized font & keyboard situation <3Dec89smb>
|
|
sf ExpandMemRec.emUnsynchedFlag(a1) ; <3Dec89smb>
|
|
|
|
; get the script (the font must have been set in the grafport already)
|
|
sub.w #2,sp ; allocate return, 1 int
|
|
_FontScript ; get script from font in grafport
|
|
|
|
; change the keyboard to match the current selection's script.
|
|
|
|
IF forLocalizability THEN ; <31f-YDS-8/27/91>
|
|
Move.w (sp), d0 ; script param on the stack from FontScript call !!!
|
|
move.l teDispatchH(a3),a0 ; get teDispatchH addres
|
|
move.l (a0),a0 ;
|
|
move.b d0, lastScript(a0) ; push script numberused to highligt (d0) to lastScript
|
|
ENDIF
|
|
_KeyScript ; script param on the stack from FontScript call
|
|
@done
|
|
move.l (sp)+,a0 ; restore style ptr
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE FindLineHite
|
|
;
|
|
; ** Added 6/16/86 by MBK **
|
|
;
|
|
; Finds the given line and returns its line height.
|
|
;
|
|
; Entry:
|
|
; D3 selStart
|
|
; Exit:
|
|
; D1 height of this line
|
|
;
|
|
;----------------------------------------------------------------------
|
|
FindLineHite
|
|
Move.L A2,-(SP) ; save A2
|
|
|
|
Lea teLines(A3),A2 ; pt to start of linestarts
|
|
Move.W D3,D0 ; offset
|
|
Bsr GetLine ; get line that it's on
|
|
Bsr PtrToLine ; get line # from A2
|
|
|
|
; Get maximum height on this line from the array
|
|
Bsr GetHite ; get height of this line
|
|
|
|
Move.L (SP)+,A2 ; restore A2
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TESetJust( just: INTEGER; h: TEHandle );
|
|
;
|
|
; Sets the justify mode. DOESN'T redraw. Lovely code...
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;TESetAlignment ; comment out for now <45>
|
|
TESetJust
|
|
Bsr.w StdEntry
|
|
Move (A2),teJust(A3) ; set the style
|
|
Bra.w epilog6 ; <C971/RWW102887>NO
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE Refresh
|
|
;
|
|
; Redraws the lines intersected verticals top in D0, bottom in D1
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
Refresh
|
|
MoveQ #0,D3 ; min/max redraw pins in DoDraw
|
|
MoveQ #-1,D4
|
|
Bsr PinA0Rect ; pass A0 rect to Pin code
|
|
|
|
MoveQ #teDraw,D7 ; drawit
|
|
Bsr DoText
|
|
|
|
Bsr HiLite ; reshow selection
|
|
|
|
Tst.B teCarOn(A3) ; force a redraw if caret is on
|
|
Beq.S handyReturn ; if off skip it
|
|
Bra ForceCaret ; implied return
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEScroll( dh, dv: INTEGER; h: TEHandle )
|
|
;
|
|
; Scrolls the dest rect "under" the view rect to give the caller
|
|
; scrolling ability. A call of ( 0, -lineheight, h) would scroll up
|
|
; one line, because dest rect is offset by the passed (dh,dv). The
|
|
; resultant update region is redrawn
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEScroll
|
|
Bsr StdEntry
|
|
|
|
Bsr HideCaret
|
|
|
|
Move.L (A2)+,D3 ; get dv,dh pair
|
|
Bsr.S Scroll
|
|
epilog8
|
|
MoveQ #8,D0
|
|
Bra StdExit
|
|
|
|
; Amount to scroll in D3
|
|
|
|
Scroll
|
|
Tst.L D3 ; escape if nothing there
|
|
Beq.S ActCaret ; fix errant HideCaret (and Rts…) <C971/RWW110587>
|
|
|
|
Pea teDestRect(A3) ; pass the dest rectangle
|
|
Move.L D3,-(SP) ; pass dh, dv
|
|
_OffsetRect
|
|
|
|
SubQ #4,SP ; make room for temp region
|
|
_NewRgn ; get it
|
|
Move.L (SP)+,A2 ; save its handle
|
|
|
|
Pea teViewRect(A3) ; pass rect to scroll
|
|
Move.L D3,-(SP) ; pass dh, dv
|
|
Move.L A2,-(SP) ; pass the temp region
|
|
_ScrollRect
|
|
|
|
Bsr.S ActCaret ; just activate, don't draw <C971/RWW102887>NO
|
|
|
|
Move.L A2,-(SP) ; clip to it update rgn
|
|
_SetClip
|
|
|
|
Move.L (A2),A0 ; point to region
|
|
Lea rgnBBox(A0),A0
|
|
Bsr.s Refresh ; and redraw those lines
|
|
|
|
Move.L A2,-(SP) ; get rid of temp region
|
|
_DisposRgn
|
|
@0
|
|
handyReturn
|
|
Rts
|
|
|
|
|
|
; ** <C207/14oct86/MBK> ** Don't draw caret yet, just activate it
|
|
ActCaret Tst.B teActive(A3) ; do nothing if not active
|
|
Beq.S @0 ; <C971/RWW102887>NO
|
|
|
|
Move teSelStart(A3),D0 ; see if should be turned on
|
|
Cmp teSelEnd(A3),D0
|
|
Bne.S @0 ; if selection <> 0 then escape
|
|
ST teCarAct(A3) ; replaced ShowCaret
|
|
|
|
@0 Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEPinScroll( dh, dv: INTEGER; h: TEHandle )
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Scrolls the dest rect "under" the view rect to give the caller
|
|
; scrolling ability. A call of ( 0, -lineheight, h) would scroll up
|
|
; one line, because dest rect is offset by the passed (dh,dv). The
|
|
; resultant update region is redrawn. This version pins the scroll
|
|
; amount to the destRect/nLines
|
|
;
|
|
;----------------------------------------------------------------------
|
|
TEPinScroll
|
|
Bsr StdEntry
|
|
|
|
Bsr HideCaret
|
|
; get vertical parameter
|
|
Move (A2),D0 ; get dV
|
|
Bpl.S @PinTop ; pin top
|
|
|
|
Move.W teNLines(A3),D1 ; last line ** MBK 6/18/86 **
|
|
Move.W teLength(A3),D0 ; last char **<C207/14oct86/MBK> **
|
|
Tst.W D0 ; anything in file? **<C207/14oct86/MBK> **
|
|
Beq.S @0 ; skip test if not **<C207/14oct86/MBK> **
|
|
|
|
Move.L teTextH(A3),A0 ; text handle **<C207/14oct86/MBK> **
|
|
Move.L (A0),A0 ; dereference **<C207/14oct86/MBK> **
|
|
Cmp.B #returnChar,-1(A0,D0) ; file end with CR? **<C207/14oct86/MBK> **
|
|
Bne.S @0 ; end of file if not **<C207/14oct86/MBK> **
|
|
|
|
AddQ #1,D1 ; else 1 more line **<C207/14oct86/MBK> **
|
|
|
|
@0 MoveQ #0,D0 ; 1st line ** MBK 6/18/86 **
|
|
Bsr GetLineHites ; compile max hites ** MBK 6/18/86 **
|
|
Move.W D0,D1 ; hite from 1st to last ** MBK 6/18/86 **
|
|
Move.W (A2),D0 ; restore D0 ** MBK 6/18/86 **
|
|
|
|
Add teDestRect+top(A3),D1 ; get destRect.top
|
|
|
|
Sub teViewRect+bottom(A3),D1; a diff. viewRect.bottom
|
|
Ble.S @2 ; dest already gone...
|
|
Add D1,D0 ; see what delta does
|
|
Bpl.S pinH
|
|
|
|
Bra.S @2 ; should be subtracted because it's negative
|
|
|
|
@PinTop
|
|
; scrolling down
|
|
Move teDestRect+top(A3),D1 ; add destRect.top
|
|
Sub teViewRect+top(A3),D1 ; diff. viewRect.top
|
|
Bpl.S @2 ; already bad
|
|
|
|
Add D1,D0
|
|
Bmi.S pinH
|
|
@2
|
|
Sub D0,(A2) ; adjust scroll
|
|
pinH
|
|
Move 2(A2),D0 ; get dH
|
|
Bpl.S @1 ; pin top
|
|
Move teDestRect+right(A3),D1 ; add destrect.right
|
|
Sub teViewRect+right(A3),D1 ; a diff. viewRect.right
|
|
Ble.S @2 ; already past, cancel scroll
|
|
Add D1,D0
|
|
Bpl.S pinDone
|
|
;; Add D0,2(A2) ; adjust scroll
|
|
Sub d0,2(a2) ; bug found in MacDTS <12/19/88smb>
|
|
Bra.S pinDone
|
|
@1
|
|
Move teDestRect+left(A3),D1 ; add destRect.left
|
|
Sub teViewRect+left(A3),D1 ; diff. viewRect.left
|
|
Bpl.S @2 ; already past, cancel scroll
|
|
Add D1,D0
|
|
Bmi.S pinDone
|
|
@2
|
|
Sub D0,2(A2) ; adjust scroll
|
|
pinDone
|
|
|
|
Move.L (A2)+,D3 ; get dv,dh pair
|
|
Bsr Scroll ; and go scroll it
|
|
|
|
Bsr ActCaret ; just activate, don't draw ** <C207/14oct86/MBK> **
|
|
Bra epilog8
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TESelView( hTe: TEHandle );
|
|
;
|
|
; ** Modified 6/18/86 by MBK **
|
|
;
|
|
; Insures the selection is in view rect. SelView is a local
|
|
; copy of it
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
TESelView
|
|
Bsr StdEntry ; doo dah...
|
|
|
|
Bsr.S SelView ; go do it
|
|
|
|
Bra epilog4
|
|
|
|
; local cover (A4/A3 pointing to usual record)
|
|
SelView
|
|
; <PMAB381/RWW020488>
|
|
; Changed from teFlags to new whizzy position in TEDispatchRec
|
|
; BTst #tefAutoPos,teFlags(A3) ; scrolling allowed?
|
|
Move.L teDispatchH(A3),A0
|
|
Move.L (A0),A0
|
|
Move.L newTEFlags(A0),D0
|
|
BTst #teFAutoScr,D0
|
|
Beq.s @Exit ; if not, must skip
|
|
|
|
Bsr SelSort ; sort selection
|
|
|
|
Move teSelStart(A3),D3 ; dispStart:=selStart
|
|
Move D3,D4 ; dispEnd:=same
|
|
|
|
MoveQ #teCaret,D7 ; does nothing except moves pen
|
|
Bsr DoText ; position for the caret
|
|
|
|
; test for split caret: if exists, want the high caret in view. <21Dec88smb>
|
|
move.l ExpandMem,a0 ; <1Feb89smb>
|
|
cmpi.w #$FFFF,ExpandMemRec.emTwoCursorsFlag(a0) ; <21Dec88smb>
|
|
bne.s @HighCaretRect ; <21Dec88smb>
|
|
; use rect stored in emCursor2Rect: this is the High caret location. <21Dec88smb>
|
|
lea ExpandMemRec.emCursor2Rect(a0),a0 ; top, left, bottom, right <12July89smb>
|
|
move.l (a0),d7 ; <21Dec88smb>
|
|
bra.s @Continue ; <21Dec88smb>
|
|
@HighCaretRect
|
|
Move.L teSelRect+topLeft(A3),D7 ; save penloc in D7
|
|
@Continue
|
|
Lea TempRect+8,A2 ; place for working rect
|
|
Lea teViewRect+8(A3),A0 ; source
|
|
Move.L -(A0),-(A2)
|
|
Move.L -(A0),-(A2)
|
|
|
|
Move teSelStart(A3),D3 ; dispStart:=selStart ** <C95/4aug86/MBK> **
|
|
Bsr FindLineHite ; get height of line ** <C95/4aug86/MBK> **
|
|
Sub D1,bottom(A2)
|
|
SubQ #1,right(A2) ; room for caret
|
|
|
|
SubQ #2,SP
|
|
Move.L D7,-(SP) ; pass selStart location
|
|
Move.L A2,-(SP) ; pass adjust viewRect
|
|
_PtInRect
|
|
Tst.B (SP)+
|
|
Bne.S @Exit ; if visible, then OK
|
|
|
|
Move.L (A2)+,-(SP) ; get adjusted viewRect.topLeft
|
|
|
|
Move.L (A2),-(SP) ; get adjusted viewRect.botRight
|
|
Move.L -(A2),-(SP) ; subtract adjusted topLeft
|
|
Pea 4(SP)
|
|
_SubPt
|
|
Pea 4(SP) ; add top to delta
|
|
_AddPt
|
|
Move.L D7,-(SP) ; subtract penloc
|
|
Pea 4(SP) ; to "center" pen if possible
|
|
_SubPt
|
|
Move.L A4,-(SP)
|
|
|
|
_TEPinScroll ; s/b a trap ** <C381/6nov86/MBK> **
|
|
|
|
@Exit
|
|
Rts ; adios
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEAutoView( auto: BOOLEAN; hTe: TEHandle );
|
|
;
|
|
; Sets the autoview bit according to the boolean
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
TEAutoView
|
|
Bsr StdEntry ; doo dah...
|
|
|
|
Move.L teDispatchH(A3),A0 ; <PMAB381/RWW020488>
|
|
Move.L (A0),A0 ; <PMAB381/RWW020488>
|
|
Move.L newTEFlags(A0),D0 ; <PMAB381/RWW020488>
|
|
|
|
Tst.B (A2)+ ; was it true
|
|
Beq.S @0
|
|
|
|
;; BSet #tefAutoPos,teFlags(A3) ; allow scrolling
|
|
BSet #teFAutoScr,D0 ; <PMAB381/RWW020488>
|
|
Bra.S @1
|
|
@0
|
|
;; BClr #tefAutoPos,teFlags(A3) ; allow scrolling
|
|
BClr #teFAutoScr,D0
|
|
@1
|
|
Move.L D0,newTEFlags(A0)
|
|
Bra epilog6
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEFeatureFlag( verb: word; action: word; hTe: TEHandle ):word;
|
|
; <30May89smb>
|
|
;
|
|
; Sets the verb field <selector> bit according to the action,
|
|
; but preserve the old value as the result.
|
|
;
|
|
; Verb or bit definitions for newTEFlags
|
|
; teFAutoScr EQU 0 ; (00000001b)
|
|
; teFTextBuffering EQU 1 ; (00000010b)
|
|
; teFOutlineHilite EQU 2 ; (00000100b)
|
|
; teFInlineInput EQU 3 ; (00001000b)
|
|
; teFUseTextServices EQU 4 ; (00010000b)
|
|
;
|
|
; Action for the new "bit (un)set" interface
|
|
; TEBitClear equ 0
|
|
; TEBitSet equ 1 ; set the selector bit.
|
|
; TEBitTest equ -1 ; no change; just tell the present value
|
|
;
|
|
;----------------------------------------------------------------------
|
|
iTEFeatureFlag
|
|
moveq #0,d0
|
|
moveq #0,d1
|
|
move.w (a2)+,d0 ; action
|
|
move.w (a2)+,d1 ; verb bit (which feature to affect)
|
|
|
|
move.l teDispatchH(a3),a0
|
|
move.l (a0),a0
|
|
move.l newTEFlags(a0),d2 ; move into reg for modulo 32 bit ops <15Sept89smb>
|
|
clr.w (a2) ; <6Oct89smb> necessary so the return result of 'clear' is correct.
|
|
btst d1,d2 ; <15Sept89smb>
|
|
sne (a2) ; save result
|
|
|
|
tst.w d0 ; whatcha wanna do?
|
|
blt.s @done ; action = testFlag; result already on stack
|
|
beq.s @clear
|
|
bset d1,d2 ; action = setFlag <15Sept89smb>
|
|
bra.s @done
|
|
@clear
|
|
bclr d1,d2 ; action = clearFlag <15Sept89smb>
|
|
@done
|
|
move.l d2,newTEFlags(a0) ; <15Sept89smb>
|
|
tst.b (a2) ; <13Sept89smb>
|
|
beq.s @OK
|
|
move.w #1,(a2)
|
|
@OK
|
|
moveq #10,d0 ; # of bytes on stack (include selector!)
|
|
bra stdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE DefClikProc
|
|
;
|
|
; Default click proc for scrolling - does a pinned autoscroll of
|
|
; the destRect to match the viewrect.
|
|
; Entry:
|
|
; A3 pointing to the dereferenced text edit record
|
|
; A6 pointing to the standard stack frame
|
|
; thePort set, etc.
|
|
; Exits:
|
|
; CC's set <> 0
|
|
;
|
|
;----------------------------------------------------------------------
|
|
DefClikProc
|
|
MoveM.L D0-D7/A0-A4,-(SP) ; save ALL regs
|
|
|
|
; BTst #tefAutoPos,teFlags(A3) ; scrolling allowed?
|
|
Move.L teDispatchH(A3),A0 ; <PMAB381/RWW020488>
|
|
Move.L (A0),A0 ; <PMAB381/RWW020488>
|
|
Move.L newTEFlags(A0),D0 ; <PMAB381/RWW020488>
|
|
BTst #teFAutoScr,D0 ; <PMAB381/RWW020488>
|
|
|
|
Beq.S doneAuto ; if not, must skip
|
|
|
|
Lea teViewRect+8(A3),A0 ; point to view rect
|
|
Lea TempRect+8,A2 ; copy into TempRect
|
|
Move.L -(A0),-(A2)
|
|
Move.L -(A0),-(A2)
|
|
|
|
SubQ #4,SP ; room for pt
|
|
Move.L SP,-(SP)
|
|
_GetMouse
|
|
Move (SP)+,D6 ; get V coordinate
|
|
Move (SP)+,D7 ; get H coordinate
|
|
|
|
MoveQ #0,D4 ; horz scroll amt
|
|
Move teLineHite(A3),D1 ; vert scroll amt
|
|
Bpl.S @1 ; use if not negative ** <C207/13oct86/MBK> **
|
|
|
|
Move.W D6,D0 ; find D6 line ** <C207/13oct86/MBK> **
|
|
Cmp.W teDestRect+bottom(A3),D0 ; pt below the rect? ** <C207/13oct86/MBK> **
|
|
Ble.S @0 ; okay if less or same ** <C207/13oct86/MBK> **
|
|
|
|
Move.W teDestRect+bottom(A3),D0 ; else reset to bottom ** <C207/13oct86/MBK> **
|
|
|
|
@0 Bsr PtToLine ; try to find its line # ** <C207/13oct86/MBK> **
|
|
Bge.S noAuto ; no scroll if line doesn't exist ** <C207/13oct86/MBK> ** <4>
|
|
Bsr GetHite ; else get its height
|
|
|
|
@1 Cmp (A2)+,D6 ; subtract top of viewRect
|
|
Blt.S scrollUp ; scroll up
|
|
|
|
Cmp (A2)+,D7 ; subtract left of viewRect
|
|
Blt.S scrollLeft ; scroll left
|
|
|
|
Cmp (A2)+,D6 ; subtract bottom of viewRect
|
|
Bgt.S scrollDown ; scroll down
|
|
|
|
Cmp (A2)+,D7 ; subtract right of viewRect
|
|
Bgt.S scrollRight ; scroll right
|
|
|
|
noAuto ; <4>
|
|
clr.l teClikTime(a3) ; clear it out because we're not scrolling <4>
|
|
doneAuto
|
|
MoveQ #1,D0 ; cc's <> 0
|
|
MoveM.L (SP)+,D0-D7/A0-A4 ; restore ALL regs
|
|
Rts
|
|
|
|
scrollDown
|
|
Neg D1 ; flip direction
|
|
scrollUp
|
|
Bra.S scrollEm
|
|
|
|
scrollRight
|
|
Neg D1 ; flip direction
|
|
scrollLeft
|
|
Exg D4,D1 ; switch axes
|
|
scrollEm
|
|
|
|
; Finally do the scroll
|
|
lea -10(sp), sp ; reserve space for call to ScrollDelay <4>
|
|
move.w #1,-(sp) ; itemsVisible = smallest possible (1) <4>
|
|
move d4,-(sp) ; pass dh
|
|
move d1,-(sp) ; pass dv
|
|
|
|
movea.l a3, a0 ; Grab Text Edit pointer from A3 <sm9>
|
|
_RecoverHandle ; Recover the tehandle <sm9>
|
|
move.l a0,-(sp) ; slam tehandle onto stack <sm9>
|
|
|
|
subq.l #4,sp ; <4>
|
|
_TickCount ; Get a time stamp. <4>
|
|
move.l (sp)+,d1 ; Copy it into D1. <4>
|
|
move.l d1,10(sp) ; And put it on the stack for ScrollDelay. <4>
|
|
|
|
; Note: teClikTime is a state variable in the TERecord which is used by TEClick.
|
|
; Fortunately, TEClick does not use it at all within its body; it only checks its
|
|
; value on entry and sets it on exit. This code relies on it also being set on
|
|
; entry, just after it has been tested. Of course, this restricts its use to
|
|
; click procs, but that's okay.
|
|
|
|
move.l teClikTime(a3),d0 ; See if it's a new scroll <4>
|
|
bne.s @gotTime ; Skip if not <4>
|
|
move.l d1,teClikTime(a3) ; Otherwise, put in a new stamp <4>
|
|
move.l d1,d0 ; in D0 too <4>
|
|
|
|
@gotTime
|
|
move.l d0,14(sp) ; D0 is startTicks for ScrollDelay <4>
|
|
|
|
_TEPinScroll ;_TEPinScroll ** <C381/6nov86/MBK> **
|
|
|
|
_ScrollDelay ; <4>
|
|
AddQ.L #2,SP ; Toss the result <4>
|
|
|
|
Bra.S doneAuto ; <C971/RWW102887>NO
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetCurStyle
|
|
;
|
|
; ** Added 6/5/86 by MBK **
|
|
;
|
|
; Gets the current style; in other words, it finds the 1st style
|
|
; descriptor preceding the current selection.
|
|
;
|
|
; Entry:
|
|
; D0 selection start (whose style we wish to find)
|
|
;
|
|
; Exit:
|
|
; D0 index into runs array of current style
|
|
; A0 ptr into runs array to current style
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetCurStyle
|
|
MoveM.L D1-D4,-(SP)
|
|
|
|
; get low and high indeces, and ptr to array for binary search
|
|
AddQ #1,D0 ; don't get preceding style
|
|
Move.W D0,D2 ; save the key (sel start)
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; deref
|
|
Move.W nRuns(A0),D1 ; high index
|
|
Lea runs(A0),A0 ; pt to runs array
|
|
MoveQ #0,D0 ; low index
|
|
|
|
; start of binary search loop
|
|
@0 Cmp.W D0,D1 ; are indeces the same?
|
|
Beq.S @3 ; we're done if so
|
|
|
|
Move.W D1,D3
|
|
Add.W D0,D3 ; low + high
|
|
LsR.W #1,D3 ; divide by 2
|
|
MoveQ #0,D4 ; clear the long word ** <C381/6nov86/MBK> **
|
|
Move.W D3,D4 ; middle
|
|
LsL.L #2,D4 ; mult by stStartSize ** <C381/6nov86/MBK> **
|
|
Cmp.W 0(A0,D4),D2 ; do we have a match?
|
|
Beq.S @2 ; we're done if so
|
|
Bls.S @1 ; range is low to mid
|
|
|
|
; no change in high; low gets middle + 1
|
|
Move.W D3,D0 ; low := middle + 1
|
|
AddQ #1,D0
|
|
Bra.S @0 ; try again
|
|
|
|
; no change in low; high gets middle
|
|
@1 Move.W D3,D1 ; else high := middle
|
|
Bra.S @0 ; try again
|
|
|
|
@2 Move.W D3,D0 ; store answer in D0
|
|
|
|
; return ptr into runs array and index to the styleRec
|
|
@3 Tst.W D0
|
|
Beq.S @4 ; special case of 1st style
|
|
|
|
SubQ #1,D0 ; point to prev style
|
|
|
|
@4 MoveQ #0,D1 ; clear the long word ** <C381/6nov86/MBK> **
|
|
Move.W D0,D1
|
|
LsL.L #2,D1 ; mult by stStartSize ** <C381/6nov86/MBK> **
|
|
Add.L D1,A0 ; ptr to style start
|
|
|
|
MoveM.L (SP)+,D1-D4
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetNumStyles
|
|
;
|
|
; ** Added 5/28/86 by MBK **
|
|
;
|
|
; GetNumStyles counts the number of styles in the current
|
|
; selection range in the text.
|
|
;
|
|
; Entry:
|
|
; D1: selEnd
|
|
; A0: ptr to current style in runs array
|
|
;
|
|
; Exit:
|
|
; D0: # of styles within current selection
|
|
; a0: preserved
|
|
;----------------------------------------------------------------------
|
|
GetNumStyles
|
|
Move.L A0,-(SP) ; save ptr
|
|
|
|
Move.L teStylesH(A3),A1 ; handle to style info
|
|
Move.L (A1),A1 ; dereference
|
|
MoveQ #0,D0 ; clear whole register ** <C381/6nov86/MBK> **
|
|
Move.W nRuns(A1),D0 ; # of style starts
|
|
Lea runs(A1),A1 ; pt to style starts
|
|
LsL.L #2,D0 ; * stStartSize ** <C381/6nov86/MBK> **
|
|
Add.L D0,A1 ; pt to last style start
|
|
MoveQ #0,D0 ; init the counter
|
|
|
|
; keep checking style starts till one is >= selEnd (eventually it MUST be)
|
|
@0 Add.L #stStartSize,A0 ; point to next style record
|
|
AddQ #1,D0 ; at least 1 style
|
|
|
|
Cmp.L A0,A1 ; reached the end?
|
|
Beq.S @1 ; quit if so
|
|
|
|
Cmp.W startChar(A0),D1 ; is style within selection?
|
|
Bhi.S @0 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
@1 Move.L (SP)+,A0
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE GetStyle
|
|
;
|
|
; ** Added 5/29/86 by MBK **
|
|
;
|
|
; GetStyle returns a pointer to the style found at the given
|
|
; index into the style array.
|
|
;
|
|
; Entry:
|
|
; D0: style index
|
|
; A3: Ptr to TERec
|
|
; Exit:
|
|
; A0: style pointer
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetStyle
|
|
MulU #stRecSize,D0 ; multiply index by size of record
|
|
Move.L teStylesH(A3),A0 ; get style handle
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L styleTab(A0),A0 ; handle to styles array
|
|
Move.L (A0),A0 ; dereference
|
|
Add.L D0,A0 ; point to style descriptor
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE RecalStStarts
|
|
;
|
|
; ** Added 5/23/86 by MBK **
|
|
;
|
|
; Recomputes the starting offsets of each style in the text
|
|
; following the current one. It adds the length of the newly
|
|
; inserted text to each offset following the insertion point.
|
|
;
|
|
; Entry:
|
|
; D0 index to current style in runs array
|
|
; D5 length of inserted text
|
|
; A0 pointer to the current style in runs array
|
|
;
|
|
;----------------------------------------------------------------------
|
|
RecalStStarts
|
|
Move.L teStylesH(A3),A1 ; get handle to style info
|
|
Move.L (A1),A1 ; deref
|
|
Move.W nRuns(A1),D1 ; get # of style starts
|
|
Sub.W D0,D1 ; subtract current index
|
|
Bls.S @1 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
; add length of inserted text to all following style starts
|
|
@0 Add.L #stStartSize,A0 ; point to next style record
|
|
Add.W D5,startChar(A0) ; add length to starting offset
|
|
SubQ #1,D1 ; dec the counter
|
|
Bne.S @0
|
|
|
|
@1
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetRsrved;
|
|
;
|
|
; ** <C851/14Apr87/MBK> **
|
|
;
|
|
; I changed teReserved to a handle to the following structure:
|
|
; Record
|
|
; newReserved : LONGINT;
|
|
; nullScrap : stScrpHandle;
|
|
; End;
|
|
; nullScrap is used to store a style which is set when the
|
|
; selection is NIL in TESetStyle. I store it in the scrap
|
|
; format so that it can easily be inserted using PstStylGuts.
|
|
; This procedure is called to set the style to whatever the user
|
|
; has input to TESetStyle.
|
|
;
|
|
; On entry, SetRsrved expects A2 to be pointing to something
|
|
; that looks like this:
|
|
; flag.B TextStylePtr.L mode.W
|
|
; The flag is not accessed and can just be a hole if desired.
|
|
;----------------------------------------------------------------------
|
|
SetRsrved
|
|
Move.W teSelStart(A3),D0 ; get selection start
|
|
Cmp.W teSelEnd(A3),D0 ; same as selEnd?
|
|
Bne lvSetRsrved ; quit if not
|
|
|
|
AltSetRsrved ; <C971/RWW102987>
|
|
Move.L teStylesH(A3),A1 ; get style handle
|
|
Move.L (A1),A1 ; deref
|
|
Move.L nullStyle(A1),A1 ; get reserved handle
|
|
Move.L (A1),A1 ; deref
|
|
Move.L nullScrap(A1),A1 ; get handle to scrap for null selection
|
|
Move.L A1,-(SP) ; save handle for later
|
|
Move.L (A1),A1 ; deref
|
|
Tst.W scrpNStyles(A1) ; stored already?
|
|
Beq.S @0 ; reset if not
|
|
Lea scrpStyleTab(A1),A1 ; point to start of tableev style if so
|
|
Bra.S @1 ; go use new settings
|
|
|
|
; First get current style settings
|
|
@0 SubQ #1,D0 ; in case sel is on a run boundary
|
|
Bsr GetCurStyle ; get current style run
|
|
Move.W styleIndex(A0),D0 ; get style index
|
|
Bsr.S GetStyle ; get the style in A0 <C971/RWW102887>NO
|
|
Move.W #1,scrpNStyles(A1) ; indicate 1 style
|
|
Lea scrpStyleTab(A1),A1 ; point to start of table
|
|
Move.L #0,scrpStartChar(A1) ; store start offset
|
|
Lea stFont(A0),A0
|
|
Move.L (A0)+,scrpFont(A1) ; font, face
|
|
Move.L (A0)+,scrpSize(A1) ; size, color
|
|
Move.L (A0)+,scrpColor+2(A1) ; color
|
|
|
|
; now adjust according to new settings
|
|
@1 Move.W 6(A2),D2 ; get the mode
|
|
Move.L 2(A2),A0 ; get style ptr
|
|
BTst #fontBit,D2 ; set font?
|
|
Beq.S @2 ; no
|
|
Move.W tsFont(A0),scrpFont(A1) ; else, set it
|
|
; set the direction of the font in the high bit of the high-order byte <30May89smb>
|
|
move.l a0,-(sp)
|
|
move.w tsFont(a0),d1
|
|
lea scrpFace+1(a1),a0
|
|
Bsr SetDirection
|
|
move.l (sp)+,a0
|
|
|
|
@2 BTst #faceBit,D2 ; set face?
|
|
Beq.S @4 ; no
|
|
|
|
; ** <C971/RWW102987> Added code to support doToggle mode.
|
|
; An insertion point is by definition continuous, so all we have to do is
|
|
; calculate unique set elements
|
|
Move.B tsFace(A0),D0 ; fetch given face <C971/RWW102987>
|
|
|
|
BTst #toglBit,D2 ; toggling? <C971/RWW102987>
|
|
Bz.S @3 ; no, go set <C971/RWW102987>
|
|
|
|
Eor.B D0,scrpFace(A1) ; <C971/RWW111187>
|
|
Bra.S @4 ; <C971/RWW102987>
|
|
|
|
@3 Tst.B D0 ; if new face is plain… <C971/RWW102987>
|
|
Bnz.S @35 ; <C971/RWW102987>
|
|
Clr.B scrpFace(A1) ; …wipe out old attributes <C971/RWW102987>
|
|
@35 Or.B D0,scrpFace(A1) ; union in new attributes <C971/RWW102987>
|
|
|
|
@4 BTst #sizeBit,D2 ; set size only?
|
|
Beq.S @5 ; no
|
|
BTst #addSizeBit,D2 ; is addSize also set?
|
|
Bne.S @5 ; it has precedence
|
|
Move.W tsSize(A0),scrpSize(A1) ; else, get size
|
|
|
|
@5 BTst #clrBit,D2 ; set color only?
|
|
Beq.S @6 ; no
|
|
Move.L tsColor(A0),scrpColor(A1) ; store the new value there
|
|
Move.W tsColor+4(A0),scrpColor+4(A1) ; store color ,hi
|
|
|
|
@6 BTst #addSizeBit,D2 ; is it addSize?
|
|
Beq.S @9
|
|
Move.W scrpSize(A1),D0 ; get current size
|
|
Bne.S @7 ; => not 0
|
|
Move.B FMDefaultSize,D0 ; get default size as byte value** <C440/19nov86/MBK> **
|
|
|
|
@7 Add.W tsSize(A0),D0 ; add increment to size
|
|
Bgt.S @8 ; size <-1 if it's 0 or negative
|
|
Move.W #1,D0 ; minimum allowable
|
|
|
|
@8 Move.W D0,scrpSize(A1) ; now store it
|
|
|
|
@9 Move.L teGrafPort(A3),A0 ; the port
|
|
Move.W scrpFont(A1),txFont(A0) ; set font
|
|
Move.W scrpFace(A1),txFace(A0) ; set face
|
|
bclr #7,txFace+1(a0) ; want direction in scrp but not grafport <30May89smb>
|
|
Move.W scrpSize(A1),txSize(A0) ; set size
|
|
Bsr GetSize ; get ascent & hite
|
|
Move.L (SP)+,A0 ; get back scrap handle
|
|
Move.L (A0),A0 ; deref
|
|
Lea scrpStyleTab(A0),A0 ; pt to start of scrap table
|
|
Move.W D0,scrpAscent(A0) ; save in ascent
|
|
Move.W D1,scrpHeight(A0) ; save in line height
|
|
|
|
lvSetRsrved
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TESetStyle( SetMode: INTEGER; Styl: StylPtr; redraw: BOOLEAN;
|
|
; hTE: TEHandle );
|
|
;
|
|
; Sets the style of the selected text (replacing all other styles).
|
|
;
|
|
; Supports the following modes:
|
|
; 1 doFont: Set Font only
|
|
; 2 doFace: Set Face only
|
|
; 4 doSize: Set Size only
|
|
; 8 doColor: Set Color only
|
|
; 15 doAll: Set all modes
|
|
; 16 addSize: Add Size integer to each size in selection
|
|
; 32 doToggle: Set each face attribute if not continuous, reset otherwise <C971/RWW102987>
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
iTESetStyle
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @DontSet ; if not, sorry, can't set it
|
|
|
|
Bsr SetRsrved ; save the style in the grafport
|
|
|
|
; mode may be an additive combination so must test the font bit <3Dec89smb>
|
|
move.w 6(a2),d0 ; <3Dec89smb>
|
|
btst #fontBit,d0 ; is mode = doFont? <3Dec89smb>
|
|
beq.s @KeybdOK ; <3Dec89smb>
|
|
;; cmpi.w #doFont,6(a2) ; is mode = doFont? <12July89smb>
|
|
;; bne.s @KeybdOK ; <12July89smb>
|
|
bsr SetKeyboard2Font ; synch keyboard to new font <10Nov88smb>
|
|
@KeybdOK
|
|
|
|
; ** <C381/6nov86/MBK> ** boolean value is in bit 1 of high byte
|
|
Move.W (A2)+,D0 ; get redraw value ** <C381/6nov86/MBK> **
|
|
And #$FF00,D0 ; check redraw value ** <C381/6nov86/MBK> **
|
|
Bne.S @0 ; must redraw if set
|
|
|
|
Bsr.S SetGuts ; else just add styles
|
|
Bra.S @DontSet
|
|
|
|
@0 Move.L A2,-(SP) ; save ptr to parameters
|
|
|
|
Bsr HideCaret
|
|
Bsr HiLite ; remove selection
|
|
|
|
Move.L (SP)+,A2 ; restore ptr to parameters
|
|
|
|
Bsr.S SetGuts ; do style munging
|
|
|
|
MoveQ #0,D7 ; length is 0
|
|
|
|
Bsr RecalDraw ; redo the line stuff
|
|
|
|
Bsr ShowCaret
|
|
Bsr HiLite ; restore selection
|
|
|
|
Bsr SelView ; ensure selection is visible
|
|
|
|
@DontSet
|
|
MoveQ #14,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
|
|
SetGuts
|
|
MoveM.L D2-D7/A2/A4/A6,-(SP) ; save registers
|
|
Move.L (A2)+,A4 ; style ptr
|
|
Move.W (A2)+,D7 ; save mode here
|
|
Sub.L A6,A6 ; not used by SetStyle
|
|
|
|
; ** <C971/RWW102987> Added code to support doToggle.
|
|
; I changed the next statement to a mask from the original, which punted if
|
|
; it saw bits it didn't like.
|
|
|
|
; <31j-YDS-8/27/91>
|
|
; if/when will add this should define those:
|
|
; doAll4 EQU $7F
|
|
; doFontSmart EQU $41
|
|
; IF forLocalizability THEN ; <31j-YDS-8/27/91> - minor, has another one marked>
|
|
; And.W #doAll4,D7 ; only lower 7 bits make sense <C971/RWW102987>
|
|
; ELSE
|
|
And.W #doAll3,D7 ; only lower 6 bits make sense <C971/RWW102987>
|
|
; ENDIF
|
|
|
|
Move.W D7,D0 ; <C971/RWW102987>
|
|
And.W #doFace+doToggle,D0 ; are we toggling? <C971/RWW102987>
|
|
Cmp.W #doFace+doToggle,D0 ; (both bits have to be on, dummy!) <C971/RWW102987>
|
|
Bne.S @05 ; <C971/RWW102987>
|
|
|
|
SubQ.W #1,A6 ; -1 to signal toggle mode <C971/RWW102987>
|
|
Move.W #doFace,-(SP) ; prepare fake frame for call <C971/RWW102987>
|
|
|
|
; SP => doFace/2 <C971/RWW102987>
|
|
Sub.W #styleSize+2,SP ; make room for result & TextStyle <C971/RWW102987>
|
|
|
|
; SP => VAR/2 VAR/styleSize doFace/2 <C971/RWW102987>
|
|
Pea styleSize+2(SP) ; push pointer to doFace <C971/RWW102987>
|
|
|
|
; SP => ^doFace/4 VAR/2 VAR/styleSize doFace/2 <C971/RWW102987>
|
|
Pea 4+2(SP) ; push pointer to TextStyle hole <C971/RWW102987>
|
|
|
|
; SP => ^VAR/4 ^doFace/4 VAR/2 VAR/styleSize doFace/2 <C971/RWW102987>
|
|
Move.L SP,A2 ; point A2 at stacked parameters <C971/RWW102987>
|
|
|
|
Bsr ContGuts ; coalesce continuous styles <C971/RWW102987>
|
|
|
|
Add.W #10,SP ; pop stack back to TextStyle <C971/RWW102987>
|
|
Move.B tsFace(SP),D5 ; save continuous face attributes <C971/RWW102987>
|
|
Swap D5 ; we'll need low word later <C971/RWW102987>
|
|
Add.W #styleSize+2,SP ; now remove TextStyle & doFace <C971/RWW102987>
|
|
@05 ; <C971/RWW102987>
|
|
Bsr.S StyleGuts ; do style munging
|
|
|
|
@0 MoveM.L (SP)+,D2-D7/A2/A4/A6 ; restore registers
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
StyleGuts
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vStyleGuts(a0),a0
|
|
jmp (a0)
|
|
|
|
xStyleGuts
|
|
|
|
Tst.W D7 ; check mode
|
|
Beq EndStyle ; 0 is invalid mode
|
|
|
|
Bsr SelSort ; sort selStart, selEnd
|
|
Move.W D0,D1 ; save selEnd <C971/RWW102987>
|
|
Move.W D0,D4
|
|
Swap D0
|
|
Move.W D0,D3 ; save selStart
|
|
Sub.W D3,D1 ; save selection length <C971/RWW102987>
|
|
Beq EndStyle ; if len = 0, nothing to do
|
|
|
|
; store the input style information temporarily
|
|
Sub.L #stRecSize,SP ; make room on stack
|
|
Move.L SP,A2 ; save ptr in A2
|
|
|
|
; Move.W D3,D0 ; selStart REDUNDANT! <PMAB381/RWW020488>
|
|
Bsr GetCurStyle ; get current style
|
|
Move.W D4,D1 ; selEnd
|
|
Bsr GetNumStyles ; get # of styles within selection
|
|
Move.W D0,D2 ; preserve # of styles
|
|
Swap D3 ; selStart in upper word
|
|
Move.W D4,D3 ; selEnd in lower word
|
|
|
|
; ** <C971/RWW102787> Faces are byte length…
|
|
Move.B tsFace(A4),D4 ; save face <C971/RWW102787>
|
|
Swap D4 ; put face in upper word
|
|
Move.W tsFont(A4),D4 ; font in lower word
|
|
Move.W tsSize(A4),D5 ; save size
|
|
Move.L tsColor(A4),D6 ; save color
|
|
Swap D7 ; running out of reg's ** <C182/6oct86/MBK> **
|
|
Move.W tsColor+4(A4),D7 ; store color in D7,hi ** <C182/6oct86/MBK> **
|
|
Swap D7 ; keep mode in D7,low ** <C182/6oct86/MBK> **
|
|
Move.L A2,A4 ; temp style handle
|
|
|
|
Move.L A0,A2 ; preserve ptr
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info ** <C381/6nov86/MBK> **
|
|
_HLock ; keep it locked ** <C381/6nov86/MBK> **
|
|
|
|
; By this point, the world looks like this:
|
|
; D2.W = number of styles in current selection (used as counter)
|
|
; D3.L = selStart/selEnd (high word/low word)
|
|
; D4.L = Face/Font
|
|
; D5.L = Toggle face info/Size
|
|
; D6.L = Color Red/Green
|
|
; D7.L = Color Blue/set mode
|
|
; A2.L => StyleRun array, first associated element
|
|
; A4.L => working STElement on stack
|
|
|
|
styleLoop Move.W styleIndex(A2),D0 ; else, index to style
|
|
Bsr GetStyle ; find it
|
|
Bsr CheckMatch ; must match for replacement
|
|
Tst.W D0 ; check return flag
|
|
Beq NoMatch ; if false, don't replace
|
|
|
|
Move.L #stRecSize,D0 ; length of a styleRec
|
|
Move.L A4,A1 ; ptr to temp storage
|
|
_BlockMove ; copy to temp location for mod
|
|
|
|
Move.L A2,A0 ; current style
|
|
Move.L D3,D0 ; selStart, selEnd
|
|
Swap D0 ; selStart in low word
|
|
Cmp.W startChar(A2),D0 ; compare to style start
|
|
Bls.S @0 ; made this unsigned ** <C381/6nov86/MBK> **
|
|
|
|
Bsr DupStyle ; else dup it
|
|
AddQ #stStartSize,A0 ; new style replaces this
|
|
Move.L A0,A2
|
|
|
|
@0 Cmp.W #1,D2 ; last style?
|
|
Bne.S @1 ; not yet
|
|
|
|
AddQ #stStartSize,A0
|
|
Cmp.W startChar(A0),D3 ; compare to style end
|
|
Beq.S @1 ; ok if same as selEnd
|
|
|
|
Move.W D3,D0 ; selEnd
|
|
Move.L A2,A0 ; current style
|
|
Bsr DupStyle ; dup it
|
|
Move.L A0,A2 ; ptr updated in A0
|
|
|
|
; ** <C381/7nov86/MBK> ** dupstyle was fixed to inc the style count, so it's
|
|
; ok to dec it in all cases now
|
|
@1 MoveQ #1,D0 ; # of styles to (possibly) delete
|
|
Move.L A2,A0 ; ptr to style start
|
|
Bsr DecStylCount ; style used 1 less time
|
|
|
|
BTst #fontBit,D7 ; set font?
|
|
Beq.S @3 ; no
|
|
|
|
|
|
; <31j-YDS-8/27/91>
|
|
;; here we will add a test to let you force a change that we do not allow, we still check it so
|
|
;; all this code will be hidden after debugging after we will decide what to do !!!!
|
|
;
|
|
; IF forLocalizability THEN ; <31j-YDS-8/27/91> Don't let me change fonts not from the same script
|
|
; BTst #doFontSmart,D7 ; check for matching script ?
|
|
; Beq.S @ignoreScript ; no
|
|
;
|
|
;
|
|
; MoveM.L D0-D2/A0-A1,-(SP) ; save registers, we call the toolbox
|
|
; Clr.W -(SP) ; space for return value of function
|
|
; Move.W stFont(A4),-(SP) ; move font to stack
|
|
; _Font2Script ; get the font script
|
|
; Clr.W -(SP) ; space for return value of function
|
|
; Move.W D4,-(SP) ; move font to stack
|
|
; _Font2Script ; get the font script
|
|
; Move.W (SP)+, D0 ; into d0
|
|
; Move.W (SP)+, D1 ; into d1
|
|
; Cmp.W D0,D1 ; is it the same script ?
|
|
; MoveM.L (SP)+, D0-D2/A0-A1 ; restore registers. (won't change cc)
|
|
; Bne.S @3 ; no , don't awitch.
|
|
; ENDIF
|
|
;
|
|
;@ignoreScript
|
|
|
|
|
|
Move.W D4,stFont(A4) ; else, put in temp rec
|
|
; set the direction of the font in the high bit of the high-order byte <30May89smb>
|
|
move.l a0,-(sp)
|
|
move.w d4,d1
|
|
lea stFace+1(a4),a0 ; store direction here
|
|
bsr SetDirection
|
|
move.l (sp)+,a0
|
|
|
|
@3 BTst #faceBit,D7 ; set face?
|
|
Beq.S @5 ; no
|
|
|
|
; ** <C971/RWW102987> This new code supports the doToggle mode
|
|
Move.L D4,D0 ; fetch face information <C971/RWW102987>
|
|
Swap D0 ; move face to low byte <C971/RWW102987>
|
|
|
|
Move.L A6,D1 ; are we just setting? <C971/RWW102987>
|
|
Bz.S @41 ; <C971/RWW102987>
|
|
|
|
AddQ.L #1,D1 ; are we toggling? (was it just -1?)<C971/RWW102987>
|
|
Beq.S @42 ; yes, go handle <C971/RWW102987>
|
|
|
|
; Replacing… <C971/RWW102987>
|
|
Move.B D0,stFace(A4) ; we must be replacing, then <C971/RWW102987>
|
|
Bra.S @5 ; <C971/RWW102987>
|
|
|
|
; Toggling… (algorithm also works for plain, so we don't have to special case) <C971/RWW102987>
|
|
@42 Move.L D5,D1 ; fetch toggle info <C971/RWW102987>
|
|
Swap D1 ; move continuous face to low byte <C971/RWW102987>
|
|
And.B D0,D1 ; intersect faces for XOR mask <C971/RWW102987>
|
|
Eor.B D1,D0 ; difference from desired is OR mask<C971/RWW102987>
|
|
Or.B D0,stFace(A4) ; union in new style attributes <C971/RWW102987>
|
|
Eor.B D1,stFace(A4) ; remove already set attributes <C971/RWW102987>
|
|
Bra.S @5 ; <C971/RWW102987>
|
|
|
|
; Merging… <C971/RWW102987>
|
|
@41 Tst.B D0 ; is it plain? <C971/RWW102987>
|
|
Bnz.S @43 ; no, merge in attributes <C971/RWW102987>
|
|
Clr.B stFace(A4) ; remove all styles if plain <C971/RWW102987>
|
|
@43 Or.B D0,stFace(A4) ; union sets <C971/RWW102987>
|
|
|
|
@5 BTst #sizeBit,D7 ; set size only?
|
|
Beq.S @6 ; no
|
|
|
|
BTst #addSizeBit,D7 ; is addSize also set? ** <C139/10Sep86/MBK> **
|
|
Bne.S @6 ; it has precedence ** <C139/10Sep86/MBK> **
|
|
|
|
Move.W D5,stSize(A4) ; else, get size
|
|
|
|
@6 BTst #clrBit,D7 ; set color only?
|
|
Beq.S @7 ; no
|
|
|
|
Move.L D6,stColor(A4) ; store the new value there
|
|
Swap D7 ; running out of reg's ** <C182/6oct86/MBK> **
|
|
Move.W D7,stColor+4(A4) ; store color in D7,hi ** <C182/6oct86/MBK> **
|
|
Swap D7 ; keep mode in D7,low ** <C182/6oct86/MBK> **
|
|
|
|
@7 BTst #addSizeBit,D7 ; is it addSize? ** <C139/10Sep86/MBK> **
|
|
Beq.S @9
|
|
|
|
Move.W stSize(A4),D0 ; get current size
|
|
Bne.S @8 ; => not 0
|
|
|
|
;I assumed FMDefaultSize was a word constant, but actually it points to a byte value.
|
|
Move.B FMDefaultSize,D0 ; get default size as byte value** <C440/19nov86/MBK> **
|
|
Move.W D0,stSize(A4) ; store as word value ** <C440/19nov86/MBK> **
|
|
|
|
@8
|
|
; Don't allow the size to become 0 or be negative.
|
|
Add.W D5,D0 ; add increment to size
|
|
Bgt.S @81 ; size <-1 if it's 0 or negative
|
|
|
|
Move.W #1,D0 ; minimum allowable
|
|
|
|
@81 Move.W D0,stSize(A4) ; now store it
|
|
|
|
@9 Move.L A4,A0 ; point to relevent stuff
|
|
Bsr FindStyle ; look for this style
|
|
Tst.L D0 ; do we have it already?
|
|
Bne.S @10 ; guess so
|
|
|
|
Move.L A4,A0 ; get ptr to new style
|
|
Bsr.S SetHiteAscent ; set line height and font ascent<C971/RWW102887>NO
|
|
Move.W #1,stCount(A0) ; will be used once to start
|
|
Bsr AddStyle ; and add it
|
|
|
|
@10 Move.W D0,styleIndex(A2) ; store new style index
|
|
|
|
NoMatch AddQ #stStartSize,A2 ; point to next style
|
|
SubQ.W #1,D2 ; dec style counter
|
|
Bne styleLoop ; keep looping if not 0
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
_HUnlock
|
|
|
|
Bsr ConcatStyles ; watch out for adjoining styles
|
|
Add.L #stRecSize,SP ; restore stack
|
|
|
|
EndStyle Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetHiteAscent
|
|
;
|
|
; Added 5/30/86 by MBK
|
|
;
|
|
; SetHiteAscent sets the line height and the font ascent based
|
|
; On the given style.
|
|
;
|
|
; Entry:
|
|
; A0: ptr to style (preserved)
|
|
; A3: TEHandle
|
|
;
|
|
;----------------------------------------------------------------------
|
|
SetHiteAscent
|
|
Move.L D2,-(SP) ; save registers
|
|
|
|
; set my style just to get the info I need
|
|
Move.L teGrafPort(A3),A1 ; the port
|
|
Move.W stFont(A0),txFont(A1) ; set font
|
|
Move.W stFace(A0),txFace(A1) ; set face
|
|
bclr #7,txFace+1(a1) ; clear direction <30May89smb>
|
|
Move.W stSize(A0),txSize(A1) ; set size
|
|
|
|
; get the line height and font ascent
|
|
Bsr GetSize ; get ascent & hite ** <C207/10oct86/MBK> **
|
|
|
|
Move.W D0,stAscent(A0) ; save in ascent ** <C207/10oct86/MBK> **
|
|
Move.W D1,stHeight(A0) ; save in line height ** <C207/10oct86/MBK> **
|
|
|
|
Move.L (SP)+,D2 ; restore registers
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; AnyNullStyle
|
|
; <C971/RWW102387>
|
|
;
|
|
; Returns TRUE if a null style exists
|
|
;
|
|
; ENTRY:
|
|
; A3.L = TEPtr
|
|
;
|
|
; EXIT:
|
|
; A0.L => null scrap record (hTE^^.nullStyle^^.nullScrap^)
|
|
;
|
|
; USES:
|
|
; A0.L
|
|
;
|
|
;----------------------------------------------------------------------
|
|
AnyNullStyle
|
|
Move.L teStylesH(A3),A0 ; => style record
|
|
Move.L (A0),A0
|
|
Move.L nullStyle(A0),A0 ; => null style record
|
|
Move.L (A0),A0
|
|
Move.L nullScrap(A0),A0 ; => null scrap record
|
|
Move.L (A0),A0
|
|
Tst.W scrpNStyles(A0) ; Assure null style exists
|
|
Rts
|
|
|
|
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetTrueStyle
|
|
; <C971/RWW102387>
|
|
;
|
|
; Returns the style at the specified offset, whether from null style or
|
|
; inferred from current style. Made subroutine because I needed
|
|
; similar result for GetStylScrap.
|
|
;
|
|
; ENTRY:
|
|
; D0.W = offset into text record
|
|
; A3.L = TEPtr
|
|
;
|
|
; EXIT:
|
|
; A0.L => STElement representing style
|
|
;
|
|
; USES:
|
|
; D0.W, A0.L
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetTrueStyle
|
|
Cmp.W teSelStart(A3),D0 ; start = offset, and…
|
|
Bne.S GetOneStyle
|
|
Cmp.W teSelEnd(A3),D0 ; end = start?
|
|
Bne.S GetOneStyle
|
|
|
|
Bsr.S AnyNullStyle
|
|
Bz.S GetOneStyle ; None exists. Punt.
|
|
|
|
; Yeah, this looks strange. ScrpSTElements and STElements are _almost_
|
|
; the same, except that the first field of ScrpSTElement is a long instead
|
|
; of a word. Fake it as though A0 => STElement
|
|
Lea scrpStyleTab+2(A0),A0
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; GetOneStyle
|
|
; <C971/RWW102387>
|
|
;
|
|
; Returns the style at the specified offset
|
|
;
|
|
;----------------------------------------------------------------------
|
|
GetOneStyle
|
|
Bsr GetCurStyle ; get current style
|
|
Move.W styleIndex(A0),D0 ; get style index
|
|
Bsr GetStyle ; now you have it
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEGetStyle( offset: INTEGER; VAR Styl: StylePtr;
|
|
; VAR lineHite:INTEGER; VAR fontAscent:INTEGER;
|
|
; hTE: TEHandle );
|
|
;
|
|
; Returns the style _OF_THE_CHARACTER_ at the specified offset
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
iTEGetStyle
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; if not, sorry, can't get it
|
|
|
|
Move.L (A2)+,-(SP) ; save ptr to font ascent
|
|
Move.L (A2)+,-(SP) ; save ptr to line height
|
|
Move.L (A2)+,-(SP) ; save style ptr
|
|
|
|
Move.W (A2),D0 ; offset
|
|
|
|
Bsr.S GetOneStyle ; fetch inferred style <C971/RWW102687>
|
|
|
|
Move.L (SP)+,A1 ; point to styleRec
|
|
|
|
Move.W stFont(A0),(A1)+ ; copy font
|
|
Move.W stFace(A0),(A1)+ ; copy face
|
|
clr.b -1(a1) ; clr direction <30May89smb>
|
|
Move.W stSize(A0),(A1)+ ; copy size
|
|
Move.L A0,A2 ; save ptr ** <C182/6oct86/MBK> **
|
|
Lea stColor(A0),A0 ; pt to color ** <C182/6oct86/MBK> **
|
|
Move.W (A0)+,(A1)+ ; copy red ** <C182/6oct86/MBK> **
|
|
Move.W (A0)+,(A1)+ ; copy green ** <C182/6oct86/MBK> **
|
|
Move.W (A0),(A1) ; copy blue ** <C182/6oct86/MBK> **
|
|
|
|
Move.L (SP)+,A1 ; ptr to line height
|
|
Move.W stHeight(A2),(A1) ; store line height
|
|
|
|
Move.L (SP)+,A1 ; ptr to font ascent
|
|
Move.W stAscent(A2),(A1) ; store font ascent
|
|
Bra.S @1
|
|
|
|
; ** <C139/10Sep86/MBK> ** Added this code to return GrafPort info for records without style.
|
|
@0 Bsr GetSize ; get ascent & hite ** <C207/10oct86/MBK> **
|
|
Move.L (A2)+,A0 ; ptr to ascent ** <C207/10oct86/MBK> **
|
|
Move D0,(A0) ; save in ascent ** <C207/10oct86/MBK> **
|
|
Move.L (A2)+,A0 ; ptr to line height ** <C207/10oct86/MBK> **
|
|
Move D1,(A0) ; save in line height ** <C207/10oct86/MBK> **
|
|
|
|
Move.L (A2),A0 ; ptr to style record
|
|
Move.L teGrafPort(A3),A1
|
|
Move.W txFont(A1),(A0)+ ; copy font
|
|
Move.W txFace(A1),(A0)+
|
|
Move.W txSize(A1),(A0)+ ; copy size
|
|
Pea 0(A0) ; ptr to forecolor
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; color QD around? <C971/RWW112487>
|
|
Bnz.S @05 ; nope <C971/RWW112487>
|
|
_GetForeColor ; <C971/RWW112487>
|
|
Bra.S @07 ; <C971/RWW112487>
|
|
@05 Bsr GetForeColor ; <C971/RWW112487>
|
|
@07
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
_GetForeColor ; for Ikki
|
|
Else
|
|
Bsr GetForeColor ; for Alladin
|
|
EndIf
|
|
|
|
@1 MoveQ #20,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;------------------------------------------------
|
|
; SetStyle - sets the style pointed to by A0
|
|
;
|
|
; Entry: A0 Pointer to styleStart (Preserved)
|
|
;
|
|
;------------------------------------------------
|
|
SetStyle
|
|
Move.L A0,-(SP)
|
|
|
|
Move.W styleIndex(A0),D0 ; get index to styleRec
|
|
Bsr GetStyle ; get the styleRec
|
|
|
|
Move.L teGrafPort(A3),A1 ; get the Port
|
|
|
|
Move.W stFont(A0),txFont(A1) ; set font
|
|
Move.W stFace(A0),txFace(A1) ; set face
|
|
bclr #7,txFace+1(a1) ; clr direction <30May89smb>
|
|
Move.W stSize(A0),txSize(A1) ; set size
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; Becks or better? <C971/RWW112487>
|
|
Bnz.S @1 ; nope <C971/RWW112487>
|
|
EndIf
|
|
|
|
If hasCQD|(NOT ForROM) THEN ; <9Dec88smb>
|
|
; Save D2 because the RGBForeColor trap destroys it.
|
|
; Save the style ptr as an offset, since _RGBForeColor may shift memory.
|
|
Move.L teStylesH(A3),A1 ; style handle ** <C717/28jan87/MBK> **
|
|
Move.L (A1),D0 ; dereference ** <C717/28jan87/MBK> **
|
|
Sub.L D0,(SP) ; save as offset ** <C717/28jan87/MBK> **
|
|
Move.W D2,-(SP) ; save D2 for everybody ** <C574/30dec86/MBK> **
|
|
EndIf
|
|
|
|
@1
|
|
Pea stColor(A0) ; point to fgColor ** <C182/6oct86/MBK> **
|
|
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; Becks or better? <C971/RWW112487>
|
|
Bnz.S @2 ; nope <C971/RWW112487>
|
|
_RGBForeColor ; <C971/RWW112487>
|
|
Move.W (SP)+,D2 ; <C971/RWW112487>
|
|
Move.L teStylesH(A3),A1 ; <C971/RWW112487>
|
|
Move.L (A1),D0 ; <C971/RWW112487>
|
|
Add.L D0,(SP) ; <C971/RWW112487>
|
|
Bra.S @3 ; <C971/RWW112487>
|
|
@2 Bsr RGBForeColor ; <C971/RWW112487>
|
|
@3
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
_RGBForeColor ; for Ikki ** <C182/06oct86/MBK> **
|
|
Move.W (SP)+,D2 ; restore D2 ** <C574/30dec86/MBK> **
|
|
|
|
Move.L teStylesH(A3),A1 ; style handle ** <C717/28jan87/MBK> **
|
|
Move.L (A1),D0 ; dereference ** <C717/28jan87/MBK> **
|
|
Add.L D0,(SP) ; restore as ptr ** <C717/28jan87/MBK> **
|
|
Else
|
|
Bsr RGBForeColor ; for Alladin ** <C182/6oct86/MBK> **
|
|
EndIf
|
|
|
|
Move.L (SP)+,A0
|
|
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ConcatStyles
|
|
;
|
|
; Added 6/12/86 by MBK
|
|
;
|
|
; ConcatStyles checks the entire runs array for adjoining
|
|
; identical styles, and concatenates any it finds.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
ConcatStyles
|
|
MoveM.L D2/d3/A2,-(SP) ; save registers ** <C381/7nov86/MBK> **
|
|
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A0 ; dereference
|
|
Move.L styleTab(A0),A2 ; handle to distinct styles ** <C381/7nov86/MBK> **
|
|
Move.L (A2),A2 ; dereference ** <C381/7nov86/MBK> **
|
|
Move.W nRuns(A0),D0 ; get # of style starts
|
|
AddQ #1,D0 ; + dummy end index
|
|
Lea runs(A0),A0 ; ptr to stStarts array
|
|
Move.L A0,A1 ; copy it
|
|
MoveQ #0,D2 ; repetition counter ** <C381/7nov86/MBK> **
|
|
Move.W styleIndex(A0),D1 ; current index ** <C381/7nov86/MBK> **
|
|
|
|
; loop thru styles removing repetitious ones
|
|
@0 SubQ.W #1,D0 ; dec the count
|
|
Beq.S @2 ; done, get out
|
|
|
|
AddQ #1,D2 ; inc repetition counter ** <C381/7nov86/MBK> **
|
|
AddQ.L #stStartSize,A1 ; point to next style
|
|
Cmp.W styleIndex(A1),D1 ; are they the same?
|
|
Beq.S @0 ; don't change ptrs if so
|
|
|
|
SubQ #1,D2 ; dec repetition counter ** <C381/7nov86/MBK> **
|
|
Beq.S @1 ; no repetitions ** <C381/7nov86/MBK> **
|
|
|
|
; ** <C381/7nov86/MBK> ** if any runs are merged, the stCount for that style must also be adjusted
|
|
MulU #stRecSize,D1 ; * size of record ** <C381/7nov86/MBK> **
|
|
Sub.W D2,stCount(A2,D1.L) ; dec count ** <C381/7nov86/MBK> **
|
|
MoveQ #0,D2 ; repetition counter ** <C381/7nov86/MBK> **
|
|
|
|
@1 AddQ.L #stStartSize,A0 ; now pt to next
|
|
Move.L startChar(A1),startChar(A0) ; move start and index
|
|
Move.W styleIndex(A0),D1 ; current index ** <C381/7nov86/MBK> **
|
|
Bra.S @0
|
|
|
|
; shrink the handle to the style info
|
|
@2 Sub.L A0,A1 ; get amount that's redundant as an offset
|
|
Move.L A1,D0
|
|
Move.L teStylesH(A3),A0 ; handle to style info
|
|
Move.L (A0),A1 ; dereference
|
|
AsR.L #2,D0 ; divide diff by 4
|
|
Sub.W D0,nRuns(A1) ; store new # of style starts
|
|
|
|
MoveM.L (SP)+,D2/d3/A2 ; restore registers ** <C381/7nov86/MBK> **
|
|
Rts ; bye
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE ConcatRuns
|
|
;
|
|
; Added 24Nov88 by SMB (taken from DrawIITE.a)
|
|
;
|
|
; ConcatRuns checks for a null style run preceding the dummy run
|
|
; at the end of the style runs, and deletes it if it finds it.
|
|
;
|
|
; Uses a0,a2,d0,d1. Preserves a2.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
ConcatRuns
|
|
move.l ExpandMem,a0 ; <28June89smb>
|
|
move.l ExpandMemRec.vConcatRuns(a0),a0
|
|
jmp (a0)
|
|
|
|
xConcatRuns
|
|
|
|
tst.w teSize(a3) ; don't want to be in here if unstyled! <1Dec88smb>
|
|
bpl.s @NoRuns
|
|
; Don't allow any runs to have offset = text length
|
|
|
|
MOVE.L A2,-(SP)
|
|
MOVE.L teStylesH(A3),A0 ; handle to style info
|
|
MOVE.L (A0),A0 ; dereference
|
|
MOVE.L styleTab(A0),A2 ; handle to distinct styles
|
|
MOVE.L (A2),A2 ; dereference
|
|
MOVE.W nRuns(A0),D0 ; get # of style starts
|
|
BEQ.S @endConcat ; exit if none
|
|
|
|
SUBQ #1,D0 ; point to 1 less than end
|
|
BEQ.S @endConcat ; exit if 1 only
|
|
|
|
;; MULU #stStartSize,D0 ; * size of record
|
|
lsl.w #lnStStartSize,d0 ; replace mulu w/ shift <28June89smb>
|
|
LEA runs(A0,D0.w),A0 ; ptr to last run before dummy
|
|
MOVE.W teLength(A3),D0 ; text length
|
|
CMP.W startChar(A0),D0 ; same as run start?
|
|
BGT.S @endConcat ; okay if less
|
|
|
|
MOVEQ #0,D1
|
|
MOVE.W styleIndex(A0),D1 ; the style
|
|
MULU #stRecSize,D1 ; * size of record
|
|
|
|
SUB.W #1,stCount(A2,D1.L) ; dec count
|
|
ADDQ #1,D0 ; length + 1
|
|
MOVE.W D0,startChar(A0) ; store dummy run here
|
|
MOVE.W #$FFFF,styleIndex(A0) ; last style index
|
|
|
|
MOVE.L teStylesH(A3),A0 ; handle to style info
|
|
MOVE.L (A0),A0 ; dereference
|
|
SUB.W #1,nRuns(A0) ; store new # of style starts
|
|
|
|
@endConcat MOVE.L (SP)+,A2
|
|
@NoRuns
|
|
RTS
|
|
; ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE CheckMatch
|
|
;
|
|
; ** Added 7/19/86 by MBK **
|
|
;
|
|
; CheckMatch checks to see if the input style record matches
|
|
; the style being sought by TEReplaceStyle. If so, a True flag
|
|
; is returned. If the call was from TESetStyle, True is auto-
|
|
; matically returned since the record does not have to match
|
|
; anything.
|
|
;
|
|
; Entry:
|
|
; A0: ptr to style record
|
|
; A6: ptr to style being searched for (0 if from TESetStyle, except
|
|
; in toggle mode)
|
|
; D7: replace mode
|
|
;
|
|
; Exit:
|
|
; D0: flag = 1 if this style may be replaced
|
|
;
|
|
;----------------------------------------------------------------------
|
|
CheckMatch
|
|
MoveQ #1,D0 ; assume okay
|
|
Cmp.L #0,A6 ; call from TESetStyle?
|
|
Beq.S @exit ; quit with true if so
|
|
|
|
; ** <C971/RWW102987> Added code to support doToggle mode
|
|
; Specifically, A6 = -1 is used as a flag in TESetStyle
|
|
Cmp.L #-1,A6 ; ignore toggle mode, too <C971/RWW102987>
|
|
Beq.S @exit ; <C971/RWW102987>
|
|
|
|
BTst #fontBit,D7 ; find font?
|
|
Beq.S @1
|
|
|
|
Move.W tsFont(A6),D1
|
|
Cmp.W stFont(A0),D1 ; same as this style?
|
|
Bne.S @noMatch ; stop comparing if not
|
|
|
|
@1 BTst #faceBit,D7 ; find face?
|
|
Beq.S @2
|
|
|
|
; ** <C971/RWW102787> Faces are byte length…
|
|
Move.B tsFace(A6),D1 ; <C971/RWW102787>
|
|
Cmp.B stFace(A0),D1 ; same as this style? <C971/RWW102787>
|
|
Bne.S @noMatch ; stop comparing if not
|
|
|
|
@2 BTst #sizeBit,D7 ; find size?
|
|
Beq.S @3
|
|
|
|
Move.W tsSize(A6),D1
|
|
Cmp.W stSize(A0),D1 ; same as this style?
|
|
Bne.S @noMatch ; stop comparing if not
|
|
|
|
@3 BTst #clrBit,D7 ; find color?
|
|
Beq.S @exit ; must have a match if still here
|
|
|
|
Move.L tsColor(A6),D1
|
|
Cmp.L stColor(A0),D1 ; same as this style?
|
|
Bne.S @noMatch ; red and green not same ** <C182/6oct86/MBK> **
|
|
|
|
Move.W tsColor+4(A6),D1 ; get blue ** <C182/6oct86/MBK> **
|
|
Cmp.W stColor+4(A0),D1 ; blues the same? ** <C182/6oct86/MBK> **
|
|
Beq.S @exit
|
|
|
|
@noMatch
|
|
MoveQ #0,D0 ; not a match
|
|
|
|
@exit Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEReplaceStyle( ReplaceMode: INTEGER; Style1: STHandle;
|
|
; Style2: STHandle; redraw: BOOLEAN;
|
|
; hTE: TEHandle );
|
|
;
|
|
; ** <C94/29jul86/MBK> **
|
|
;
|
|
; Replaces Style1 by Style2. If the mode is not doAll, the given
|
|
; characteristic will be replaced within all styles in which it's found.
|
|
;
|
|
; Supports the following modes:
|
|
; 1 doFace: replace Face only
|
|
; 2 doSize: replace Size only
|
|
; 4 doFont: replace Font only
|
|
; 8 doColor: replace Color only
|
|
; 15 doAll: replace all modes
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
iTEReplaceStyle
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @1 ; if not, sorry, can't set it
|
|
|
|
; ** <C381/6nov86/MBK> ** boolean value is in bit 1 of high byte
|
|
Move.W (A2)+,D0 ; get redraw value ** <C381/6nov86/MBK> **
|
|
And #$FF00,D0 ; check redraw value ** <C381/6nov86/MBK> **
|
|
Bne.S @0 ; must redraw if set
|
|
|
|
Bsr.S ReplaceGuts ; else just add styles
|
|
Bra.S @1
|
|
|
|
@0 Move.L A2,-(SP) ; save ptr to parameters
|
|
|
|
Bsr HideCaret
|
|
Bsr HiLite ; remove selection
|
|
|
|
Move.L (SP)+,A2 ; restore ptr to parameters
|
|
|
|
Bsr.S ReplaceGuts ; do style munging
|
|
|
|
MoveQ #0,D7 ; length is 0
|
|
|
|
Bsr RecalDraw ; redo the line stuff
|
|
|
|
Bsr ShowCaret
|
|
Bsr HiLite ; restore selection
|
|
|
|
Bsr SelView ; ensure selection is visible
|
|
|
|
@1 MoveQ #18,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
|
|
ReplaceGuts
|
|
MoveM.L D2-D7/A2/A4/A6,-(SP) ; save registers
|
|
Move.L (A2)+,A4 ; replace style ptr
|
|
Move.L (A2)+,A6 ; find style ptr
|
|
Move.W (A2)+,D7 ; save mode here
|
|
|
|
And.W #doAll2,D7 ; only the lower 5 bits make sense <C971/RWW102987>
|
|
|
|
Bsr StyleGuts ; do style munging <C971/RWW102887>NO
|
|
|
|
@0 MoveM.L (SP)+,D2-D7/A2/A4/A6 ; restore registers
|
|
Rts
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEGetOffset( pt: Point; hTE: TEHandle): INTEGER;
|
|
;
|
|
; ** <C94/29jul86/MBK> **
|
|
;
|
|
; Returns the offset into the text corresponding to the given point.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
TEGetOffset
|
|
Bsr StdEntry
|
|
Move.L teSelPoint(A3),-(SP) ; save selPoint
|
|
|
|
; Find the point and get char index of it in D6
|
|
|
|
Move.L (A2)+,teSelPoint(A3) ; pass selPoint
|
|
Bsr DoFind ; juggle dispStart/End and do find
|
|
Move.W D6,(A2) ; dispStart
|
|
|
|
Move.L (SP)+,teSelPoint(A3) ; restore selPoint
|
|
Bra epilog8
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION GetStylHandle( hTE: TEHandle ): TEStylHandle;
|
|
;
|
|
; ** <C94/29jul86/MBK> **
|
|
;
|
|
; Returns the style handle.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;iTEGetStyleHandle ; comment out for now <45>
|
|
;iGetStyleHandle ; comment out for now <45>
|
|
iGetStylHandle
|
|
Clr.L (A2) ; init value to Nil
|
|
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; if not, sorry, can't set it
|
|
|
|
Move.L teStylesH(A3),(A2) ; return the style handle
|
|
|
|
@0 MoveQ #6,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetStylHandle (hST: TEStylHandle; hTE: TEHandle);
|
|
;
|
|
; ** <C105/8aug86/MBK> **
|
|
;
|
|
; Sets the style handle.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;iTESetStyleHandle ; comment out for now <45>
|
|
;iSetStyleHandle ; comment out for now <45>
|
|
iSetStylHandle
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; if not, sorry, can't set it
|
|
|
|
; Dispose of old handle before replacing.
|
|
Move.L teStylesH(A3),A0 ; get old handle
|
|
_DisposHandle ; get rid of it
|
|
|
|
Move.L (A2),teStylesH(A3) ; set the style handle
|
|
|
|
@0 MoveQ #10,D0
|
|
Bra StdExit2
|
|
|
|
|
|
If (NOT hasCQD)|(NOT ForROM) THEN ; <9Dec88smb>
|
|
|
|
;
|
|
; procedure RGBForeColor (Color : RGBColor);
|
|
;
|
|
; This routine takes an RGB triple and sets the current Graf- or CGrafPort
|
|
; fields so that drawing will take place with the best match of the
|
|
; requested color, using the current GDevice's color matching rules. The
|
|
; appropriate fields are set depending on portType
|
|
;
|
|
|
|
RGBForeColor
|
|
Move.L 4(SP),A1 ; point at the RGB color
|
|
|
|
; convert RGB to old-style index value
|
|
; use high bit of each component to select RGB off (0) or on (1)
|
|
MoveQ #0,D1 ; clear out D1
|
|
Move (A1)+,D1 ; get red
|
|
LsL.L #1,D1 ; get high bit
|
|
Move (A1)+,D1 ; get green
|
|
LsL.L #1,D1 ; get high bit
|
|
Move (A1)+,D1 ; get blue
|
|
LsL.L #1,D1 ; get high bit
|
|
Swap D1 ; get RGB index
|
|
|
|
Lea mapTbl,A0 ; get translate table
|
|
MoveQ #0,D0 ; clear out high word
|
|
LsL.W #1,D1 ; word index
|
|
Move 0(A0,D1),D0 ; convert to planar value
|
|
|
|
Move.L GrafGlobals(A5),A0 ; get the QuickDraw globals pointer
|
|
Move.L thePort(A0),A0 ; point at the port
|
|
Move.L D0,fgColor(A0) ; and set the index field
|
|
Move.L (SP)+,A0 ; get the return address
|
|
AddQ #4,SP ; get rid of the parameter
|
|
Jmp (A0) ; and return
|
|
|
|
; TABLE TO MAP FROM 3 BIT RGB TO OLD-STYLE COLOR INDICES
|
|
MapTBL DC.W $21 ; RBG = 0,0,0 -> black
|
|
DC.W $199 ; RBG = 0,0,1 -> blue
|
|
DC.W $155 ; RBG = 0,1,0 -> green
|
|
DC.W $111 ; RBG = 0,1,1 -> cyan
|
|
DC.W $CD ; RBG = 1,0,0 -> red
|
|
DC.W $89 ; RBG = 1,0,1 -> magenta
|
|
DC.W $45 ; RBG = 1,1,0 -> yellow
|
|
DC.W $1E ; RBG = 1,1,1 -> white
|
|
|
|
;
|
|
; PROCEDURE GetForeColor (VAR Color: RGBColor);
|
|
;
|
|
; Return the RGB components of the current foreground color
|
|
; Works for old and new ports.
|
|
|
|
GetForeColor
|
|
Move.L 4(SP),A1 ; point at the RGB color
|
|
Move.L GrafGlobals(A5),A0 ; get the QuickDraw globals pointer
|
|
Move.L thePort(A0),A0 ; point at the port
|
|
|
|
; Use CMYB bits in color to derive proper RGB components
|
|
|
|
Move.L fgColor(A0),D0 ; get planar color from port
|
|
BTst #5,D0 ; test black bit
|
|
Beq.S notBlack ; => color isn't not black
|
|
Or.W #$01C0,D0 ; else set CMY = 111 for black
|
|
notBlack LsR.W #1,D0 ; xxxC MYBR GBwb -> CMYx xxxx
|
|
|
|
MoveQ #2,D1 ; process 3 bits
|
|
nxtBit Clr.W (A1) ; assume component is 0
|
|
LsL.B #1,D0 ; check next component
|
|
Blo.S cmpOK ; => if bit set, component clear
|
|
Not.W (A1) ; else component = $FFFF
|
|
cmpOK AddQ #2,A1 ; advance to next component
|
|
DBra D1,nxtBit ; repeat for all components
|
|
|
|
Move.L (SP)+,A0 ; get the return address
|
|
AddQ #4,SP ; get rid of the parameter
|
|
Jmp (A0) ; and return
|
|
|
|
EndIf
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEGetPoint( offset: INTEGER; hTE: TEHandle): Point;
|
|
;
|
|
; ** <23jan87/MBK> **
|
|
;
|
|
; Returns the point corresponding to the given offset into the text.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
iTEGetPoint
|
|
move.w (a2)+,d0 ; get the offset
|
|
move.l a2,-(sp) ; preserve parameter ptr
|
|
move.w d0,-(sp) ; preserve offset
|
|
cmp.w teLength(a3),d0 ; pin it to the length
|
|
blo.s @LengthOK ; ok if less or same
|
|
|
|
;----------------------------------------------------------------------
|
|
; special case of 0 length and any offset: set the point to the DestRect's left/right edge and use
|
|
; the lineHeight + the DestRect's top. <1/8/90smb>
|
|
cmpi.w #0,teLength(a3) ; is it a 0 length record? <1/8/90smb>
|
|
bne.s @OffsetGELength ; bra if length <> 0 => offset >= length
|
|
; set up return point to be valid (or at least more correct than it was!)
|
|
lea teDestRect+8(a3),a0 ; point past destRect
|
|
lea teSelRect+8(a3),a1 ; and past stack rect
|
|
move.l -(a0),-(a1) ; copying teDestRect to teSelRect
|
|
move.l -(a0),-(a1) ; copying teDestRect to teSelRect
|
|
|
|
move top(a1),bottom(a1) ; temporarily the same
|
|
moveq #0,d0 ; current line
|
|
bsr GetHite ; height of this line returned in d1
|
|
add d1,bottom(a1) ; add line height to get bottom bound of line rect
|
|
addq #1,teSelRect+left(A3) ; indent for caret in case L just
|
|
adda.l #2,sp ; pop offset
|
|
bra.s @AssumeLeftJust
|
|
; finished w/ changes <1/8/90smb>
|
|
;----------------------------------------------------------------------
|
|
|
|
@OffsetGELength
|
|
Move.W teLength(A3),D0 ; else pin to end
|
|
Move.W D0,(SP) ; replace offset
|
|
SubQ #1,D0 ; just for GetLine
|
|
|
|
@LengthOK
|
|
Lea teLines(A3),A2 ; pt to start of array
|
|
Bsr GetLine ; get ptr to line it's on
|
|
|
|
; LineRect expects to be called from RecalLines, which has its own frame. It saves
|
|
; a value off of A6, which in this case destroys the savePort value on the stdEntry frame.
|
|
; So save and restore the value that will be overwritten.
|
|
|
|
with TextFrame,TEFormatOrder ; <1Nov89smb>
|
|
link a6,#TextFrameSz ; for LineRect: calls FormatOrder code <1Nov89smb>
|
|
;; <1Nov89smb> Move.W saveJust(A6),-(SP) ; LineRect will write something here
|
|
Bsr LineRect ; sets up selRect from destRect and justification
|
|
;; <1Nov89smb> Move.W (SP)+,saveJust(A6) ; restore port
|
|
unlk a6 ; <1Nov89smb>
|
|
Move.W (A2),D6 ; start of line
|
|
Move.W (SP)+,D7 ; offset to measure to
|
|
|
|
; If the last char is a CR, the h coord should be at the beginning of the next line after the CR
|
|
; (the v coord was correct, but the h was at the point preceding the CR on the previous line).
|
|
Cmp.W teLength(A3),D7 ; is offset = text length?
|
|
Bne.S @DoEndOfLine ; skip CR test if not
|
|
Move.L teTextH(A3),A0
|
|
Move.L (A0),A0
|
|
Cmp.B #returnChar,-1(A0,D7) ; if last char = CR then...
|
|
Bne.S @DoEndOfLine
|
|
|
|
@AssumeLeftJust
|
|
; assume left justification
|
|
move.w teSelRect+left(a3),d0
|
|
move.w teJust(a3),d1
|
|
bne.s @DoNonLeftJust
|
|
move.w TESysJust,d1
|
|
beq.s @DoTheJustThing
|
|
;; <7Dec89smb> Cmp.W #teForceLeft,D1
|
|
;; <7Dec89smb> Beq.S @DoTheJustThing
|
|
|
|
@DoNonLeftJust
|
|
; <7Dec89smb> move test to teForceLeft to where it's useful!
|
|
cmp.w #teForceLeft,d1 ; <7Dec89smb>
|
|
beq.s @DoTheJustThing ; <7Dec89smb>
|
|
; right or center justification
|
|
move.w teDestRect+right(A3),d0 ; assume right justification
|
|
subq #1,d0
|
|
tst.w d1
|
|
bmi.s @DoTheJustThing ; branch if right
|
|
|
|
; center justification (divide width by 2)
|
|
sub.w teDestRect+left(A3),d0
|
|
asr #1,d0
|
|
add.w teDestRect+left(A3),d0
|
|
bra.s @DoTheJustThing
|
|
@DoEndOfLine
|
|
|
|
IF forLocalizability THEN ; fix for TEGetPoint Bug <31h-YDS-8/27/91>
|
|
move.l ExpandMem,a0 ; do we have more then the roman script
|
|
cmpi.b #1,ExpandMemRec.emScriptsInstalled(a0)
|
|
beq.s @romanMeas ; use MeasureIt
|
|
link a6,#TextFrameSz ; DoMeasure uses a stack frame
|
|
bsr DoMeasure ; measure with LR styles
|
|
unlk a6
|
|
bra.s @1
|
|
ENDIF
|
|
@romanMeas bsr MeasureIt ; measure with style
|
|
@1 add.w teSelRect+left(A3),d0 ; add in justification
|
|
|
|
@DoTheJustThing
|
|
move.l (SP)+,a2 ; restore parameter ptr
|
|
move.w teSelRect+bottom(a3),(a2)+ ; return v coord
|
|
move.w d0,(a2) ; return h coord
|
|
|
|
moveq #8,d0
|
|
bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION GetStylScrap( hTE: TEHandle): StScrpHandle;
|
|
;
|
|
; ** <23jan87/MBK> **
|
|
;
|
|
; Gets the style information corresponding to the current selection and
|
|
; returns a handle to it, stored in the same format as the 'styl' block.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
|
|
;iTEGetStyleScrapHandle ; comment out for now <45>
|
|
;iGetStyleScrap ; comment out for now <45>
|
|
iGetStylScrap
|
|
Clr.L (A2) ; init value to Nil
|
|
Tst.W teSize(A3) ; is it a new TERec?
|
|
Bpl.S EndGet ; quit if not
|
|
|
|
Move.W teSelStart(A3),D0 ; get selstart, selEnd
|
|
Move.W teSelEnd(A3),D1 ; selEnd in D1
|
|
Cmp.W D0,D1 ; compare start to end
|
|
|
|
; Return true style at selection, whether inferred or stated in NullStRec
|
|
Bne.S @05 ; selection - get it <C971/RWW102387>
|
|
|
|
Move.L #scrpRecSize+2,D0 ; size of total scrap style rec <C971/RWW102387>
|
|
Bsr MyNewHandle ; temp handle for style scrap <C971/RWW102387>
|
|
Move.L A0,(A2) ; report back with scrap handle <C971/RWW102387>
|
|
Move.L (A0),A1 ; save as destptr <C971/RWW102387>
|
|
Move.W #1,(A1)+ ; one style total <C971/RWW102387>
|
|
Clr.L (A1)+ ; scrpStartChar := 0 <C971/RWW102387>
|
|
|
|
Move.W teSelStart(A3),D0 ; get offset <C971/RWW102387>
|
|
Bsr GetTrueStyle ; Get style record <C971/RWW102387>
|
|
Lea 2(A0),A0 ; skip over stCount to stHeight <C971/RWW102387>
|
|
|
|
Move.L #scrpRecSize-4,D0 ; amount to copy <C971/RWW102387>
|
|
_BlockMove ; from NullStRec to StScrpRec <C971/RWW102387>
|
|
Bra.S EndGet ; we're outta here <C971/RWW102387>
|
|
@05 ; <C971/RWW102387>
|
|
|
|
Bhs.S @0 ; ok if end >= start
|
|
Exg D0,D1 ; else swap start and end
|
|
|
|
@0 MoveM.L D2-D5/A2/A5,-(SP) ; save stuff
|
|
Bsr CopyGuts ; go to create 'styl' handle
|
|
MoveM.L (SP)+,D2-D5/A2/A5 ; restore stuff
|
|
Move.L A4,(A2) ; return 'styl' handle
|
|
|
|
EndGet MoveQ #6,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE SetStylScrap(rangeStart, rangeEnd: LONGINT; newStyles: StScrpHandle;
|
|
; redraw: BOOLEAN; hTE: TEHandle);
|
|
; ** <C971/RWW102887> **
|
|
;
|
|
; This procedure is the logical opposite of GetStylScrap. It
|
|
; takes a handle to a style scrap record and applies it
|
|
; over the given range. SetStylScrap does not affect the
|
|
; range of the current selection. If newStyles is NIL or
|
|
; if the edit record was not created with TEStylNew, this
|
|
; procedure has no effect.
|
|
; It is easily possible for the range to be out of sync with
|
|
; with the scrap record. In either case, as soon as a
|
|
; boundary is reached, this procedure is terminated without
|
|
; a specific error condition.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
;iTEUseStyleScrap ; comment out for now <45>
|
|
;iSetStyleScrap ; comment out for now <45>
|
|
iSetStylScrap
|
|
Tst.W teSize(A3) ; don't do anything if not styled
|
|
Bpl @xit
|
|
; per documentation, must test for a NIL StScrpHandle handle (newStyles) <20>
|
|
tst.l 2(a2) ; is the scrap handle NIL <20>
|
|
beq @xit ; yep, don't do nuttin! <20>
|
|
Move.W (A2)+,D5 ; get redraw byte <C971/RWW111787>
|
|
And.W #$FF00,D5 ; boolean is bit 1 of high byte <C971/RWW111787>
|
|
Sne D5 ; D5 non-zero if we want to redraw <C971/RWW111787>
|
|
Beq.S @03 ; we don't, so skip hiliting <C971/RWW111787>
|
|
|
|
Bsr HideCaret ; remove hiliting
|
|
Bsr HiLite
|
|
|
|
@03
|
|
Move.L (A2)+,A1 ; fetch scrap handle
|
|
; <17May89smb> must lock the handle before using it
|
|
move.l a1,-(sp) ; save for restoring flags <17May89smb>
|
|
Move.l a1,a0 ; handle to style scrap <17May89smb>
|
|
_HGetState
|
|
move.b d0,-(sp) ; save state flags for handle <17May89smb>
|
|
move.l a1,a0 ; get handle again for lock <17May89smb>
|
|
_HLock ; <17May89smb>
|
|
Move.L (A1),A1 ; point at scrap record proper
|
|
Move.L (A2)+,D7 ; fetch end
|
|
Move.L (A2),D6 ; fetch start
|
|
|
|
Cmp.L D6,D7 ; sort start/end
|
|
Bhs.S @05 ; end is higher or same, so okay
|
|
|
|
Exg D6,D7 ; we want start in D6
|
|
|
|
@05 MoveQ #0,D0 ; make long for comparisons
|
|
Move.W teLength(A3),D0
|
|
Cmp.L D0,D6 ; pin start to end of record
|
|
Bls.S @07
|
|
|
|
Move.L D0,D6
|
|
|
|
@07 Cmp.L D0,D7 ; pin end to end of record
|
|
Bls.S @09
|
|
|
|
Move.L D0,D7
|
|
|
|
@09 Move.L D6,D3 ; make a working copy
|
|
|
|
Move.L teSelStart(A3),-(SP) ; save original start/end
|
|
|
|
Move.W (A1)+,D4 ; number of styles to do
|
|
Bra.S @loop
|
|
|
|
|
|
@1 Cmp.L D3,D7 ; break out if start >= range end
|
|
Bls.S @done
|
|
|
|
Move.W D3,teSelStart(A3) ; save end as new start
|
|
Tst.W D4 ; is this the last scrap entry?
|
|
Bnz.S @2 ; no, calc end from table
|
|
|
|
Move.L D7,D0 ; ran off end of table, so force end
|
|
Bra.S @3
|
|
|
|
@2 Move.L D6,D0 ; calc end of selection
|
|
Add.L scrpRecSize+scrpStartChar(A1),D0
|
|
Cmp.L D7,D0 ; pin end to range end
|
|
Bls.S @4
|
|
|
|
@3 Move.L D7,D0
|
|
|
|
@4 Move.W D0,teSelEnd(A3) ; and save as new end
|
|
Move.L D0,D3 ; (save end as next new start)
|
|
|
|
MoveM.L D3-D7/A1/A4/A6,-(SP) ; <C971/RWW111787>
|
|
|
|
Move.W teSelStart(A3),D0 ; fetch start of style <C971/RWW111787>
|
|
Bsr GetOneStyle ; point at style to copy over <C971/RWW111787>
|
|
Lea stFont(A0),A6 ; TEReplaceStyle expects it in A6 <C971/RWW111787>
|
|
Lea scrpFont(A1),A4 ; point at style to set <C971/RWW111787>
|
|
Move.W #doAll,D7 ; replace everything <C971/RWW111787>
|
|
Bsr StyleGuts ; go replace it <C971/RWW111787>
|
|
|
|
MoveM.L (SP)+,D3-D7/A1/A4/A6 ; <C971/RWW111787>
|
|
|
|
Add #scrpRecSize,A1 ; bump pointer to next scrap entry <C971/RWW111787>
|
|
|
|
@loop DBra D4,@1
|
|
|
|
|
|
@done
|
|
Move.L (SP)+,teSelStart(A3) ; restore previous select/end
|
|
move.b (sp)+,d0 ; state flags for style scrap handle <17May89smb>
|
|
move.l (sp)+,a0 ; handle to reset <17May89smb>
|
|
_HSetState ; <17May89smb>
|
|
|
|
Tst.B D5 ; are we redrawing? <C971/RWW111787>
|
|
Beq.S @xit ; nope, dump out <C971/RWW111787>
|
|
|
|
MoveQ #0,D7 ; no change in lineStarts array
|
|
Bsr RecalDraw
|
|
Bsr ShowCaret
|
|
Bsr HiLite
|
|
Bsr SelView ; ensure selection is visible <C971/RWW111787>
|
|
|
|
@xit MoveQ #20,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TEStylInsert( pText: Ptr; l: LONGINT; hST: StScrpHandle;
|
|
; hTE: TEHandle );
|
|
;
|
|
; This inserts the passed text/length and the associated styles
|
|
; specified in the StScrpHandle just before the selection
|
|
; but doesn't touch the scrap. The selection too is "untouched"
|
|
; because it is offset by the inserted amount to point to the same
|
|
; range. Just after a TEStylNew this can be used as a replacement
|
|
; for the old TESetText because the selection and length are all zero.
|
|
;
|
|
; ** <C734/30jan87/MBK> ** Replaced PutStylScrap by TEStylInsert.
|
|
; TEStylInsert is exactly the same as TEInsert if the TERec is not
|
|
; a style record, or if a NIL style handle is passed in. Otherwise,
|
|
; TEStylInsert inserts the input style information along with the
|
|
; text.
|
|
;
|
|
; ** <C788/11feb87/mbk> ** A2 points to the style handle when we
|
|
; 1st enter here. Before I was getting it after the text and length.
|
|
;----------------------------------------------------------------------
|
|
;iTEStyleInsert ; comment out for now <45>
|
|
iTEStylInsert
|
|
; ** <C766/10feb87/MBK> ** Removed call to StdEntry because TEDispatch does it.
|
|
Bsr HideCaret ; <C971/RWW102887>NO
|
|
Bsr HiLite ; remove selection <C971/RWW102887>NO
|
|
|
|
Move.L (A2)+,D0 ; get style handle ** <C788/11feb87/mbk> **
|
|
MoveQ #0,D7 ; delta = 0(No deletion)
|
|
MoveM.L (A2)+,D5-D6 ; A2 points to length & pointer params
|
|
|
|
; ** <C971/RWW101987> If length is 0, punt
|
|
Tst.L D5 ; length? <C971/RWW101987>
|
|
Bz.S @15 ; Nope, so leave <C971/RWW101987>
|
|
|
|
Tst.L D0 ; check if handle is NIL ** <C788/11feb87/mbk> **
|
|
Beq.S @0 ; can't insert styles if NIL
|
|
|
|
Move.L D0,A2 ; save style handle in A2 ** <C788/11feb87/mbk> **
|
|
Tst.W teSize(A3) ; check style flag
|
|
Bpl.S @0 ; just insert text if not a style record
|
|
|
|
Bsr MungeSetup ; setup for the insert
|
|
Clr.L -(SP) ; fake l1
|
|
Move.L D6,-(SP) ; pointer to insert = p2
|
|
Move.L D5,-(SP) ; length to insert = l2
|
|
_Munger ; use sloppy munger
|
|
AddQ.L #4,SP ; pop result
|
|
Add D5,teLength(A3) ; adjust length by insert amount
|
|
|
|
Move.L teTextH(A3),A0 ; get text handle
|
|
_Hlock ; and relock it
|
|
|
|
Move.L A2,A0 ; get style handle ** <C788/11feb87/mbk> **
|
|
_HGetState ; get the style handle's tag
|
|
Move.B D0,-(SP) ; and save the flags
|
|
_HLock ; and lock it
|
|
|
|
MoveM.L D2-D6/A2/A4,-(SP) ; save stuff
|
|
Move.L A2,A4 ; style handle in A4 ** <C788/11feb87/mbk> **
|
|
|
|
; ** <C851/23Apr87/MBK> ** High word of D3 must be clear for PstStylGuts
|
|
MoveQ #0,D3 ; clear whole register
|
|
|
|
Move.W teSelStart(A3),D3 ; selection start
|
|
Bsr PstStylGuts ; go do the style paste
|
|
MoveM.L (SP)+,D2-D6/A2/A4 ; restore stuff
|
|
|
|
Move.B (SP)+,D0 ; get the flags
|
|
Move.L A2,A0 ; get style handle ** <C788/11feb87/mbk> **
|
|
_HSetState ; set the style handle's tag
|
|
; only call ConcatRuns when styles are pasted, hence moved here. Text inserted now so
|
|
; okay to call.
|
|
Bsr ConcatRuns ; <24Nov88smb> don't leave any null style runs
|
|
|
|
Sub D5,D7 ; adjust delta amount for ReCalLines
|
|
Bra.S @1 ; go recal
|
|
|
|
@0 Bsr InsGuts ; no styles to insert, only text! <C971/RWW102887>NO
|
|
|
|
@1 Bsr RecalDraw ; redo the line stuff
|
|
Add D5,teSelStart(A3) ; selStart:=selstart + insert amount
|
|
Add D5,teSelEnd(A3) ; selEnd:=selEnd + insert amount
|
|
|
|
@15 ; <C971/RWW101987>
|
|
Bsr ShowCaret
|
|
Bsr HiLite ; restore selection <C971/RWW102887>NO
|
|
MoveQ #18,D0 ; # of bytes on stack
|
|
Bra StdExit2 ; to be removed before exit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEGetHeight (endLine, startLine : LONGINT; hTE: TEHandle): LONGINT;
|
|
;
|
|
; ** Rewritten <C971/RWW102387> **
|
|
;
|
|
; Gets the total line height of the document.
|
|
; Now properly sorts endLine and startLine so doesn't need special glue.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
iTEGetHeight
|
|
MoveM.L (A2)+,D0-D1 ; 1st line
|
|
Cmp.L D0,D1 ; Which is larger?
|
|
Bhs.S @05 ; D1 is, so okay
|
|
Exg.L D0,D1 ; Assure endLine in D1
|
|
@05
|
|
Tst.L D0 ; is it 0?
|
|
Bnz.S @0
|
|
MoveQ #1,D0 ; minimum line #
|
|
@0
|
|
SubQ.L #1,D0 ; make it 0-based
|
|
Tst.L D1 ; is it 0?
|
|
Bnz.S @1
|
|
MoveQ #1,D1 ; minimum line #
|
|
@1
|
|
MoveQ #0,D2 ; clear D2 long
|
|
Move.W teNLines(A3),D2 ; last line
|
|
Bne.S @15 ; At least one line! <S443/RWW032588>
|
|
MoveQ #1,D2 ; <S443/RWW032588>
|
|
@15 ; <S443/RWW032588>
|
|
Cmp.L D2,D0 ; pin to last line
|
|
Bls.S @2 ; okay if less or same
|
|
Move.L D2,D0 ; else set to max line
|
|
@2
|
|
Cmp.L D2,D1 ; pin to last line
|
|
Bls.S @3 ; okay if less or same
|
|
Move.L D2,D1 ; else set to max line
|
|
@3
|
|
Bsr GetLineHites ; get total height
|
|
Move.L D0,(A2) ; return total height
|
|
|
|
MoveQ #14,D0 ; # of bytes on stack
|
|
Bra StdExit2 ; to be removed before exit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; PROCEDURE TECustomHook(which: TEHook; VAR addr: ProcPtr;
|
|
; hTE: TEHandle);
|
|
; ** <C971/RWW110487> **
|
|
;
|
|
; This procedure sets the various internal dispatch table
|
|
; addresses, returning the previous contents in addr.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
iTECustomHook
|
|
Move.L (A2)+,A1 ; fetch pointer to new address
|
|
Move.W (A2),D0 ; fetch selector
|
|
LsL.W #2,D0 ; * 4 for long offset
|
|
Move.L teDispatchH(A3),A0 ; get handle to hooks
|
|
Move.L (A0),A0 ; point at table
|
|
;; Add.L D0,A0 ; add in offset <2May89smb>
|
|
Add.w D0,A0 ; add in offset <2May89smb>: changed to word op.
|
|
Move.L (A0),D0 ; fetch old vector
|
|
Move.L (A1),(A0) ; and store away the new one
|
|
Move.L D0,(A1)
|
|
|
|
@xit MoveQ #12,D0 ; # of bytes on stack
|
|
Bra StdExit2 ; to be removed before exit
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TENumStyles(rangeStart, rangeEnd: LONGINT;
|
|
; hTE: TEHandle): LONGINT;
|
|
; ** <C971/RWW111887> **
|
|
;
|
|
; This function returns the number of style changes across
|
|
; a given range.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
iTENumStyles
|
|
Move.L (A2)+,D1 ; get end of range
|
|
Move.L (A2)+,D0 ; get start of range
|
|
|
|
Cmp.L D0,D1 ; Which is larger?
|
|
Bhi.S @1 ; D1 is, so okay
|
|
Beq.S @3 ; (special case when both same)
|
|
|
|
Exg.L D0,D1 ; Assure endLine in D1
|
|
|
|
@1 Tst.W teSize(A3) ; if it is an old TERec
|
|
Bmi.S @2
|
|
|
|
@3 MoveQ #1,D0 ; signify one style exists
|
|
Bra.S @xit
|
|
|
|
@2 Clr.L D2 ; pin rangeEnd to selEnd <C971/RWW111987>
|
|
Move.W teSelEnd(A3),D2 ; <C971/RWW111987>
|
|
Cmp.L D2,D1 ; <C971/RWW111987>
|
|
Bls.S @4 ; <C971/RWW111987>
|
|
|
|
Move.L D2,D1 ; rangeEnd was larger, force selEnd <C971/RWW111987>
|
|
|
|
@4 Bsr GetCurStyle
|
|
Bsr GetNumStyles
|
|
|
|
@xit Move.L D0,(A2) ; store away result
|
|
MoveQ #14,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; FUNCTION TEContinuousStyle(VAR mode: INTEGER; VAR aStyle: TextStyle;
|
|
; hTE: TEHandle): BOOLEAN;
|
|
; ** <C971/RWW102687> **
|
|
;
|
|
; This function gives you information about the continuity of
|
|
; various aspects of the current selection. The result
|
|
; returned is TRUE if the given style exists across the
|
|
; entire selection range. The style attributes to check
|
|
; are specified by the mode parameter, which takes the
|
|
; same values as in TESetStyle. Attributes which are
|
|
; continuous across the current selection range are
|
|
; returned in aStyle, with the appropriate bits set in
|
|
; mode. If the selection range is an insertion point,
|
|
; this call duplicates TEGetStyle, except that the returned
|
|
; style reflects the style of the _next_character_typed_.
|
|
; The attribute bits of aStyle.tsFace are individually
|
|
; checked across the selection range, and are returned set
|
|
; to 1 if that attribute is indeed continuous.
|
|
;
|
|
;----------------------------------------------------------------------
|
|
iTEContinuousStyle
|
|
Tst.W teSize(A3) ; is it a new TERec?
|
|
Bmi.S @1 ; yes it is, continue
|
|
|
|
Move.L (A2),A0
|
|
Move.L teGrafPort(A3),A1
|
|
Move.L txFont(A1),(A0)+ ; copy font/face
|
|
Move.W txSize(A1),(A0)+ ; copy size
|
|
Pea 0(A0) ; ptr to forecolor
|
|
If NOT ForROM THEN ; <9Dec88smb>
|
|
BTst #14,ROM85 ; Becks or better? <C971/RWW112487>
|
|
Bnz.S @2 ; nope <C971/RWW112487>
|
|
_GetForeColor ; <C971/RWW112487>
|
|
Bra.S @3 ; <C971/RWW112487>
|
|
@2 Bsr GetForeColor ; <C971/RWW112487>
|
|
@3
|
|
ElseIf hasCQD THEN ; <9Dec88smb>
|
|
_GetForeColor ; for Mac II
|
|
Else
|
|
Bsr GetForeColor ; for all others
|
|
EndIf
|
|
ST 8(A2) ; only one style, so everything's continuous
|
|
Bra.S @xit
|
|
@1
|
|
Bsr.S ContGuts
|
|
@xit
|
|
MoveQ #14,D0
|
|
Bra StdExit2
|
|
|
|
;formFeed
|
|
;----------------------------------------------------------------------
|
|
;
|
|
; ContGuts
|
|
; <C971/RWW102687>
|
|
; <S425/RWW031688> Rewrote according to suggestions from DTS. Now no face information
|
|
; needs to be passed in. If ANY face information is continuous across
|
|
; the selection, doFace is returned TRUE if it was requested.
|
|
; Seems this is a more required case than the original allowed for,
|
|
; (and besides, it is a helluva lot easier case to code for)
|
|
;
|
|
; Does actual work of TEContinuousStyle
|
|
;
|
|
;----------------------------------------------------------------------
|
|
contArgs Record 0
|
|
contStyle Ds.L 1
|
|
contMode Ds.L 1
|
|
contResult Ds.B 1
|
|
EndR
|
|
|
|
ContGuts
|
|
With contArgs
|
|
|
|
MoveM.L D3-D7/A4,-(SP) ; save working registers
|
|
|
|
Move.W teSelStart(A3),D0 ; insertion point gets handled differently
|
|
Cmp.W teSelEnd(A3),D0
|
|
Seq D5 ; show as an insertion point
|
|
Bne.S @1
|
|
|
|
Bsr AnyNullStyle ; use null style if available
|
|
Bnz.S @1
|
|
|
|
Tst.W D0 ; otherwise, we want style of character…
|
|
Bz.S @1 ; …just _before_ insert point
|
|
|
|
SubQ.W #1,D0 ; (exception is top of record, obviously)
|
|
|
|
@1 Bsr GetTrueStyle
|
|
|
|
Move.L contStyle(A2),A1 ; point at receiving record
|
|
|
|
Move.L stFont(A0),tsFont(A1) ; move TextStyle
|
|
Move.L stSize(A0),tsSize(A1)
|
|
Move.L stColor+2(A0),tsColor+2(A1)
|
|
|
|
; aStyle is primed with the style of the selection start. Find the StyleRun that
|
|
; determines the selection start and walk through the style changes, noting differences
|
|
|
|
Move.B stFace(A0),D7 ; save start face for compare later <S425/RWW031688>
|
|
Move.B D7,D6 ; make a working copy
|
|
|
|
Move.L contMode(A2),A0 ; point at mode
|
|
Move.W (A0),D0 ; save mode for comparison later
|
|
And.W #$000F,D0 ; only low 4 bits make any sense
|
|
Move.W D0,D4 ; D4 = working register <S425/RWW031688>
|
|
Move.W D0,D3 ; D3 = original request <S425/RWW031688>
|
|
|
|
Tst.B D5 ; insertion point?
|
|
Bnz @goodxit ; yes, so no need to consult style entries <S425/RWW031688>
|
|
|
|
Move.W teSelStart(A3),D0 ; get selection start
|
|
Bsr GetCurStyle ; get the current StyleRun
|
|
Move.L A0,A4 ; (we don't need the TEHandle…)
|
|
|
|
@loop AddQ #stStartSize,A4 ; actually, we want the next one
|
|
|
|
Tst.W D4 ; if we've reset all bits…
|
|
Bz.S @2 ; …it's senseless to go on
|
|
|
|
Move.W startChar(A4),D0 ; if negative, we're off end of table
|
|
Bmi.S @2
|
|
|
|
Cmp.W teSelEnd(A3),D0 ; if past end of selection, we're done
|
|
Bhs.S @2
|
|
|
|
Move.W styleIndex(A4),D0 ; get index into style table
|
|
Bsr GetStyle ; go get it
|
|
|
|
; In order for this to work, neither GetCurStyle nor GetStyle can mess with A1!!!!!…
|
|
BTst #fontBit,D4 ; check font?
|
|
Bz.S @3
|
|
|
|
Move.W tsFont(A1),D0
|
|
Cmp.W stFont(A0),D0 ; do fonts match?
|
|
Beq.S @3 ; yes, go on
|
|
|
|
BClr #fontBit,D4 ; don't need to check it anymore
|
|
|
|
@3 BTst #sizeBit,D4 ; check size?
|
|
Bz.S @4
|
|
|
|
Move.W tsSize(A1),D0
|
|
Cmp.W stSize(A0),D0 ; do sizes match?
|
|
Beq.S @4 ; yes, go on
|
|
|
|
BClr #sizeBit,D4 ; don't need to check it anymore
|
|
|
|
@4 BTst #clrBit,D4 ; check color?
|
|
Bz.S @5
|
|
|
|
Move.L tsColor(A1),D0
|
|
Cmp.L stColor(A0),D0 ; do red/green match?
|
|
Bne.S @6 ; no, reset bit
|
|
Move.W tsColor+4(A1),D0
|
|
Cmp.W stColor+4(A0),D0 ; does blue match?
|
|
Beq.S @5
|
|
|
|
@6 BClr #clrBit,D4 ; don't need to check it anymore
|
|
|
|
; Comparing faces is a bit tricky. If we started out plain, merge in style bits.
|
|
; Otherwise, calculate intersection of bit sets
|
|
@5 BTst #faceBit,D4 ; check face?
|
|
Bz.S @loop
|
|
|
|
Tst.B D7 ; did we start out with plain style?
|
|
Bnz.S @8
|
|
|
|
Or.B stFace(A0),D6 ; Don't fall through anymore <S488/RWW050388>
|
|
Bra.S @loop ; <S488/RWW050388>
|
|
|
|
@8 And.B stFace(A0),D6
|
|
Bra.S @loop
|
|
|
|
|
|
|
|
; We come here when we're done perusing the selection range.
|
|
; Now, we have to resolve the doFace bit. This is all complicated by the fact that
|
|
; “plain” isn't a style attribute, but rather a lack of other styles.
|
|
@2 BTst #faceBit,D4 ; check face?
|
|
Bz.S @xit ; nope, skip resolution
|
|
|
|
; <S425/RWW031688> All this is new, for new handling of face information
|
|
Tst.B D7 ; did we start out with plain? <S425/RWW031688>
|
|
Bnz.S @notPlain ; nope, go on <S425/RWW031688>
|
|
|
|
Tst.B D6 ; if ended with plain, hunky dory <S425/RWW031688>
|
|
Bz.S @goodxit ; save result and exit <S425/RWW031688>
|
|
|
|
@badxit BClr #faceBit,D4 ; no good. reset bit <S425/RWW031688>
|
|
Bra.S @xit ; …and leave <S425/RWW031688>
|
|
|
|
@notPlain Tst.B D6 ; end with any intersection? <S425/RWW031688>
|
|
Bz.S @badxit ; nope, so nothing was continuous <S425/RWW031688>
|
|
|
|
@goodxit Move.B D6,tsFace(A1) ; save intersection to aStyle <S425/RWW031688>
|
|
|
|
@xit Move.L contMode(A2),A0 ; Point at mode
|
|
Move.W D4,(A0) ; save intersection back to mode
|
|
|
|
Cmp.W D4,D3 ; Was everything continuous? <S425/RWW031688>
|
|
|
|
Seq D0 ; TRUE if everything was equal <S425/RWW031688>
|
|
Neg.B D0 ; Blaise wants false=0 and true=1 <C971/RWW111687>
|
|
Move.B D0,contResult(A2) ; Blaise wants false=0 and true=1 <C971/RWW111687>
|
|
MoveM.L (SP)+,D3-D7/A4 ; Retrieve working registers
|
|
Rts
|
|
|
|
EndWith ;contArgs
|
|
|
|
|
|
; *************************************************************************************************
|
|
; *************************************************************************************************
|
|
; *************************************************************************************************
|
|
|
|
; TextEdit end
|