home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!charon.amdahl.com!pacbell.com!decwrl!sdd.hp.com!zaphod.mps.ohio-state.edu!usc!elroy.jpl.nasa.gov!ames!data.nas.nasa.gov!taligent!apple!cambridge.apple.com!bill@cambridge.apple.com
- From: bill@cambridge.apple.com (Bill St. Clair)
- Newsgroups: comp.lang.lisp.mcl
- Subject: Re: parallel text dialog items
- Message-ID: <9211131636.AA15250@cambridge.apple.com>
- Date: 13 Nov 92 17:41:37 GMT
- Sender: info-mcl-request@cambridge.apple.com
- Lines: 92
- Approved: comp.lang.lisp.mcl@Cambridge.Apple.C0M
-
- At 20:01 11/11/92 +0000, Christopher Owens wrote:
- >In <1992Nov9.172923.6367@midway.uchicago.edu> Tom McDougal <mcdougal@cs.uchicago.edu> writes:
- >
- >>>I want to have text appear simultaneously in two places within a
- >>>window. A variant on the text-edit-dialog-item (from the examples
- >>>folder) would be fine, but I'm not sure how to pass the key-events
- >>>to multiple dialog items. Several attempts so far have failed.
- >
- >Do you need the user to be able to type into either window?
- >
- >I'd suggest that you create two editable-text-dialog-items that share
- >a common buffer, by munging the "FREC" slots of the
- >editable-text-dialog-items. Since they now share a buffer, this
- >obviates the need for spoofing keystrokes to one dialog item when the
- >user types in the other.
- >
- >You'll still need to force an update of the second dialog item every
- >time the first is redrawn.
-
- There is a documented way for two FRED-DIALOG-ITEM's to share a
- common buffer. It's not necessary to munge the FREC slot.
-
- (let (et1)
- (make-instance 'window
- :view-size #@(200 210)
- :window-type :document
- :view-subviews (list (setq et1
- (make-instance 'fred-dialog-item
- :view-position #@(5 5)
- :view-size #@(190 90)
- :dialog-item-text "Some text to start with"))
- (make-instance 'fred-dialog-item
- :view-position #@(5 100)
- :view-size #@( 190 90)
- :buffer (fred-buffer et1)))))
-
- Unfortunately, this does not work quite right. When you type in one of
- the dialog items, the other one is not updated. Also, the :dialog-item-text
- given to the first one is erased as soon as the second item is created.
- These are both MCL bugs. I guess noone has yet tried sharing a buffer
- between two fred-dialog-item's. I have prepared a patch to fix this bug
- which will be part of patch 2 for MCL 2.0. If you want the patch before then,
- ask for "shared-fred-buffer-patch".
-
- At 20:36 11/11/92 +0000, Tom McDougal wrote:
- >First, there was a biiiig mistake in my original code, which
- >should have been obvious. See if you can spot it:
- >
- >>> (defclass twin-text-item (aligned-text-dialog-item)
- >>> ((brother :accessor brother :initarg :brother
- >>> :type 'text-edit-dialog-item)))
- >>>
- >>> (defmethod key-event-handler :after ((self twin-text-item) char)
- >>> (key-event-handler (brother self) char))
- >
- >See it? 'key-event-handler' should have been
- >'view-key-event-handler'.
- >
- >Given that correction, the code above works for instances of
- >editable-text-dialog-item, but not for instances of
- >text-edit-dialog-item (defined in the examples folder). In the latter
- >case, duplicates of each keystroke end up going to the same view.
- >Why?
- >
- >It seems as though keystrokes are always handled by the window's
- >key-event-handler. So the following correction works:
- >
- > (defmethod view-key-event-handler :after ((self twin-text-item) char)
- > ; change the window's key event handler to BROTHER's handler
- > (set-key-event-handler (view-container self)
- > (key-event-handler (brother self)))
- > ; process the keystroke again
- > (view-key-event-handler (brother self) char)
- > ; restore SELF's handler as window's key event handler
- > (set-key-event-handler (view-container self) (key-event-handler
- >self)))
-
- Youve found the secret. Once upon a time, each text-edit-dialog-item
- had its own TextEdit record. One of us realized that it was only necessary
- to have one TextEdit record that everyone could share. Since this reduces
- consing in the Mac heap, it's part of the TEXT-EDIT-DIALOG-ITEM implementation.
- SET-KEY-EVENT-HANDLER calls VIEW-ACTIVATE-EVENT-HANDLER which changes the
- shared TextEdit record to point at the activated view.
-
- >
- >All suggestions have involved using editable-text-dialog-items, which
- >I will use if necessary, but the whole reason for going to text-edit-
- >dialog-items was to avoid the extra bulk of fred dialog items.
-
- This will make sense once a small application generator exists for MCL.
- Until then (which will be a while), there is no (easy) way to purge Fred from
- your world, so you won't lose anything by using it.
-