manage the state for delegates better (used by the drracket contour window)

closes PR 12094

original commit: 38596a9b581c06a7bdc8faba26c8e0cfb1b09492
This commit is contained in:
Robby Findler 2011-08-07 18:39:22 -05:00
parent ce23305a06
commit 48e71d341a

View File

@ -1505,15 +1505,22 @@
(send new-snip set-style (send snip get-style)) (send new-snip set-style (send snip get-style))
new-snip)) new-snip))
;; todo : (listof (-> void))
;; actions that have happened to this editor, but that
;; have not yet been propogated to the delegate
(define todo '()) (define todo '())
(define timer (new timer% (define timer (new timer%
[notify-callback [notify-callback
(λ () (λ ()
(send delegate begin-edit-sequence) ;; it should be the case that todo is always '() when the delegate is #f
(for ([th (in-list (reverse todo))]) (when delegate
(th)) (send delegate begin-edit-sequence)
(send delegate end-edit-sequence) (for ([th (in-list (reverse todo))])
(th))
(send delegate end-edit-sequence))
(set! todo '()))])) (set! todo '()))]))
(define/private (to-delegate thunk) (define/private (to-delegate thunk)
(when delegate (when delegate
(send timer stop) (send timer stop)
@ -1524,6 +1531,25 @@
(inherit get-highlighted-ranges) (inherit get-highlighted-ranges)
(define/public-final (get-delegate) delegate) (define/public-final (get-delegate) delegate)
(define/public-final (set-delegate _d) (define/public-final (set-delegate _d)
(set! todo '())
(when delegate
;; the delegate may be in a bad state because we've killed the pending todo
;; items; to clear out the bad state, end any edit sequences, and unhighlight
;; any highlighted ranges. The rest of the state is reset if the editor
;; is ever installed as a delegate again (by refresh-delegate)
(let loop ()
(when (send delegate in-edit-sequence?)
(send delegate end-edit-sequence)
(loop)))
(for ([range (in-list (send delegate get-highlighted-ranges))])
(send delegate unhighlight-range
(range-start range)
(range-end range)
(range-color range)
(range-caret-space? range)
(range-style range))))
(set! delegate _d) (set! delegate _d)
(set! linked-snips (if _d (set! linked-snips (if _d
(make-hasheq) (make-hasheq)