This month we inaugurate a question-and-answer format for this column. You supply the questions, and I'll do my best to supply the answers. As a print publication, our lead time is too long to help you with those burning 4-in-the-morning do-or-die questions. But if you've come across something in Inside Macintosh that's been puzzling you; or you've been scratching your head about how make the Mac do something you're going to need it to do a few months hence; or you'd like an explanation of some aspect of an example you've seen in MacTutor (or elsewhere) -- write to Prof. Mac, c/o MacTutor.

We start off with a couple of genuine questions from MacTutor readers, followed by a few ringers.

TextEdit

David R. Hunt of Ypsilanti, MI had some questions about TextEdit after reading the Forth Forum in the June, 1985 issue. I'll address these questions with respect to TextEdit in general, rather than specifically with respect to MacFORTH. MacFORTH's interface to TextEdit is described in Section 3 of the Level Two MacFORTH manual.

Q.How big can a TE Record be? How much text can be in a TE Record?

A.First, note that a TERec (TextEdit record) contains information about the text to be edited, but it does not contain the text itself. The text is located elsewhere in memory; the TERec contains a handle to the text. The TextEdit routines maintain both the TERec and the text; you don't have to be concerned with the location of the text in memory.

Background on TextEdit

To preserve the Mac way of doing things, Apple defined a consistent approach to dealing with the entry, editing and display of text information that would operate cleanly with the graphics oriented hardware design built Input is a collection of ROM toolbox routines that handle simple text editing, and is known collectively as "TextEdit". Think of it as a mini-editor built into the ROM. The mystery of the Mac approach to text editing lies in the fact that the Mac does not have a traditional character generator. Everything is displayed on the screen and within the system in bit-mapped graphics via quickdraw. Thus each character of text is a graphics symbol made up of screen bits. This both provides the flexibility of the Mac in generating different fonts, sizes and orientations while at the same time making the control of text information more complex. The text edit record structure is a method of isolating the text itself and the information about how the text is to be displayed in two different data structures. The text is stored in a coded linear array while all the information about how that array of text should look is stored in the text edit record. If any of the text changes style or font, that text must be associated with another text edit record to describe how it is to be displayed. Thus if a document has many font changes, more and more text edit records must be generated for each section of text. (See Fig. 1)

Figure 1.

TextEdit Capabilities

(1) Insert new text

(2) Delete text via the backspace key

(3) Select text with the mouse

(4) Scroll text within a window

(5) Cut and Paste of text between the clipboard

(6) Display of selection bar and text hi-lighting

(7) Word wrapping of text

(8) Left, centered or right justified text

TextEdit Limitations

(1) Only one font per text edit record

(2) No fully justified text

(3) no tab support

(4) only simple cut and paste

Clipboard Support

The new phone book version of Inside Macintosh points out that cut or copying text with TextEdit places that text in a special TextEdit scrap that is only used within TextEdit. A different scrap is used to support the clipboard for moving text between applications. Documentation for the routines that move text into this second scrap has now been added to Inside Macintosh.

The important components of a TERec are shown on page 48 of the June issue; the complete TERec structure is detailed in Inside Macintosh, /TEXTEDIT/EDIT.2, p. 9. For a complete discussion of how text editing interfaces with windows, see Bob Denny's C column in the May 1985 issue of MacTutor.

And now back to the Question...

At the end of a TERec is a variable- length array called lineStarts; there is one 16-bit unsigned element in the array for each line of text. Each element contains the position (offset) within the text of the start of a line. The number of lines (and hence the number of elements in the lineStarts array) is contained in a 16-bit signed field of the TERec called nLines. The maximum value of nLines 32,767. Thus, the maximum number of lines in the text, and of elements in the lineStarts array, is 32,767.

Since each element of the lineStarts array is an unsigned 16-bit quantity, each element has a maximum value of 65,535. Thus, the position of the last line of the text cannot be more than 65,535 characters away from the beginning of the text.

Therefore, the text can have at most 32,767 lines, and the number of characters preceding the last line can be at most 65,535. The size of the TERec itself is the total of the sizes of its fixed-length fields -- 96 bytes -- plus the size of the lineStarts array (2 bytes for each line).

Q. Can I have more than 1 TE record in a window?

