[plt-scheme] editor lockup in embedded editor-snip%

From: Jordan Johnson (jmj at fellowhuman.com)
Date: Thu Aug 20 14:37:52 EDT 2009

Hi all,

The annotated-code snip I've been working on is now working (thanks in  
large part to help from Matthew & Robby), with the exception of one  
bug that has me baffled.  I suspect it involves the locking that  
happens in embedded-gui/aligned-pasteboard.

The bug:  If I have a snip in the Definitions editor and click "Run"  
while the snip's code-view (defined below) is hidden, it becomes  
impossible to edit the text in the code-editor (also defined below).   
By this I mean that when I click or tab into the code editor, the  
cursor does not appear, and typing has no effect.  Further, this only  
happens when the editor is not visible.

Here is the relevant code:

;;;;;;;;;
;; anno-snip% is my snip's class.

;; code-editor is an instance of a subclass of
;;  ((drscheme:unit:get-program-editor-mixin) (tabbable-text-mixin  
scheme:text%))
;; that caches the result of (scheme:text-balanced? this) for display  
purposes.

;; anno-editor is an instance of (tabbable-text-mixin scheme:text%).

;; The following is from the definition of a subclass of
;; aligned-pasteboard% that is the editor for an anno-snip%:

       (set-tabbing code-editor anno-editor)

       ;;;;;;; Container snips for the two editors:
       (define val (new vertical-alignment% [parent this]))
       ;; Container for the code editor.  I'm using this for the  
ability to
       ;; show/hide the editor:
       (define code-view (new vertical-alignment%
                              [parent val]
                              [show? #f]))

       ;; Installs stretchable editor snips, if none are already  
installed,
       ;; to contain the code and anno editors.
       ;; (Does nothing if they already are installed, and returns #f.)
       ;; Returns #t if successful.
       (define (init-snips)
         (if (not (or (find-owner-snip code-editor)
                      (find-owner-snip anno-editor)))
             (let ([code-snip (new stretchable-editor-snip%
                                   [editor code-editor]
                                   [with-border? #t]
                                   [min-width MIN-TEXT-WIDTH])]
                   [anno-snip (new stretchable-editor-snip%
                                   [editor anno-editor]
                                   [with-border? #f]
                                   [min-width MIN-TEXT-WIDTH])])
               (make-object snip-wrapper% code-view code-snip)
               (make-object hline% code-view)
               (make-object snip-wrapper% val anno-snip)
               #t)
             #f))

       (init-snips)

       ;;;;;;;;; Interface for showing/hiding code ;;;;;;;;;
       (define showing-code #f)

       (define/public (showing-code?)
         showing-code)
       (define/public (show-code on/off)
         (send code-view show on/off)
         (set! showing-code on/off))

;;;;;;;;; end of program excerpt.

I have verified that the code-editor is *not* locked for writing,  
reflowing, or reading.  Having looked at snip-wrapper.ss and aligned- 
pasteboard.ss in embedded-gui/private/, I am guessing something in the  
code-editor's or code-snip's state isn't getting properly restored  
when it is reinserted by show/hide (in snip-wrapper.ss), but I don't  
know what that piece of state would be.  Any pointers?

Oh, and here's an extra question that may be related:  How can I give  
the caret to the code editor upon calling (show-code true)?  Calling  
set-caret-owner on the code-snip's snip-admin doesn't seem to work.

Thanks again for your help.

Best,
jmj



Posted on the users mailing list.