CLIM mail archive

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

CLIM2 : bug in accept-method with pop-up menu



   From: Marie-Christine.Timmermans@nrb.be
   Date: .31 Mar 94 11:02:20 +0000
   X400-Trace: BE*RTT*NRB
	   arrival .31 Mar 94 11:02:20 +0000
	   action Relayed
   Importance: normal
   Autoforwarded: FALSE
   P1-Message-Id: be*rtt*nrb;ccmacmta Mar 31 11:02:19 1994
   Ua-Content-Id: 190211310394
   P1-Content-Type: P2
   Priority: normal

   Has somebody already seen such a bug in clim2 with genera 8.3 (note that this 
   code worked well in clim1.1)?

The basic problem here is that this presentation type is not
interacting correctly with the input editor.  Here are a few key
things to know:

 - All calls to ACCEPT on an interactive stream take place inside of
   the input editor.
 - The input editor has a control structure that loops.

There is another problem with your ACCEPT method -- you don't want to
use PRESENT in it.

   Suppose I define a presentation type like this :

   (clim:define-presentation-type my-string ()
     :inherit-from 'string
     :description "One string from a subset")

   with an accept-method which pops up a menu, like :

   (clim:define-presentation-method clim:accept        
       ((type my-string) stream (view clim:textual-view) &key)
     (let ((chosen-word (pop-up-words-list stream type)))
       (clim:present chosen-word 'string :stream stream)
       chosen-word))

I did not test the following, but here is what I would use:

(clim:define-presentation-method clim:accept
    ((type my-string) stream (view clim:textual-view) &key)
  (if (clim:stream-rescanning-p stream)
      (let ((bp (clim:stream-scan-pointer stream))
	    (chosen-word (pop-up-words-list stream type)))
        (clim:presentation-replace-input stream chosen-word 'string view
					 :buffer-start bp)	
        chosen-word)
	(values (clim:accept 'string :stream stream :prompt nil))))

   (defun pop-up-words-list (stream type)
     (declare (ignore type))
     (clim:menu-choose
       '("one" "two" "three" "four")
       :scroll-bars :dynamic
       :associated-window stream
       :pointer-documentation "Select one-word"))

   Then I try to use this presentation-type in a command :

   (clim:define-command
     (com-test1 :command-table configuration-others :name t)
       ((arg 'my-string :prompt "Use menu to select word"))
     (format (clim:frame-standard-output clim:*application-frame*) "~A" arg))

   Every time I use this command, the pop-up menu for the command argument 
   appears twice.

   The value I select the second time is the one used for the body of the command.
   Another thing very strange is that, if you define the command with the keyword 
   :menu :

   (clim:define-command
     (com-test1 :command-table configuration-others :name t :menu t)
       ((arg 'my-string :prompt "Use menu to select word"))
     (format (clim:frame-standard-output clim:*application-frame*) "~A" arg))

   then, when you write the command in the interactor pane the same problem 
   appears. But, if you use the command-menu pane to select the command, the it 
   works well...

   I have also written presentation types with other kinds of 
   menus that pop up in accept and the same problem appears.

   Should I have used the macro clim:define-presentation-action for this? In that 
   case, could someone give me some examples of its use?

Follow-Ups: References:

Main Index | Thread Index