CLIM mail archive

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

input editing, CLIM 1.1



    Date: Tue, 5 Oct 1993 14:34 EDT
    From: Carolyn Banda <banda@marlin.arc.nasa.gov>

    CLIM 1.1 with ACL on SGI

    Some general questions on WITH-INPUT-EDITING:

    I'm trying to use the WITH-INPUT-EDITING macro to present the user with a
    default clause for editing.  The clauses look like Lisp expressions and may
    contain strings.  So far the only way I've found that works is to convert
    the default clause to a string.  Is this necessary?  

WITH-INPUT-EDITING is intended for editing strings.  So, yes.

							 Or can I edit Lisp-like
    expressions using WITH-INPUT-EDITING?  Can I use ACCEPT on type 'EXPRESSION
    or 'FORM in a WITH-INPUT-EDITING form?  
					    
Since, ACCEPT uses WITH-INPUT-EDITING, there is no need to use
WITH-INPUT-EDITING inside of a call to ACCEPT.  In fact, the inner
use of WITH-INPUT-EDITING is effectively a no-op.

					    Enclosed below is code that works OK
    (except that strings within the expression are lost).  The code was adapted
    from examples gleaned from the net.

    Also, how does WITH-INPUT-EDITING interact with ACCEPTING-VALUES panes?  I
    haven't used them yet, but will if they help.

I don't think this is a meaningful question.  WITH-INPUT-EDITING
interacts only with input primitives such as READ-GESTURE and the
things that use READ-GESTURE, such as ACCEPT.

    Another question is: WITH-INPUT-FOCUS as I'm using it doesn't seem to focus
    attention to the edit pane.  Am I using it improperly?

Hmm, I dunno.  It works for me.

    ;;; ----------------------------------------------------------------------------
    ;;; EDIT A LISP-LIKE EXPRESSION, CALLED "CLAUSE" BELOW.
    ;;; E.G., (ASSIGN <X> 34); (ASSIGN <Y> (CALL (GET-AIRSPEED))); 
    ;;; (WRITE-MESSAGE NIL "The value of <Y> is " <Y>)

I don't understand why you haven't just written a CLAUSE presentation
type, with a PRESENT method that is basically PRINC and an ACCEPT method
that is what you have below (with all of the default handling, replace
input, and input editing stuff gone).  You seem to have done way too
much work here.

    (define-edit-rule-form-command (edit-clause)
	((clause 'clause) (editor 'standard-object))
      (let ((stream (clim:get-frame-pane editor 'edit-pane))
	    (default (convert-to-string (value clause)))
	    new-value
	    new-clause)
	;;kludge to activate cursor up arrow...
	(setf (clim::cursor-visibility (clim::stream-text-cursor stream)) :off) ;kludge 
	(unwind-protect
    ;;        (clim:with-input-focus (stream))    ;; doesn't work (why not?)
	      (clim:with-input-editing (stream)
		;; Put the default into the input buffer and ensure that we never
		;; do it again
		(when default
		  (clim:replace-input stream default :rescan t)
		  (setq default nil))
		;; Now get the input from the user
		(setq new-value (read-from-string
				 (clim:with-activation-characters ('(#\Control-r #\Control-\r #\Newline)
								   :override nil)
				   (unwind-protect
				       (clim:read-token stream)
				     ;; Eat the activation character
				     (clim:read-gesture :stream stream :timeout 0)) )))
		(setq new-clause (make-instance 'clause :value new-value))
		(setf (rule-lhs editor) (subst new-clause clause (rule-lhs editor)))
		)
	  (setf (clim::cursor-visibility (clim::stream-text-cursor stream)) :inactive)  ;kludge
	  )))


    ;;; CONVERT-TO-STRING
    ;;; Utility function to convert an expression to a string for use
    ;;; in EDIT-CLAUSE.
    ;;; Input:
    ;;;   a-list   - an expression, in the form of a GEST rule clause
    ;;; Output:
    ;;;   - returns a string whose elements are the elements of the expression.
    ;;;     Parentheses are added at beginning and end.
    (defun convert-to-string (a-list)
      (let ((list-of-strings (reverse (loop for item in a-list 
					  collect 
					    (if (equal item (car (last a-list)))
						(format nil "~a" item)
						(format nil "~a " item)))))
	    new-list)
	(loop for item in list-of-strings do
	      (setq new-list
		(concatenate 'string item new-list)))
	(concatenate 'string "(" new-list ")")))


Follow-Ups: References:

Main Index | Thread Index