A. Strictly speaking, the TERec is not "in" a window; it is merely a data structure describing some text (located elsewhere in memory) and describing where and how the text is to be displayed. In fact, TextEdit does not "know" about windows at all. It displays the text within a grafPort; the grafPort is not necessarily one with which a window is associated (although in practice it almost always is a window's grafPort).

The grafPort in which the text assocatiated with a TERec will be drawn is the grafPort that was current at the time the TERec was created. Its address is stored in the inPort field of the TERec. TextEdit locates the display area for the text within the grafPort as specified by a destination rectangle whose coordinates (local to the grafPort) are contained in the destRect field of the TERec. The destRect is specified by the programmer as a parameter to the TENew routine (which creates a TERec).

There can be more than one TERec associated with the same grafPort, and hence with the same window. In this case, each TERec would have a different, non-overlapping destRect within the grafPort (or window).

Q. What happens if I update a window with multiple TE records?

A. Remember that updating is not an automatic process. Your application is notified that an update event has occurred, which means that a window needs to be updated. Generally speaking, you must do the actual updating, or redrawing of the contents of the window, yourself.

However, TextEdit makes it easy to update the text portion(s) of a window. You call TEUpdate, giving it a rectangle in which to (re)draw the text, and a handle to the TERec associated with the text. Usually, the rectangle you'd pass to TERec would be simply the portRect of the window. If there are multiple TERecs associated with a window, you'd call TEUpdate once for each TERec. All of the calls would be bracketed between calls to BeginUpdate and EndUpdate, which is the way window updating is done generally (regardless of whether text is involved).

Q. In my application, I want to issue text to a TE Record. How do I do it?

A. As noted above, the text itself is not contained in the TERec; rather, a handle to the text is contained in the TERec. If you have some preexisting text which you want to associate with a TERec (replacing any text already associated with it, if any), you call TESetText. The parameters to TESetText are the address of the text, its length, and a handle to the TERec. This establishes the connection between a linear array of text, the text edit record that describes how and where the text is to be displayed, and the screen area where a portion of that text may or may not be visible to the user.

To insert some new text into text already associated with a TERec, you call TEInsert, passing to it the address of the text to be inserted, its length, and a handle to the TERec. The insertion will occur just before the current selection range.

If the current selection range is an insertion point (indicated on the screen by a blinking vertical bar, or caret), you can insert a single character there by calling TEKey. The parameters to TEKey are the character, and a handle to the TERec. TEKey is so named because usually the character is one that was typed by the user and obtained from the event record associated with a keyDown event, but this is not necessarily the case: you can specify any character. If, when TEKey is called, the selection range is indeed a range (indicated on the screen by white-on-black text) instead of an insertion point, the range will be replaced by the character.

Q. Do I append the TE records together, or leave them separate?

A. I hope it's clear from the above that TERecs cannot be concatenated. Each is a separate structure, describing how and where to display text associated with it.

Q. My worst problem: TE records are utterly unlike text processing as I have previously known it on mainframes. Could you show me how to make this transition?

A. I hope the preceding answers have helped some. You may be suffering from an embarrassment of ROM riches: in most systems, a programmer must take care of all the details of text editing himself. But on the Mac, the TextEdit facility does almost all of the work for you. Figure 1 at the beginning of this article may help to present the big picture.

Mac Pascal Bug

In last month's Letters section, Jack Cassidy of San Diego provided a simple Macintosh Pascal program that bombs for no apparent reason. Our editor promised that I'd look into the problem.

A. Unfortunately, Jack has run into a bug in Mac Pascal: it does not handle array references correctly where the subscript is an enumerated type. A workaround is to do away with the enumerated type and replace it with a collection of constants. This retains some of the readability provided by enumeration, at the expense of some coding tedium. For example:

Note that in the program that bombs, ord(one)=0, but in the workaround version ord(one)=1. This makes no significant difference; I just wanted to avoid writing the apparently illogical "one = 0; two = 1;" etc. If the names of the constants were not those of numbers, then the first one could be given the value 0 without risk of confusion.

MaxApplZone

Now here's one of my own questions. The MaxApplZone procedure is marked "No trap macro" in Inside Macintosh, implying you can't use it from Assembly.

The fact that the MC68000 hardware divide instructions handle only 16-bit divisors and return 16-bit results presents another question:

Q. How would I do 32-bit unsigned division in MDS assembler?

A. See the code below.

the alternatate code is indicated as being faster in the chart, it will indeed be faster on the Mac. Those with an eye to the future should note that the relative slowness of CLR for a memory operand results from the 68000 doing a superfluous read of the operand before writing it; but this is not true of the MC68020.

Q. Asm gave me an error message for CMP (A0)+,(A1)+. After I changed the opcode to CMPM, my program bombed later with an address error. Why?

A. The release version (1.0) of the MDS assembler does not automatically generate CMPM as it should when CMP is coded with two auto-increment operands; you must explictly tack on the "M." Further, if you code CMPM, it generates a CMPM.B; to compare words, you must code CMPM.W.

Community Search:

MacTech Search:

Software Updates via MacUpdate

VirtualBox 5.1.30 - x86 virtualization s...

VirtualBox is a family of powerful x86 virtualization products for enterprise as well as home use. Not only is VirtualBox an extremely feature rich, high performance product for enterprise customers... Read more

ScreenFlow 7.1.1 - Create screen recordi...

ScreenFlow is powerful, easy-to-use screencasting software for the Mac. With ScreenFlow you can record the contents of your entire monitor while also capturing your video camera, microphone and your... Read more

Adobe Flash Player 27.0.0.170 - Plug-in...

Adobe Flash Player is a cross-platform, browser-based application runtime that provides uncompromised viewing of expressive applications, content, and videos across browsers and operating systems.... Read more

TotalFinder is a universally acclaimed navigational companion for your Mac. Enhance your Mac's Finder with features so smart and convenient, you won't believe you ever lived without them.
Features... Read more

Backblaze 5.1.0.134 - Online backup serv...

Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more

Postbox 5.0.20 - Powerful and flexible e...

Postbox is a new email application that helps you organize your work life and get stuff done. It has all the elegance and simplicity of Apple Mail, but with more power and flexibility to manage even... Read more

QuarkXPress 2017 is the new version that raises the bar for design and productivity. With non-destructive graphics and image editing directly within your layout, you no longer have to choose between... Read more

Backblaze 5.1.0.134 - Online backup serv...

Backblaze is an online backup service designed from the ground-up for the Mac. With unlimited storage available for $5 per month, as well as a free 15-day trial, peace of mind is within reach with... Read more

Latest Forum Discussions

Color Ballz is an addictive new arcade title from Ketchapp Studios. It takes old school mechanics from games like Brickles and puts a fun twist on it. Your job? To catch balls with a paddle and send them back into a chute to be carried back to... | Read more »

Q&A: A-33 Studio explains why Combat...

When it comes to mobile FPS, it’s often tricky to get the fundamentals right on a platform lacking a physical controller, large display and hefty RAM. With Combat Squad: Project Wednesday, A-33 Studio bravely took on the challenge of making a... | Read more »

Taichi Panda 3: Dragon Hunter guide - ti...

Taichi Panda 3: Dragon Hunter launched this week to players all over the world. It's a beautiful mobile MMORPG that blends elements of Eastern and Western fantasy. It reminds us of a mix between World of Warcraft and Jade Empire.
MMO's can have a... | Read more »

The best new games we played this week -...

Phew. It has been a week, but now it's time to relax, put your feet up, and enjoy some brand new mobile games. It was a bit of slow week, but there's still plenty of new titles to add to your collection. Here are four of our favorites.
[Read... | Read more »

Into the Dead 2 is an endless gunner, of sorts, with a lot of grit and satisfying gunplay behind it. The game looks amazing, and tells an effective story to boot. Plus, it has some quality voice acting behind it to really bring the story to life... | Read more »

Smash Up - The Card Game (Games)

Smash Up - The Card Game 1.0.7
Device: iOS Universal
Category: Games
Price: $4.99, Version: 1.0.7 (iTunes)
Description:
***“It’s a goofy theme with fun art and high replayability, but beneath that veneer of casual play is a great... | Read more »

Dive in to Combat Squad if you’re lookin...

Earlier this year, A-33 Studio made the leap from developing Counter Strike Online to launching its very own FPS for the mobile. Combat Squad: Project Wednesday pits your team of mercs against the world in multiplayer death matches, so if you’re on... | Read more »

The Talos Principle comes to mobile -- h...

Sci-fi puzzler The Talos Principle arrived on the App Store this week. The game, which tells the tale of a newly awokened robot, is a philosophical story of what it means to be human, while the player explores over 100 different areas in a... | Read more »

Bare Bones Software has announced the release and immediate availability of BBEdit 12.0, a significant upgrade to its professional strength text and code editor.
BBEdit 12 introduces a new foundation... Read more

Yale Announces Availability of Apple HomeKit-...

Yale Locks & Hardware has announced that Apple HomeKit support for its Assure Lock family is available this month. The new Yale iM1 Network Module, which provides support for the Apple Home app... Read more

Clearance 2016 13″ MacBook Pros, refurbished,...

Apple has Certified Refurbished 2016 13″ MacBook Pros available starting at $1189. An Apple one-year warranty is included with each model, and shipping is free:
– 13″ 2.9GHz/512GB Touch Bar Gray... Read more

Amazon has the Silver 13″ 3.1GHz/256GB MacBook Pro (MPXX2LL/A) on sale for $1699 including free shipping. Their price is $100 off MSRP.
Read more

12″ MacBook available for $1099 with Apple re...

Apple has Certified Refurbished 2017 12″ Retina MacBooks available for $200-$240 off the cost of new models. Apple will include a standard one-year warranty with each MacBook, and shipping is free.... Read more

MacTech is a registered trademark of Xplain Corporation. Xplain, "The journal of Apple technology", Apple Expo, Explain It, MacDev, MacDev-1, THINK Reference, NetProfessional, Apple Expo, MacTech Central, MacTech Domains, MacNews, MacForge, and the MacTutorMan are trademarks or service marks of Xplain Corporation. Sprocket is a registered trademark of eSprocket Corporation. Other trademarks and copyrights appearing in this printing or software remain the property of their respective holders. Not responsible for typographical errors.

All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.