CLIM mail archive

[Prev][Next][Index][Thread]

REAL simple text editor ... almost



I want someone to be able to edit a single line of text,
and (if they want) add additional text to it, add additional
newlines of text, including empty ones. The enclosed code comes
so close it drives me crazy I can't get it to work.

If the presentation-type-option :echo-space to sequence is set to NIL, it
doesn't start each newline with an space (which is what I want), but the
display gets very confused if you enter multiple #\returns (like you would for
a paragraph): It doesn't echo more than the first #\return, but if you erase
or otherwise cause the window to refresh, the text shows up where its supposed
to be AND on the line you meant to be blank, and the cursor remains on the
line you meant to be blank

If the presentation-type-option :echo-space is set to T, you get a space at
the start of each newline, but the display is less confused - initially. Type
in a line and then start a new paragraph, and then go back and edit the first
line: edits done within the original characters are fine, but adding to the
end of the line results in the display losing the characters which are above 
the characters in the line of the next paragraph - a refresh (such as when you
backspace to erase) fixes it temporarily.

Finally, everything before the IP (insertion point) is returned when you hit
#\end, the rest is lost - if IP = FP, no problem.

If this worked it would be awfully elegant, don't ya think?

;;;;1 FakeTeX Package

0(defpackage 2FakeTeX 0(:nicknames FT)
	    (:use clim-lisp clim))

(in-package 'FT)

(defun 2text-edit 0(&optional (object ""))
  (let ((*standard-activation-gestures* '(#\end))
	(first-time T)
	(stream (open-window-stream :port (find-port) :width 500 :height 400))
	(input nil))
    (setf (window-visibility stream) T)
    (setf input
	  (with-text-style
	    (stream (make-text-style :sans-serif :roman :large))
	    (with-input-editing (stream)
	      ;; 3initialize stream for editting by inserting object
0	      (when first-time
		(replace-input stream object :buffer-start 0 :rescan T)
		(setf first-time nil))
	      ;; 3accept a sequence of strings
0	      (accept '((sequence string) :separator #\return :echo-space T)
		      :stream stream
		      :view +textual-view+
		      :prompt nil))))
    (setf (window-visibility stream) nil)
    input))

Follow-Ups:

Main Index | Thread Index