/ gui-lib / mrlib / hierlist.rkt
hierlist.rkt
 1  #lang racket/base
 2  
 3  (require mzlib/unit
 4           racket/gui/base
 5           "hierlist/hierlist-sig.rkt"
 6           "hierlist/hierlist-unit.rkt")
 7  
 8  (define-values/invoke-unit/infer hierlist@)
 9  
10  (provide-signature-elements hierlist^)
11  
12  ;; ============================================================
13  
14  (module+ demo
15  (require racket/class)
16  
17  (define f (make-object frame% (format "test ~s" (version))))
18  (define p (make-object horizontal-panel% f))
19  (define c (make-object (class hierarchical-list%
20                           (define/override (on-item-opened i)
21                             (let ([f (send i user-data)])
22                               (when f (f i))))
23                           (define/override (on-select i)
24                             (printf "Selected: ~a\n"
25                                     (if i 
26                                         (send (send i get-editor) get-flattened-text)
27                                         i)))
28                           (define/override (on-double-select s)
29                             (printf "Double-click: ~a\n"
30                                     (send (send s get-editor) get-flattened-text)))
31                           (super-new))
32                         p))
33  
34  (define a (send c new-list))
35  (send (send a get-editor) insert "First Item: List")
36  (send (send (send a new-item) get-editor) insert "Sub1")
37  (send (send (send a new-item) get-editor) insert "Sub2")
38  (define a.1 (send a new-list))
39  (send (send a.1 get-editor) insert "Deeper List")
40  (send (send (send a.1 new-item) get-editor) insert "Way Down")
41  
42  (define b (send c new-item))
43  (send (send b get-editor) insert "Second Item")
44  
45  (define d (send c new-list))
46  (send (send d get-editor) insert "dynamic")
47  (send d user-data (lambda (d)
48  		    (time (let loop ([i 30])
49  			    (unless (zero? i)
50  				    (send (send (send d new-item) get-editor) insert (number->string i))
51  				    (loop (sub1 i)))))))
52  
53  (define x (send c new-list))
54  (send (send x get-editor) insert "x")
55  
56  (define y (send c new-item))
57  (send (send y get-editor) insert "y")
58  
59  (define z (send c new-list))
60  (send (send z get-editor) insert "a multi-line\nlabel")
61  (send (send (send z new-item) get-editor) insert "Sub1")
62  (send (send (send z new-item) get-editor) insert "Sub2")
63  
64  (send f show #t)
65  
66  (yield (make-semaphore))
67  )