CLIM mail archive

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

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



   From: Scott McKay <swm>
   Date: Thu, 31 Mar 94 09:33:38 EST

      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.

I should have elaborated a bit more.  The looping control structure
means that all ACCEPT methods need to be prepared to be run more than
once on the same input interaction.  This especially affects things
like this, where there is a visible side-effect of the ACCEPT method
being run more than once.

   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?


References:

Main Index | Thread Index