Remove guibuilder. See mred-designer on planet for a maintained alterative.
This commit is contained in:
parent
b890f7d907
commit
8378b742c7
|
@ -1,583 +0,0 @@
|
|||
(module base mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt")
|
||||
|
||||
(define GB:SNIP-VERSION 5)
|
||||
(define MINOR-VERSION 0)
|
||||
|
||||
;; Info about the output mode:
|
||||
(define-struct output-mode (as-class? no-free-vars?))
|
||||
|
||||
(define gb:snip%
|
||||
(class mred:snip%
|
||||
(init-field [lm 5][tm 5][rm 5][bm 5])
|
||||
(inherit get-admin set-snipclass set-count)
|
||||
(private-field
|
||||
(need-recalc? #t)
|
||||
(prev-min-w 0)
|
||||
(prev-min-h 0))
|
||||
(field
|
||||
[x 0]
|
||||
[stable-x 0]
|
||||
[y 0]
|
||||
[stable-y 0]
|
||||
[w (+ lm rm)]
|
||||
[h (+ tm bm)]
|
||||
[spacing 3]
|
||||
[hilited? #f])
|
||||
(public*
|
||||
[spacing-+
|
||||
(lambda args
|
||||
(+ (apply + args)
|
||||
(let ([c (let loop ([l args])
|
||||
(cond
|
||||
[(null? l) 0]
|
||||
[(zero? (car l)) (loop (cdr l))]
|
||||
[else (add1 (loop (cdr l)))]))])
|
||||
(if (positive? c)
|
||||
(* spacing (sub1 c))
|
||||
0))))])
|
||||
(public*
|
||||
[init-horizontal-child-alignment (lambda () 2)]
|
||||
[init-vertical-child-alignment (lambda () 2)]
|
||||
[init-name (lambda () (new-name "item"))]
|
||||
[get-classname (lambda () "gb:core")]
|
||||
[container? (lambda () #t)]
|
||||
[init-y-stretch? (lambda () #t)]
|
||||
[init-x-stretch? (lambda () #t)])
|
||||
(field
|
||||
[horizontal-child-alignment (init-horizontal-child-alignment)]
|
||||
[vertical-child-alignment (init-vertical-child-alignment)]
|
||||
[with-border? #f]
|
||||
[dialog #f]
|
||||
[name (init-name)]
|
||||
[id #f]
|
||||
[original-id #f]
|
||||
[original-children-ids #f]
|
||||
(parent #f)
|
||||
(pb #f)
|
||||
(children null)
|
||||
(y-stretch? (init-y-stretch?))
|
||||
(x-stretch? (init-x-stretch?)))
|
||||
(public*
|
||||
(set-id (lambda (x) (set! id x)))
|
||||
(set-horizontal-child-alignment
|
||||
(lambda (v) (set! horizontal-child-alignment v)))
|
||||
(set-vertical-child-alignment
|
||||
(lambda (v) (set! vertical-child-alignment v)))
|
||||
(set-with-border
|
||||
(lambda (v) (set! with-border? v)))
|
||||
|
||||
(get-frame%
|
||||
(lambda ()
|
||||
(class mred:frame%
|
||||
(init-field do-on-close)
|
||||
(inherit show)
|
||||
(public*
|
||||
[get-kind (lambda () "Panel")]
|
||||
[on-main (lambda (x) x)]
|
||||
[find-control (lambda (tag) #f)])
|
||||
(super-make-object (format "~a Settings" (get-kind)) #f 200 10)
|
||||
(private-field
|
||||
[main (on-main (make-object mred:vertical-panel% this))]
|
||||
[name-edit (make-one-line/callback-edit main "Scheme Name:"
|
||||
(lambda (txt)
|
||||
(set! name txt))
|
||||
name)])
|
||||
(field
|
||||
[controls (make-object mred:vertical-panel% main)])
|
||||
(augment*
|
||||
[on-close (lambda () (do-on-close))])
|
||||
(send controls set-alignment 'left 'center)
|
||||
(let* ([p (make-object mred:vertical-panel% main)]
|
||||
[make-sc
|
||||
(lambda (name set)
|
||||
(make-object mred:check-box%
|
||||
name
|
||||
p
|
||||
(lambda (c e)
|
||||
(set (send c get-value))
|
||||
(gb-need-recalc-size))))]
|
||||
[xsc (make-sc "Allow Horizontal Stretching"
|
||||
(lambda (on?) (set! x-stretch? on?)))]
|
||||
[ysc (make-sc "Allow Vertical Stretching"
|
||||
(lambda (on?) (set! y-stretch? on?)))])
|
||||
(send p set-alignment 'left 'center)
|
||||
(send xsc set-value x-stretch?)
|
||||
(send ysc set-value y-stretch?)
|
||||
(let ([p (make-object mred:vertical-panel% p)])
|
||||
(send p stretchable-height #f))))))
|
||||
|
||||
(gb-add-child
|
||||
(case-lambda
|
||||
[(c) (gb-add-child c (length children))]
|
||||
[(c pos)
|
||||
(set! children
|
||||
(let loop ([l children][p pos])
|
||||
(cond
|
||||
[(or (zero? p) (null? l)) (cons c l)]
|
||||
[else (cons (car l) (loop (cdr l) (sub1 p)))])))
|
||||
(when pb
|
||||
(send c gb-install pb this)
|
||||
(send pb insert c (send pb find-first-snip) x (+ y h)))
|
||||
(gb-need-recalc-size)]))
|
||||
(gb-remove-child
|
||||
(lambda (c)
|
||||
(set! children (remq c children))
|
||||
(gb-need-recalc-size)))
|
||||
|
||||
(gb-need-recalc-size
|
||||
(lambda ()
|
||||
(set! need-recalc? #t)
|
||||
(resized)))
|
||||
|
||||
(gb-install
|
||||
(lambda (pb-in parent-in)
|
||||
(set! parent parent-in)
|
||||
(if pb
|
||||
(when parent
|
||||
(send pb set-before this parent))
|
||||
(set! pb pb-in))
|
||||
(set! id (send pb new-id))
|
||||
(for-each
|
||||
(lambda (c)
|
||||
(send pb insert c (send pb find-first-snip) x (+ y h))
|
||||
(send c gb-install pb this))
|
||||
children)))
|
||||
|
||||
(gb-get-child-x-start
|
||||
(lambda (mw mh w h)
|
||||
0))
|
||||
(gb-get-child-y-start
|
||||
(lambda (mw mh w h)
|
||||
(if (or (= vertical-child-alignment 1)
|
||||
(ormap (lambda (c) (gb-y-stretch? c)) children))
|
||||
0
|
||||
(case vertical-child-alignment
|
||||
[(2) (/ (- h mh) 2)]
|
||||
[(3) (- h mh)]))))
|
||||
(gb-combine-child-width (lambda (a b) (max a b)))
|
||||
(gb-combine-child-height (lambda (a b) (spacing-+ a b)))
|
||||
|
||||
(gb-compute-child-x-pos
|
||||
(lambda (dc c w)
|
||||
(if (gb-x-stretch? c)
|
||||
0
|
||||
(case horizontal-child-alignment
|
||||
[(2) (let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(/ (- w cw) 2))]
|
||||
[(1) 0]
|
||||
[(3) (let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(- w cw))]))))
|
||||
(gb-compute-child-y-pos
|
||||
(lambda (dc c h)
|
||||
0))
|
||||
(gb-compute-child-width
|
||||
(lambda (dc c w xsc dw)
|
||||
(if (gb-x-stretch? c)
|
||||
w
|
||||
(let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
cw))))
|
||||
(gb-compute-child-height
|
||||
(lambda (dc c h ysc dh)
|
||||
(let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(if (gb-y-stretch? c)
|
||||
(+ ch (/ dh ysc))
|
||||
ch))))
|
||||
|
||||
(gb-combine-child-x-offset (lambda (a b) a))
|
||||
(gb-combine-child-y-offset (lambda (a b) (spacing-+ a b)))
|
||||
|
||||
(gb-get-min-size
|
||||
(lambda (dc)
|
||||
(let loop ([lw 0][lh 0][l children])
|
||||
(cond
|
||||
[(null? l) (let* ([w (+ lw lm rm)]
|
||||
[h (+ lh tm bm)])
|
||||
(set! prev-min-h h)
|
||||
(values w h))]
|
||||
[else
|
||||
(let ([c (car l)])
|
||||
(let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(loop (gb-combine-child-width lw cw)
|
||||
(gb-combine-child-height lh ch)
|
||||
(cdr l))))]))))
|
||||
(gb-set-shape
|
||||
(lambda (dc x-in y-in w-in h-in)
|
||||
(let*-values ([(xsc) (apply + (map
|
||||
(lambda (c) (if (gb-x-stretch? c) 1 0))
|
||||
children))]
|
||||
[(ysc) (apply + (map
|
||||
(lambda (c) (if (gb-y-stretch? c) 1 0))
|
||||
children))]
|
||||
[(mw mh) (gb-get-min-size dc)]
|
||||
[(ew eh) (values (- w-in lm rm) (- h-in tm bm))]
|
||||
[(dw dh) (values (- w-in mw) (- h-in mh))])
|
||||
(let loop ([lx (+ lm x-in (gb-get-child-x-start mw mh w-in h-in))]
|
||||
[ly (+ tm y-in (gb-get-child-y-start mw mh w-in h-in))]
|
||||
[l children])
|
||||
(cond
|
||||
[(null? l) 0]
|
||||
[else
|
||||
(let ([c (car l)])
|
||||
(let-values ([(cw ch)
|
||||
(send c gb-set-shape dc
|
||||
(+ lx (gb-compute-child-x-pos dc c ew))
|
||||
(+ ly (gb-compute-child-y-pos dc c eh))
|
||||
(gb-compute-child-width dc c ew xsc dw)
|
||||
(gb-compute-child-height dc c eh ysc dh))])
|
||||
(loop (gb-combine-child-x-offset lx cw)
|
||||
(gb-combine-child-y-offset ly ch)
|
||||
(cdr l))))])))
|
||||
(unless parent
|
||||
(when (and pb (not (and (= w w-in) (= h h-in))))
|
||||
(send pb top-resized this w h w-in h-in)))
|
||||
(set! x x-in)
|
||||
(set! y y-in)
|
||||
(set! w w-in)
|
||||
(set! h h-in)
|
||||
(resized)
|
||||
(when pb
|
||||
(send pb move-to this x-in y-in))
|
||||
(values w-in h-in)))
|
||||
|
||||
(find-position-<
|
||||
(lambda (fx fy cx cy)
|
||||
(< fy cy)))
|
||||
(gb-find-position
|
||||
(lambda (fx fy)
|
||||
(let loop ([l children][pos 0])
|
||||
(if (null? l)
|
||||
pos
|
||||
(let*-values ([(c) (car l)]
|
||||
[(cx) (send c gb-get-stable-x)]
|
||||
[(cy) (send c gb-get-stable-y)]
|
||||
[(w h) (send c gb-get-size)])
|
||||
(if (find-position-< fx fy (+ cx w) (+ cy h))
|
||||
pos
|
||||
(loop (cdr l) (add1 pos))))))))
|
||||
(gb-get-child-pos
|
||||
(lambda (c)
|
||||
(let loop ([l children][pos 0])
|
||||
(cond
|
||||
[(null? l) pos]
|
||||
[(eq? (car l) c) pos]
|
||||
[else (loop (cdr l) (add1 pos))]))))
|
||||
|
||||
(gb-get-saved-min-size
|
||||
(lambda ()
|
||||
(values prev-min-w prev-min-h)))
|
||||
|
||||
(gb-recalc-size
|
||||
(lambda (dc)
|
||||
(if parent
|
||||
(send parent gb-recalc-size dc)
|
||||
(let-values ([(mw mh) (gb-get-min-size dc)]
|
||||
[(xb) (box 0)]
|
||||
[(yb) (box 0)])
|
||||
(when pb
|
||||
(send pb get-snip-location this xb yb #f)
|
||||
(send pb get-main-location this dc xb yb))
|
||||
(gb-set-shape dc (unbox xb) (unbox yb)
|
||||
(if x-stretch? (max w mw) mw)
|
||||
(if y-stretch? (max h mh) mh))))))
|
||||
|
||||
(gb-hilite
|
||||
(lambda (on?)
|
||||
(unless (eq? on? hilited?)
|
||||
(set! hilited? on?)
|
||||
(refresh))))
|
||||
|
||||
(gb-get-parent
|
||||
(lambda () parent))
|
||||
(gb-get-children
|
||||
(lambda () children))
|
||||
(gb-get-size
|
||||
(lambda () (values w h)))
|
||||
(gb-get-x (lambda () x))
|
||||
(gb-get-y (lambda () y))
|
||||
(gb-get-stable-x (lambda () stable-x))
|
||||
(gb-get-stable-y (lambda () stable-y))
|
||||
(gb-get-position-and-size
|
||||
(lambda () (values x y w h)))
|
||||
|
||||
(gb-set-stable-position
|
||||
(lambda ()
|
||||
(set! stable-x x)
|
||||
(set! stable-y y)))
|
||||
|
||||
(gb-drag-children-along
|
||||
(lambda (new-x new-y)
|
||||
(when (not (and (= x new-x) (= y new-y)))
|
||||
(for-each
|
||||
(lambda (c)
|
||||
(let ([cx (+ new-x (- (send c gb-get-stable-x) stable-x))]
|
||||
[cy (+ new-y (- (send c gb-get-stable-y) stable-y))])
|
||||
(send pb move-to c cx cy)
|
||||
(send c gb-drag-children-along cx cy)))
|
||||
children)
|
||||
(set! x new-x)
|
||||
(set! y new-y))))
|
||||
|
||||
(gb-open-dialog
|
||||
(lambda ()
|
||||
(if dialog
|
||||
(send dialog show #t)
|
||||
(let ([f (make-object (get-frame%) (lambda () (set! dialog #f)))])
|
||||
(set! dialog f)
|
||||
(send f show #t)))))
|
||||
|
||||
(gb-reconnect-to-original-children
|
||||
(lambda ()
|
||||
(if original-children-ids
|
||||
(let ([sl (map
|
||||
(lambda (id) (send pb find-snip-by-original-id id))
|
||||
original-children-ids)])
|
||||
(set! original-children-ids #f)
|
||||
(for-each
|
||||
(lambda (s)
|
||||
(when s
|
||||
(gb-add-child s)
|
||||
(send pb remove-selected s)))
|
||||
sl)
|
||||
#t)
|
||||
#f)))
|
||||
(gb-forget-original-id
|
||||
(lambda ()
|
||||
;; Make unique name
|
||||
(let ([orig-name name])
|
||||
(set! name #f)
|
||||
(let loop ([new-name orig-name])
|
||||
(if (send pb find-snip-by-name new-name)
|
||||
(loop (string-append new-name "+"))
|
||||
(set! name new-name))))
|
||||
(set! original-id #f)
|
||||
(set! original-children-ids #f)))
|
||||
|
||||
(gb-get-instantiate-class-getter
|
||||
(lambda ()
|
||||
`(,(string->symbol (string-append "get-" name "%")))))
|
||||
(gb-get-style
|
||||
(lambda ()
|
||||
(if with-border?
|
||||
'(border)
|
||||
null)))
|
||||
(gb-local-instantiate
|
||||
(lambda (parent mode)
|
||||
`(new ,(if (output-mode-as-class? mode)
|
||||
(gb-get-instantiate-class-getter)
|
||||
(gb-get-default-class))
|
||||
[parent ,parent]
|
||||
,@(gb-instantiate-arguments))))
|
||||
(gb-instantiate-arguments
|
||||
(lambda () `([style ',(gb-get-style)]
|
||||
[stretchable-width ,x-stretch?]
|
||||
[stretchable-height ,y-stretch?])))
|
||||
|
||||
(gb-get-default-class (lambda () 'vertical-panel%))
|
||||
(gb-aux-instantiate
|
||||
(lambda (mode)
|
||||
(if (output-mode-as-class? mode)
|
||||
`((public* [,(string->symbol (string-append "get-" name "%"))
|
||||
(lambda () ,(gb-get-default-class))]))
|
||||
null)))
|
||||
(gb-instantiate
|
||||
(lambda (parent mode)
|
||||
(let ([v (gb-local-instantiate parent mode)]
|
||||
[name (string->symbol name)])
|
||||
`(,@(gb-aux-instantiate mode)
|
||||
,(if (output-mode-as-class? mode)
|
||||
`(field [,name ,v])
|
||||
`(define ,name ,v))
|
||||
,@(apply append
|
||||
(map (lambda (c) (send c gb-instantiate name mode)) children))))))
|
||||
|
||||
(draw-box
|
||||
(lambda (dc x y w h)
|
||||
(let* ((xw (sub1 (+ x w)))
|
||||
(yh (sub1 (+ y h)))
|
||||
(x (add1 x))
|
||||
(y (add1 y)))
|
||||
(send dc draw-line x y xw y)
|
||||
(send dc draw-line xw y xw yh)
|
||||
(send dc draw-line x yh xw yh)
|
||||
(send dc draw-line x y x yh))))
|
||||
|
||||
(base-setup
|
||||
(lambda (nm xs? ys? nw nh hca vca wb? id children-ids)
|
||||
(set! name nm)
|
||||
(set! x-stretch? xs?)
|
||||
(set! y-stretch? ys?)
|
||||
(set! w nw)
|
||||
(set! h nh)
|
||||
(set! horizontal-child-alignment hca)
|
||||
(set! vertical-child-alignment vca)
|
||||
(set! with-border? wb?)
|
||||
(set! original-id id)
|
||||
(set! original-children-ids children-ids)))
|
||||
|
||||
[get-tagged-value
|
||||
(lambda (tag) #f)]
|
||||
[set-tagged-value (lambda (t v-in) (void))]
|
||||
|
||||
(refresh
|
||||
(lambda ()
|
||||
(let ([admin (get-admin)])
|
||||
(when admin
|
||||
(send admin needs-update this 0 0 w h)))))
|
||||
(resized
|
||||
(lambda ()
|
||||
(let ([admin (get-admin)])
|
||||
(when admin
|
||||
(send admin resized this #t))))))
|
||||
|
||||
(override*
|
||||
(get-extent
|
||||
(lambda (dc x y wbox hbox descentbox spacebox
|
||||
lspacebox rspacebox)
|
||||
(when need-recalc?
|
||||
(set! need-recalc? #f)
|
||||
(gb-recalc-size dc))
|
||||
(when hbox
|
||||
(set-box! hbox h))
|
||||
(when wbox
|
||||
(set-box! wbox w))
|
||||
(when descentbox
|
||||
(set-box! descentbox 0))
|
||||
(when spacebox
|
||||
(set-box! spacebox 0))
|
||||
(when rspacebox
|
||||
(set-box! rspacebox 0))
|
||||
(when lspacebox
|
||||
(set-box! lspacebox 0))))
|
||||
(draw
|
||||
(lambda (dc x y . other)
|
||||
(draw-box dc x y w h)
|
||||
(when (or with-border? hilited?)
|
||||
(draw-box dc (add1 x) (add1 y) (- w 2) (- h 2)))
|
||||
(when (and with-border? hilited?)
|
||||
(draw-box dc (+ 2 x) (+ 2 y) (- w 4) (- h 4)))))
|
||||
(copy
|
||||
(lambda ()
|
||||
(let ([o (make-object (hash-table-get interface->class-table
|
||||
(object-interface this))
|
||||
lm tm rm bm)])
|
||||
(send o base-setup
|
||||
name
|
||||
x-stretch? y-stretch? w h
|
||||
horizontal-child-alignment
|
||||
vertical-child-alignment
|
||||
with-border?
|
||||
(or original-id id)
|
||||
(or original-children-ids
|
||||
(and (pair? children)
|
||||
(map (lambda (child) (gb-id child)) children))))
|
||||
o)))
|
||||
(write
|
||||
(lambda (stream)
|
||||
(send stream put (string->bytes/utf-8 name))
|
||||
(send stream put (if x-stretch? 1 0))
|
||||
(send stream put (if y-stretch? 1 0))
|
||||
(send stream put (floor (inexact->exact w)))
|
||||
(send stream put (floor (inexact->exact h)))
|
||||
(send stream put horizontal-child-alignment)
|
||||
(send stream put vertical-child-alignment)
|
||||
(send stream put (if with-border? 1 0))
|
||||
(send stream put (string->bytes/utf-8 (if id id "BAD")))
|
||||
(stream-write-list stream (map (lambda (c) (gb-id c)) children)))))
|
||||
(public*
|
||||
(read
|
||||
(lambda (stream version)
|
||||
(base-setup
|
||||
;; name
|
||||
(if (>= version 3)
|
||||
((get-bytes->string version) (send stream get-bytes))
|
||||
name)
|
||||
(positive? (send stream get-exact))
|
||||
(positive? (send stream get-exact))
|
||||
(send stream get-exact) ; w
|
||||
(send stream get-exact) ; h
|
||||
(if (>= version 2) (send stream get-exact) horizontal-child-alignment) ; hca
|
||||
(if (>= version 2) (send stream get-exact) vertical-child-alignment) ; vca
|
||||
(if (>= version 2) (positive? (send stream get-exact)) #f) ; with-border?
|
||||
((get-bytes->string version) (send stream get-bytes))
|
||||
(let ([v (stream-read-list stream version)])
|
||||
(if (null? v) #f v))))))
|
||||
(override*
|
||||
(resize
|
||||
(lambda (w-in h-in)
|
||||
(if (not parent)
|
||||
(let-values ([(mw mh) (values prev-min-w prev-min-h)])
|
||||
(if (or (and (> w-in mw) x-stretch?)
|
||||
(and (> h-in mh) y-stretch?))
|
||||
(begin
|
||||
(when x-stretch? (set! w (max mw w-in)))
|
||||
(when y-stretch? (set! h (max mh h-in)))
|
||||
(gb-need-recalc-size)
|
||||
#t)
|
||||
#f))
|
||||
#f))))
|
||||
(super-new)
|
||||
(set-snipclass (send (mred:get-the-snip-class-list) find (get-classname)))
|
||||
(set-count 1)))
|
||||
|
||||
(define gb:atomic-snip%
|
||||
(class gb:snip%
|
||||
(override*
|
||||
(init-x-stretch? (lambda () #f))
|
||||
(init-y-stretch? (lambda () #f))
|
||||
(container? (lambda () #f)))
|
||||
(super-new)))
|
||||
|
||||
(define gb-y-stretch? (class-field-accessor gb:snip% y-stretch?))
|
||||
(define gb-x-stretch? (class-field-accessor gb:snip% x-stretch?))
|
||||
(define gb-id (class-field-accessor gb:snip% id))
|
||||
(define gb-original-id (class-field-accessor gb:snip% original-id))
|
||||
(define gb-parent (class-field-accessor gb:snip% parent))
|
||||
(define gb-name (class-field-accessor gb:snip% name))
|
||||
|
||||
(define interface->class-table (make-hash-table))
|
||||
|
||||
(define register-class
|
||||
(lambda (class% classname)
|
||||
(hash-table-put!
|
||||
interface->class-table
|
||||
(class->interface class%)
|
||||
class%)
|
||||
(let ([snipclass
|
||||
(make-object
|
||||
(class mred:snip-class% ()
|
||||
(inherit set-classname set-version reading-version)
|
||||
(override*
|
||||
[read
|
||||
(lambda (stream)
|
||||
(let ([o (make-object class%)])
|
||||
(send o read stream (reading-version stream))
|
||||
o))])
|
||||
(super-new)
|
||||
(set-classname classname)
|
||||
(set-version GB:SNIP-VERSION)))])
|
||||
(send (mred:get-the-snip-class-list) add snipclass))))
|
||||
|
||||
(register-class gb:snip% "gb:core")
|
||||
|
||||
(provide gb:snip%
|
||||
gb:atomic-snip%
|
||||
|
||||
gb-y-stretch?
|
||||
gb-x-stretch?
|
||||
gb-id
|
||||
gb-original-id
|
||||
gb-parent
|
||||
gb-name
|
||||
|
||||
(struct output-mode (as-class? no-free-vars?))
|
||||
|
||||
interface->class-table
|
||||
|
||||
register-class))
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * button_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" .......... ",
|
||||
" . . ",
|
||||
" . XX X X . ",
|
||||
" . X X XX . ",
|
||||
" . X X X X . ",
|
||||
" . XX X X . ",
|
||||
" . . ",
|
||||
" .......... ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,154 +0,0 @@
|
|||
(module canvas mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"feature.rkt")
|
||||
|
||||
(define gb:make-canvas-hscroll-checkable-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-boolean-configure-snip% cl 'hscroll "Horizontal Scroll" #t
|
||||
void void)
|
||||
(inherit get-tagged-value)
|
||||
(public*
|
||||
[get-hscroll
|
||||
(lambda () (get-tagged-value 'hscroll))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-canvas-vscroll-checkable-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-boolean-configure-snip% cl 'vscroll "Vertical Scroll" #t
|
||||
void void)
|
||||
(inherit get-tagged-value)
|
||||
(public*
|
||||
[get-vscroll
|
||||
(lambda () (get-tagged-value 'vscroll))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-sb-box-snip%
|
||||
(lambda (cl item-kind)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-hscroll get-vscroll)
|
||||
(field
|
||||
[sb-width 10]
|
||||
[canvas-min-space 15])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(override*
|
||||
[get-kind (lambda () item-kind)])
|
||||
(super-new)))]
|
||||
[init-x-stretch? (lambda () #t)]
|
||||
[init-y-stretch? (lambda () #t)]
|
||||
[gb-get-min-size
|
||||
(lambda (dc)
|
||||
(values (+ sb-width canvas-min-space)
|
||||
(+ sb-width canvas-min-space)))]
|
||||
[draw
|
||||
(lambda (dc x y . other)
|
||||
(send dc draw-rectangle x y w h)
|
||||
(when (get-vscroll)
|
||||
(send dc draw-line
|
||||
(+ x w (- sb-width)) y
|
||||
(+ x w (- sb-width)) (+ y h -1)))
|
||||
(when (get-hscroll)
|
||||
(send dc draw-line
|
||||
x (+ y h (- sb-width))
|
||||
(+ x w -1) (+ y h (- sb-width)))))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-canvas-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit get-hscroll get-vscroll gb-get-instantiate-class-getter)
|
||||
(override*
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(append
|
||||
(super gb-get-style)
|
||||
(cond
|
||||
[(and (get-hscroll) (get-vscroll)) '(hscroll vscroll)]
|
||||
[(get-hscroll) '(hscroll)]
|
||||
[(get-vscroll) '(vscroll)]
|
||||
[else null])))]
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "canvas"))]
|
||||
|
||||
[gb-get-default-class (lambda () 'canvas%)])
|
||||
(super-new))))
|
||||
|
||||
(define gb:canvas-snip% (gb:make-canvas-snip%
|
||||
(gb:make-sb-box-snip%
|
||||
(gb:make-canvas-vscroll-checkable-snip%
|
||||
(gb:make-canvas-hscroll-checkable-snip%
|
||||
gb:atomic-snip%))
|
||||
"Canvas")
|
||||
"gb:canvas"))
|
||||
|
||||
(register-class gb:canvas-snip% "gb:canvas")
|
||||
|
||||
(define gb:make-ecanvas-hscroll-select-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-select-configure-snip% cl 'hscroll "Horizontal Scroll"
|
||||
'("Show" "Hide" "No Scrolling"))
|
||||
(inherit get-tagged-value)
|
||||
(public*
|
||||
[get-hscroll
|
||||
(lambda () (zero? (get-hscroll-val)))]
|
||||
[get-hscroll-val
|
||||
(lambda () (get-tagged-value 'hscroll))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-ecanvas-vscroll-select-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-select-configure-snip% cl 'vscroll "Vertical Scroll"
|
||||
'("Show" "Hide" "No Scrolling"))
|
||||
(inherit get-tagged-value)
|
||||
(public*
|
||||
[get-vscroll
|
||||
(lambda () (zero? (get-vscroll-val)))]
|
||||
[get-vscroll-val
|
||||
(lambda () (get-tagged-value 'vscroll))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-editor-canvas-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit get-hscroll-val get-vscroll-val)
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "ecanvas"))]
|
||||
|
||||
[gb-get-default-class (lambda () 'editor-canvas%)]
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(append
|
||||
(super gb-get-style)
|
||||
(case (get-hscroll-val)
|
||||
[(0) null]
|
||||
[(1) '(hide-hscroll)]
|
||||
[(2) '(no-hscroll)])
|
||||
(case (get-vscroll-val)
|
||||
[(0) ()]
|
||||
[(1) '(hide-vscroll)]
|
||||
[(2) '(no-vscroll)])))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:editor-canvas-snip% (gb:make-editor-canvas-snip%
|
||||
(gb:make-sb-box-snip%
|
||||
(gb:make-ecanvas-vscroll-select-snip%
|
||||
(gb:make-ecanvas-hscroll-select-snip%
|
||||
gb:atomic-snip%))
|
||||
"Editor Canvas")
|
||||
"gb:editor-canvas"))
|
||||
|
||||
(register-class gb:editor-canvas-snip% "gb:editor-canvas")
|
||||
|
||||
(provide gb:canvas-snip%
|
||||
gb:editor-canvas-snip%))
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * canvas_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #A0A0A0A0A0A0",
|
||||
"X c #000000000000",
|
||||
" ",
|
||||
" .............. ",
|
||||
" . XXX . . ",
|
||||
" .X X . . ",
|
||||
" .X XXXXX . . ",
|
||||
" .X X X X . . ",
|
||||
" . XXX X . . ",
|
||||
" . XXXXX . . ",
|
||||
" . X . . ",
|
||||
" . XX . . ",
|
||||
" . XXX. . ",
|
||||
" . XXXX . ",
|
||||
" ........XXX... ",
|
||||
" . XX . ",
|
||||
" ...........X.. ",
|
||||
" "};
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * checkbox_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" .... ",
|
||||
" . . XXXXXXXXX ",
|
||||
" . . XXXXXXXXX ",
|
||||
" .... ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,25 +0,0 @@
|
|||
/* XPM */
|
||||
static char *choice[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 16 2 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #fefefe",
|
||||
/* pixels */
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"#.............##",
|
||||
"#.###########..#",
|
||||
"#.#.....#####..#",
|
||||
"#.##...######..#",
|
||||
"#.###.#######..#",
|
||||
"#.###########..#",
|
||||
"#..............#",
|
||||
"##.............#",
|
||||
"################",
|
||||
"################",
|
||||
"################",
|
||||
"################"
|
||||
};
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
_GUI builder_
|
||||
|
||||
To run the GUI builder, use DrRacket and select "Insert GUI"
|
||||
from the "Special" menu.
|
||||
|
||||
Though less recommended, you can also run
|
||||
|
||||
(require guibuilder/guibuilder)
|
||||
|
||||
to get a stand-alone builder. Save your files with the extension
|
||||
".gui" to ensure that they can be re-loaded later.
|
|
@ -1,352 +0,0 @@
|
|||
(module feature mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"base.rkt"
|
||||
"utils.rkt")
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Mixins for GUI features
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define gb:make-text-label-snip%
|
||||
(lambda (cl deflabel)
|
||||
(class cl
|
||||
(inherit get-style gb-need-recalc-size)
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(override*
|
||||
[get-kind (lambda () deflabel)])
|
||||
(super-new)
|
||||
(private-field
|
||||
[label-buffer (make-one-line/callback-edit controls "Label:"
|
||||
(lambda (txt)
|
||||
(set! label txt)
|
||||
(gb-need-recalc-size))
|
||||
label)])))]
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
`(,@(super gb-instantiate-arguments)
|
||||
[label ,(get-label)]))])
|
||||
(field
|
||||
[label deflabel])
|
||||
(public*
|
||||
[get-label
|
||||
(lambda ()
|
||||
label)]
|
||||
[get-label-size
|
||||
(lambda (dc)
|
||||
(let-values ([(w h d a) (send dc get-text-extent label
|
||||
(send (get-style) get-font))])
|
||||
(values w h)))]
|
||||
[draw-label
|
||||
(lambda (dc x y)
|
||||
(send dc draw-text label x y))]
|
||||
|
||||
[label-install
|
||||
(lambda (n)
|
||||
(set! label n))])
|
||||
(override*
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o label-install label)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (string->bytes/utf-8 label)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(label-install ((get-bytes->string version) (send stream get-bytes))))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-callback-snip%
|
||||
(lambda (cl)
|
||||
(class cl
|
||||
(inherit-field name)
|
||||
(public*
|
||||
[get-callback-kinds (lambda () (list "-callback"))]
|
||||
[get-callback-code (lambda ()
|
||||
(map (lambda (x) '(lambda (w e) (void))) (get-callback-kinds)))]
|
||||
[get-callback-names
|
||||
(lambda ()
|
||||
(map
|
||||
(lambda (ct)
|
||||
(string->symbol (string-append name ct)))
|
||||
(get-callback-kinds)))]
|
||||
[gb-get-unified-callback
|
||||
(lambda ()
|
||||
`(lambda (b e) (,(car (get-callback-names)) b e)))])
|
||||
(override*
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
`(,@(super gb-instantiate-arguments)
|
||||
[callback ,(gb-get-unified-callback)]))]
|
||||
[gb-aux-instantiate
|
||||
(lambda (mode)
|
||||
(append
|
||||
(if (or (output-mode-as-class? mode)
|
||||
(output-mode-no-free-vars? mode))
|
||||
(map (lambda (n c)
|
||||
(if (output-mode-as-class? mode)
|
||||
`(public* [,n ,c])
|
||||
`(define ,n ,c)))
|
||||
(get-callback-names) (get-callback-code))
|
||||
null)
|
||||
(super gb-aux-instantiate mode)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-text-labelled-snip%
|
||||
(lambda (cl deflabel)
|
||||
(class (gb:make-text-label-snip% cl deflabel)
|
||||
(inherit-field w h)
|
||||
(inherit get-label-size draw-label gb-need-recalc-size)
|
||||
(private-field
|
||||
[hmargin 2]
|
||||
[vertical-label? (init-vertical-label?)])
|
||||
(public*
|
||||
[get-label-top-margin (lambda () 0)]
|
||||
[init-vertical-label? (lambda () #f)]
|
||||
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(values 0 0))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(void))]
|
||||
|
||||
[labelpos-install
|
||||
(lambda (vert?)
|
||||
(set! vertical-label? vert?))])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[direction-radio
|
||||
(make-object mred:radio-box% "Label Position:" '("Top" "Left")
|
||||
controls
|
||||
(lambda (r e)
|
||||
(set! vertical-label? (zero? (send direction-radio get-selection)))
|
||||
(gb-need-recalc-size))
|
||||
'(horizontal))])
|
||||
(send direction-radio set-selection (if vertical-label? 0 1))))]
|
||||
[gb-get-min-size
|
||||
(lambda (dc)
|
||||
(let-values ([(x y) (get-label-size dc)]
|
||||
[(x2 y2) (get-min-body-size dc)]
|
||||
[(+x +y) (if vertical-label?
|
||||
(values max +)
|
||||
(values (lambda (a b) (+ a b hmargin)) max))])
|
||||
(values (+x x x2) (+y (+ y (get-label-top-margin)) y2))))]
|
||||
[draw
|
||||
(lambda (dc x y . other)
|
||||
(draw-label dc x (+ y (get-label-top-margin)))
|
||||
(let*-values ([(lw lh) (get-label-size dc)]
|
||||
[(dx dy) (if vertical-label?
|
||||
(values 0 lh)
|
||||
(values (+ lw hmargin) 0))])
|
||||
(with-clipping-region dc (+ x dx) (+ y dy) (- w dx) (- h dy)
|
||||
(lambda ()
|
||||
(draw-body dc (+ x dx) (+ y dy) (- w dx) (- h dy))))))]
|
||||
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(cons (if vertical-label?
|
||||
'vertical-label
|
||||
'horizontal-label)
|
||||
(super gb-get-style)))]
|
||||
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o labelpos-install vertical-label?)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (if vertical-label? 1 0)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(labelpos-install (positive? (send stream get-exact))))])
|
||||
(super-new))))
|
||||
|
||||
|
||||
|
||||
(define gb:make-layout-snip%
|
||||
(lambda (cl)
|
||||
(class cl
|
||||
(inherit gb-need-recalc-size)
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[layout-direction-radio
|
||||
(make-object mred:radio-box%
|
||||
"Layout:"
|
||||
'("Vertical" "Horizontal")
|
||||
controls
|
||||
(lambda (r e)
|
||||
(set! vertical-layout?
|
||||
(zero? (send layout-direction-radio get-selection)))
|
||||
(gb-need-recalc-size))
|
||||
'(horizontal))])
|
||||
(send layout-direction-radio set-selection (if vertical-layout? 0 1))))])
|
||||
(field
|
||||
[vertical-layout? (init-vertical-layout?)])
|
||||
(public*
|
||||
[init-vertical-layout? (lambda () #t)]
|
||||
[layout-install
|
||||
(lambda (vert?)
|
||||
(set! vertical-layout? vert?))])
|
||||
(override*
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(cons (if vertical-layout?
|
||||
'vertical
|
||||
'horizontal)
|
||||
(super gb-get-style)))]
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o layout-install vertical-layout?)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (if vertical-layout? 1 0)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(layout-install (positive? (send stream get-exact))))])
|
||||
(super-new))))
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Mixins for configuration options
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define gb:make-configure-snip%
|
||||
(lambda (cl tag init)
|
||||
(class cl
|
||||
(private-field
|
||||
[v init])
|
||||
(override*
|
||||
[get-tagged-value
|
||||
(lambda (t)
|
||||
(if (eq? t tag)
|
||||
v
|
||||
(super get-tagged-value t)))]
|
||||
[set-tagged-value
|
||||
(lambda (t v-in)
|
||||
(if (eq? t tag)
|
||||
(set! v v-in)
|
||||
(super set-tagged-value t v-in)))]
|
||||
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o set-tagged-value tag v)
|
||||
o))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-boolean-configure-snip%
|
||||
(lambda (cl tag label init change-cb init-cb)
|
||||
(class (gb:make-configure-snip% cl tag init)
|
||||
(inherit gb-need-recalc-size get-tagged-value set-tagged-value)
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(define this-snip this)
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(override*
|
||||
[find-control
|
||||
(lambda (t)
|
||||
(if (eq? t tag)
|
||||
c
|
||||
(super find-control t)))])
|
||||
(super-new)
|
||||
(private-field
|
||||
[c (make-object mred:check-box%
|
||||
label controls
|
||||
(lambda (c e)
|
||||
(set-tagged-value tag (send c get-value))
|
||||
(change-cb this this-snip)
|
||||
(gb-need-recalc-size)))])
|
||||
(send c set-value (get-tagged-value tag))
|
||||
(init-cb this this-snip)))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (if (get-tagged-value tag) 1 0)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(set-tagged-value tag (positive? (send stream get-exact))))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-multi-checkable-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-boolean-configure-snip% cl 'multi "Multiple Lines" #f
|
||||
(lambda (f snip)
|
||||
(send snip multi-changed f))
|
||||
void)
|
||||
(inherit get-tagged-value)
|
||||
(public*
|
||||
[get-multi
|
||||
(lambda () (get-tagged-value 'multi))]
|
||||
[multi-changed
|
||||
(lambda (f)
|
||||
(send (send f find-control 'hscroll) enable (get-multi)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-select-configure-snip%
|
||||
(lambda (cl tag label choices)
|
||||
(class (gb:make-configure-snip% cl tag 0)
|
||||
(inherit gb-need-recalc-size get-tagged-value set-tagged-value)
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[c (make-object mred:choice%
|
||||
label choices controls
|
||||
(lambda (c e)
|
||||
(set-tagged-value tag (send c get-selection))
|
||||
(gb-need-recalc-size)))])
|
||||
(send c set-selection (get-tagged-value tag))))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (get-tagged-value tag)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(set-tagged-value tag (send stream get-exact)))])
|
||||
(super-new))))
|
||||
|
||||
(provide gb:make-text-label-snip%
|
||||
gb:make-callback-snip%
|
||||
gb:make-text-labelled-snip%
|
||||
gb:make-layout-snip%
|
||||
|
||||
gb:make-configure-snip%
|
||||
gb:make-boolean-configure-snip%
|
||||
gb:make-multi-checkable-snip%
|
||||
gb:make-select-configure-snip%))
|
|
@ -1,26 +0,0 @@
|
|||
/* XPM */
|
||||
static char *gauge[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 16 3 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #a0a0a0",
|
||||
"a c #ffffff",
|
||||
/* pixels */
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"a..............a",
|
||||
"a.######aaaaaa.a",
|
||||
"a.######aaaaaa.a",
|
||||
"a.######aaaaaa.a",
|
||||
"a.######aaaaaa.a",
|
||||
"a..............a",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa"
|
||||
};
|
|
@ -1,100 +0,0 @@
|
|||
(module guibuilder mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
(prefix framework: framework)
|
||||
"utils.rkt"
|
||||
"top-level.rkt"
|
||||
"toolbar.rkt")
|
||||
|
||||
;; These modules implement snips for the various
|
||||
;; kinds of windows and controls.
|
||||
(require "base.rkt"
|
||||
"panel.rkt"
|
||||
"simple-control.rkt"
|
||||
"text-field.rkt"
|
||||
"multiple-choice.rkt"
|
||||
"slider-guage.rkt"
|
||||
"canvas.rkt")
|
||||
|
||||
(define my-base-frame% framework:frame:editor%)
|
||||
|
||||
(define gb:frame%
|
||||
(class my-base-frame%
|
||||
(init [file #f])
|
||||
(inherit get-editor show get-area-container get-menu-bar)
|
||||
|
||||
(define gb-editor #f)
|
||||
(define (get-gb-editor)
|
||||
gb-editor)
|
||||
|
||||
(override*
|
||||
[get-editor% (lambda ()
|
||||
(class framework:text:info%
|
||||
(inherit insert)
|
||||
(super-new)
|
||||
(set! gb-editor (new gb:edit%))
|
||||
(insert (make-object mred:editor-snip% gb-editor))))])
|
||||
|
||||
(define toolbar #f)
|
||||
(public*
|
||||
[init-tools
|
||||
(lambda (mb)
|
||||
(set! toolbar (make-object toolbar% (get-area-container)))
|
||||
(send (get-area-container) change-children
|
||||
(lambda (l)
|
||||
(cons toolbar (remove toolbar l))))
|
||||
|
||||
(let* ([emenu (make-object mred:menu% "Element" mb)]
|
||||
[vmenu (make-object mred:menu% "Output" mb)])
|
||||
(make-object mred:menu-item% "Configure Selected" emenu
|
||||
(lambda (i e)
|
||||
(send (get-gb-editor)
|
||||
for-each-selected-snip
|
||||
(lambda (s)
|
||||
(send s gb-open-dialog)))))
|
||||
(make-object mred:separator-menu-item% emenu)
|
||||
(add-tools toolbar emenu (lambda (c%) (insert-element c%)))
|
||||
|
||||
(make-object mred:menu-item% "Configure Output" vmenu
|
||||
(lambda (i e) (send (get-gb-editor) open-dialog)))
|
||||
(make-object mred:separator-menu-item% vmenu)
|
||||
(make-object mred:menu-item% "Make Sample Window" vmenu
|
||||
(lambda (i e) (send (get-gb-editor) instantiate)))
|
||||
(make-object mred:menu-item% "Make Source Code" vmenu
|
||||
(lambda (i e) (send (get-gb-editor) view-source)))))]
|
||||
[insert-element
|
||||
(lambda (c%)
|
||||
(let ([e (get-gb-editor)])
|
||||
(send e insert-element c%)))])
|
||||
|
||||
(super-make-object (or file "GUI Builder"))
|
||||
|
||||
(init-tools (get-menu-bar))
|
||||
|
||||
(let ([file (and file (normalize-path file))])
|
||||
(if (and file (file-exists? file) (send (get-gb-editor) load-file file))
|
||||
;; Force title size calc:
|
||||
(let ([e (get-gb-editor)])
|
||||
(send e get-main-location
|
||||
(send e get-main-panel)
|
||||
(send (send e get-canvas) get-dc)
|
||||
(box 0) (box 0)))
|
||||
(begin
|
||||
(send (get-gb-editor) create-main-panel)
|
||||
(when file
|
||||
(send (get-gb-editor) set-filename file)))))
|
||||
|
||||
(show #t)))
|
||||
|
||||
(framework:handler:insert-format-handler "GUI Builder" "gui"
|
||||
(lambda (file)
|
||||
(make-object gb:frame% file)))
|
||||
|
||||
(define (new-gui-builder-frame) (new gb:frame% [height 400]))
|
||||
|
||||
|
||||
(new-gui-builder-frame))
|
|
@ -1 +0,0 @@
|
|||
(The help document has not been written.)
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * hpanel_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" .............. ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" . X XX X . ",
|
||||
" . X XX X . ",
|
||||
" . X XX X . ",
|
||||
" . X XX X . ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" .............. ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,4 +0,0 @@
|
|||
#lang setup/infotab
|
||||
|
||||
(define tools '(("tool.rkt")))
|
||||
(define tool-names '("GUI Builder"))
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * list_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" ",
|
||||
" ............ ",
|
||||
" . . . ",
|
||||
" . XXXX . . ",
|
||||
" . . . ",
|
||||
" . XXXX . . ",
|
||||
" . . . ",
|
||||
" . XXXX . . ",
|
||||
" . . . ",
|
||||
" . XXXX . . ",
|
||||
" . . . ",
|
||||
" . . . ",
|
||||
" ............ ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * mcanvas_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #A0A0A0A0A0A0",
|
||||
"X c #000000000000",
|
||||
" ",
|
||||
" .............. ",
|
||||
" . . . ",
|
||||
" . XXXXX X X. . ",
|
||||
" . X X X X . . ",
|
||||
" . X X . . ",
|
||||
" . X X . . ",
|
||||
" . XXX X . . ",
|
||||
" . X . . ",
|
||||
" . X . . ",
|
||||
" . X X. . ",
|
||||
" . . . ",
|
||||
" .............. ",
|
||||
" . . . ",
|
||||
" .............. ",
|
||||
" "};
|
|
@ -1,21 +0,0 @@
|
|||
/* XPM */
|
||||
static char * message_xpm[] = {
|
||||
"16 16 2 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ...... ",
|
||||
" . .. . ",
|
||||
" .. ",
|
||||
" .. ",
|
||||
" .. ",
|
||||
" .... ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,269 +0,0 @@
|
|||
(module multiple-choice mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"feature.rkt")
|
||||
|
||||
(define gb:make-item-list-snip%
|
||||
(lambda (cl)
|
||||
(class cl
|
||||
(inherit gb-need-recalc-size)
|
||||
(private*
|
||||
[delete
|
||||
(lambda (l p)
|
||||
(let loop ([l l][p p])
|
||||
(cond
|
||||
[(null? l) l]
|
||||
[(zero? p) (cdr l)]
|
||||
[else (cons (car l) (loop (cdr l) (sub1 p)))])))])
|
||||
(public*
|
||||
[get-items
|
||||
(lambda ()
|
||||
items)]
|
||||
[init-items (lambda () null)]
|
||||
[get-item-height
|
||||
(lambda (dc)
|
||||
(let-values ([(w h d a) (send dc get-text-extent "Xj")])
|
||||
h))]
|
||||
[get-max-item-width
|
||||
(lambda (dc)
|
||||
(let loop ([l items][mw 0])
|
||||
(if (null? l)
|
||||
mw
|
||||
(let-values ([(w h d a) (send dc get-text-extent (car l))])
|
||||
(loop (cdr l) (max mw w))))))]
|
||||
|
||||
[items-install
|
||||
(lambda (l)
|
||||
(set! items l))])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(public*
|
||||
[user-item (lambda (v)
|
||||
(mred:get-text-from-user "Item name:" "List Item Name" #f v))])
|
||||
(private-field
|
||||
[items-panel (make-object mred:vertical-panel% controls)]
|
||||
[items-list (make-object mred:list-box%
|
||||
"Items:"
|
||||
items
|
||||
items-panel
|
||||
(lambda (l e)
|
||||
(when (eq? 'list-box-dclick (send e get-event-type))
|
||||
(let ([pos (send items-list get-selection)])
|
||||
(unless (negative? pos)
|
||||
(let ([v (user-item (list-ref items pos))])
|
||||
(when v
|
||||
(send items-list set-string pos v)
|
||||
(set! items (let loop ([items items][pos pos])
|
||||
(if (zero? pos)
|
||||
(cons v (cdr items))
|
||||
(cons (car items)
|
||||
(loop (cdr items) (sub1 pos))))))
|
||||
(gb-need-recalc-size))))))))]
|
||||
[item-buttons-panel (let ([v (make-object mred:horizontal-panel% items-panel)])
|
||||
(send v stretchable-width #f)
|
||||
v)]
|
||||
[add-item (make-object mred:button% "Add Item" item-buttons-panel
|
||||
(lambda (b e)
|
||||
(let ([v (user-item (format
|
||||
"Item~a"
|
||||
(send items-list get-number)))])
|
||||
(when v
|
||||
(send items-list append v)
|
||||
(set! items (append items (list v)))
|
||||
(gb-need-recalc-size)))))]
|
||||
[delete-item (make-object mred:button% "Delete Item" item-buttons-panel
|
||||
(lambda (b e)
|
||||
(let loop ([ls (reverse (send items-list get-selections))])
|
||||
(unless (null? ls)
|
||||
(send items-list delete (car ls))
|
||||
(set! items (delete items (car ls)))
|
||||
(loop (cdr ls))))
|
||||
(gb-need-recalc-size)))])))]
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
(cons
|
||||
`[choices ',(get-items)]
|
||||
(super gb-instantiate-arguments)))]
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o items-install items)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(stream-write-list stream items))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(items-install (stream-read-list stream version)))])
|
||||
(private-field
|
||||
[items (init-items)])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-list-box-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-callback-names get-items get-item-height)
|
||||
(field
|
||||
[min-body-width 50]
|
||||
[sb-width 10]
|
||||
[min-item-count 3])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "listbox"))]
|
||||
[init-y-stretch? (lambda () #t)]
|
||||
[init-x-stretch? (lambda () #t)]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(let ([y (get-item-height dc)])
|
||||
(values min-body-width (* min-item-count y))))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(send dc draw-rectangle x y w h)
|
||||
(send dc draw-line
|
||||
(+ w x (- sb-width)) y
|
||||
(+ w x (- sb-width)) (+ y h))
|
||||
(with-clipping-region
|
||||
dc x y (- w sb-width) h
|
||||
(lambda ()
|
||||
(let ([ih (get-item-height dc)])
|
||||
(let loop ([l (get-items)][iy (add1 y)])
|
||||
(unless (or (>= iy (+ y h)) (null? l))
|
||||
(send dc draw-text (car l) (+ 2 x) iy)
|
||||
(loop (cdr l) (+ iy ih))))))))]
|
||||
[get-callback-kinds (lambda ()
|
||||
(list "-select-callback" "-double-select-callback"))]
|
||||
[gb-get-default-class (lambda () 'list-box%)]
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(cons 'single
|
||||
(super gb-get-style)))]
|
||||
[gb-get-unified-callback
|
||||
(lambda ()
|
||||
(let-values ([(sel dbl) (apply values (get-callback-names))])
|
||||
`(lambda (b e)
|
||||
(case (send e get-event-type)
|
||||
[(list-box) (,sel b e)]
|
||||
[(list-box-dclick) (,dbl b e)]))))])
|
||||
(super-new))))
|
||||
|
||||
|
||||
(define gb:list-box-snip% (gb:make-list-box-snip%
|
||||
(gb:make-item-list-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"List")))
|
||||
"gb:listbox"))
|
||||
|
||||
(register-class gb:list-box-snip% "gb:listbox")
|
||||
|
||||
|
||||
(define gb:make-radio-box-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h vertical-layout?)
|
||||
(inherit get-item-height get-max-item-width get-items
|
||||
gb-need-recalc-size)
|
||||
(private-field
|
||||
[circle-size 10]
|
||||
[margin 2])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "radiobox"))]
|
||||
[init-items (lambda () (list "First" "Second"))]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(let ([h (max (get-item-height dc) circle-size)]
|
||||
[w (get-max-item-width dc)]
|
||||
[l (length (get-items))])
|
||||
(let-values ([(x-l y-l) (if vertical-layout?
|
||||
(values 1 l)
|
||||
(values l 1))])
|
||||
(values (* (+ circle-size margin w) x-l)
|
||||
(* h y-l)))))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(let ([ih (max (get-item-height dc) circle-size)]
|
||||
[iw (+ (get-max-item-width dc) circle-size margin)])
|
||||
(let loop ([l (get-items)][iy y][ix x])
|
||||
(unless (null? l)
|
||||
(send dc draw-ellipse ix (+ iy (/ (- ih circle-size) 2)) circle-size circle-size)
|
||||
(send dc draw-text (car l) (+ circle-size margin ix) iy)
|
||||
(if vertical-layout?
|
||||
(loop (cdr l) (+ iy ih) ix)
|
||||
(loop (cdr l) iy (+ ix iw)))))))]
|
||||
[gb-get-default-class (lambda () 'radio-box%)])
|
||||
(super-new))))
|
||||
|
||||
|
||||
(define gb:radio-box-snip% (gb:make-radio-box-snip%
|
||||
(gb:make-item-list-snip%
|
||||
(gb:make-layout-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"Radiobox"))))
|
||||
"gb:radiobox"))
|
||||
|
||||
(register-class gb:radio-box-snip% "gb:radiobox")
|
||||
|
||||
|
||||
(define gb:make-choice-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-item-height get-max-item-width get-items
|
||||
gb-need-recalc-size)
|
||||
(field
|
||||
[arrow-size 10]
|
||||
[lmargin 2]
|
||||
[amargin 2]
|
||||
[rmargin 2]
|
||||
[arrow (list (make-object mred:point% 0 0)
|
||||
(make-object mred:point% arrow-size 0)
|
||||
(make-object mred:point% (quotient arrow-size 2) (quotient arrow-size 2)))])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "choice"))]
|
||||
[init-items (lambda () (list "First"))]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(let ([h (get-item-height dc)]
|
||||
[w (get-max-item-width dc)])
|
||||
(values (+ lmargin arrow-size amargin w rmargin 3) (+ 3 h))))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(send dc draw-rectangle x y (sub1 w) (sub1 h))
|
||||
(send dc draw-line (sub1 (+ x w)) (add1 y) (sub1 (+ x w)) (+ y h))
|
||||
(send dc draw-line (add1 x) (sub1 (+ y h)) (+ x w) (sub1 (+ y h)))
|
||||
(send dc draw-polygon arrow (+ 1 lmargin x) (+ y (/ (- h (/ arrow-size 2)) 2)))
|
||||
(let ([l (get-items)])
|
||||
(unless (null? l)
|
||||
(send dc draw-text (car l) (+ 1 lmargin arrow-size amargin x) (add1 y)))))]
|
||||
[gb-get-default-class (lambda () 'choice%)])
|
||||
(super-new))))
|
||||
|
||||
|
||||
(define gb:choice-snip% (gb:make-choice-snip%
|
||||
(gb:make-item-list-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"Choice")))
|
||||
"gb:choice"))
|
||||
|
||||
(register-class gb:choice-snip% "gb:choice")
|
||||
|
||||
(provide gb:list-box-snip%
|
||||
gb:radio-box-snip%
|
||||
gb:choice-snip%))
|
|
@ -1,157 +0,0 @@
|
|||
(module panel mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt")
|
||||
|
||||
(define gb:make-panel-params-snip%
|
||||
(lambda (cl)
|
||||
(class cl
|
||||
(inherit-field horizontal-child-alignment
|
||||
vertical-child-alignment
|
||||
with-border?)
|
||||
(inherit set-horizontal-child-alignment
|
||||
set-vertical-child-alignment
|
||||
set-with-border
|
||||
gb-need-recalc-size)
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(field
|
||||
[hca-choice
|
||||
(make-object mred:choice%
|
||||
"Horizontal Align Children:"
|
||||
'("Left" "Center" "Right")
|
||||
controls
|
||||
(lambda (r e)
|
||||
(set-horizontal-child-alignment
|
||||
(add1 (send r get-selection)))
|
||||
(gb-need-recalc-size)))]
|
||||
[vca-choice
|
||||
(make-object mred:choice%
|
||||
"Vertical Align Children:"
|
||||
'("Top" "Center" "Bottom")
|
||||
controls
|
||||
(lambda (r e)
|
||||
(set-vertical-child-alignment
|
||||
(add1 (send r get-selection)))
|
||||
(gb-need-recalc-size)))]
|
||||
[border-check
|
||||
(make-object mred:check-box%
|
||||
"Show Border" controls
|
||||
(lambda (c e)
|
||||
(set-with-border (send c get-value))
|
||||
(gb-need-recalc-size)))])
|
||||
(send hca-choice stretchable-width #f)
|
||||
(send hca-choice set-selection (sub1 horizontal-child-alignment))
|
||||
(send vca-choice stretchable-width #f)
|
||||
(send vca-choice set-selection (sub1 vertical-child-alignment))
|
||||
(send border-check set-value with-border?)))])
|
||||
(private*
|
||||
[symbol-append
|
||||
(lambda (a b) (string->symbol (string-append (symbol->string a) (symbol->string b))))])
|
||||
(override*
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
`(,@(super gb-instantiate-arguments)
|
||||
[alignment '(,(case horizontal-child-alignment
|
||||
[(1) 'left]
|
||||
[(2) 'center]
|
||||
[(3) 'right])
|
||||
,(case horizontal-child-alignment
|
||||
[(1) 'top]
|
||||
[(2) 'center]
|
||||
[(3) 'bottom]))]))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:vertical-panel-snip%
|
||||
(class (gb:make-panel-params-snip% gb:snip%)
|
||||
(override*
|
||||
[get-classname (lambda () "gb:vertical-panel")]
|
||||
[init-name (lambda () (new-name "vpanel"))])
|
||||
(super-new)))
|
||||
|
||||
(register-class gb:vertical-panel-snip% "gb:vertical-panel")
|
||||
|
||||
; Used by top-level panel:
|
||||
(define gb:panel-snip%
|
||||
(class gb:vertical-panel-snip%
|
||||
(override*
|
||||
[get-classname (lambda () "gb:panel")])
|
||||
(super-new)))
|
||||
|
||||
(register-class gb:panel-snip% "gb:panel")
|
||||
|
||||
(define gb:horizontal-panel-snip%
|
||||
(class (gb:make-panel-params-snip% gb:snip%)
|
||||
(inherit-field horizontal-child-alignment vertical-child-alignment
|
||||
children)
|
||||
(inherit spacing-+)
|
||||
(override*
|
||||
[get-classname (lambda () "gb:horizontal-panel")]
|
||||
[init-name (lambda () (new-name "hpanel"))]
|
||||
|
||||
(gb-get-child-x-start
|
||||
(lambda (mw mh w h)
|
||||
(if (or (= horizontal-child-alignment 1)
|
||||
(ormap (lambda (c) (gb-x-stretch? c)) children))
|
||||
0
|
||||
(case horizontal-child-alignment
|
||||
[(2) (/ (- w mw) 2)]
|
||||
[(3) (- w mw)]))))
|
||||
(gb-get-child-y-start
|
||||
(lambda (mw mh w h)
|
||||
0))
|
||||
|
||||
(gb-combine-child-width (lambda (a b) (spacing-+ a b)))
|
||||
(gb-combine-child-height (lambda (a b) (max a b)))
|
||||
|
||||
(gb-compute-child-x-pos
|
||||
(lambda (dc c w)
|
||||
0))
|
||||
(gb-compute-child-y-pos
|
||||
(lambda (dc c h)
|
||||
(if (gb-y-stretch? c)
|
||||
0
|
||||
(case vertical-child-alignment
|
||||
[(2) (let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(/ (- h ch) 2))]
|
||||
[(1) 0]
|
||||
[(3) (let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(- h ch))]))))
|
||||
(gb-compute-child-width
|
||||
(lambda (dc c w xsc dw)
|
||||
(let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
(if (gb-x-stretch? c)
|
||||
(+ cw (/ dw xsc))
|
||||
cw))))
|
||||
(gb-compute-child-height
|
||||
(lambda (dc c h ysc dh)
|
||||
(if (gb-y-stretch? c)
|
||||
h
|
||||
(let-values ([(cw ch) (send c gb-get-min-size dc)])
|
||||
ch))))
|
||||
|
||||
(gb-combine-child-x-offset (lambda (a b) (spacing-+ a b)))
|
||||
(gb-combine-child-y-offset (lambda (a b) a))
|
||||
|
||||
(find-position-<
|
||||
(lambda (fx fy cx cy)
|
||||
(< fx cx)))
|
||||
|
||||
[gb-get-default-class (lambda () 'horizontal-panel%)])
|
||||
(super-new)))
|
||||
|
||||
(register-class gb:horizontal-panel-snip% "gb:horizontal-panel")
|
||||
|
||||
(provide gb:make-panel-params-snip%
|
||||
gb:vertical-panel-snip%
|
||||
gb:panel-snip%
|
||||
gb:horizontal-panel-snip%))
|
|
@ -1,23 +0,0 @@
|
|||
/* XPM */
|
||||
static char * radiobox_xpm[] = {
|
||||
"16 16 4 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
"o c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" ",
|
||||
" ",
|
||||
" .. ",
|
||||
" .XX. ooooooooo ",
|
||||
" .XX. ooooooooo ",
|
||||
" .. ",
|
||||
" ",
|
||||
" ",
|
||||
" .. ",
|
||||
" . . ooooooooo ",
|
||||
" . . ooooooooo ",
|
||||
" .. ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,54 +0,0 @@
|
|||
(module readable mzscheme
|
||||
(require mred
|
||||
mzlib/class
|
||||
"top-level.rkt"
|
||||
"toolbar.rkt")
|
||||
|
||||
(define gui-snip-class%
|
||||
(class snip-class%
|
||||
(inherit set-classname set-version)
|
||||
|
||||
(define/override (read f)
|
||||
(let ([e (make-object gb:edit%)])
|
||||
(send e prepare-to-load)
|
||||
(send e read-from-file f)
|
||||
(send e done-loading #t)
|
||||
(make-object gui-code-snip% e)))
|
||||
|
||||
(super-new)
|
||||
(set-classname "(lib \"readable.ss\" \"guibuilder\")")
|
||||
(set-version 1)))
|
||||
|
||||
(define gui-snip-class (new gui-snip-class%))
|
||||
|
||||
(send (get-the-snip-class-list) add gui-snip-class)
|
||||
|
||||
|
||||
(define gui-code-snip%
|
||||
(class* editor-snip% (readable-snip<%>)
|
||||
(inherit get-editor set-min-width set-min-height set-snipclass get-admin)
|
||||
|
||||
(define/public (read-special source line column position)
|
||||
(send (get-editor) build-code #f #f))
|
||||
|
||||
(define/override (write f)
|
||||
(send (get-editor) write-to-file f))
|
||||
(define/override (copy)
|
||||
(make-object gui-code-snip% (send (get-editor) copy-self)))
|
||||
|
||||
(define/override (on-event dc x y editorx editory e)
|
||||
(if (send e button-down? 'right)
|
||||
(let ([tool-menu (make-object popup-menu%)])
|
||||
(add-tools #f tool-menu (lambda (c%)
|
||||
(send (get-editor) insert-element c%)))
|
||||
(send (get-admin) popup-menu
|
||||
tool-menu this
|
||||
(- (send e get-x) x)
|
||||
(- (send e get-y) y)))
|
||||
(super on-event dc x y editorx editory e)))
|
||||
|
||||
(super-new)
|
||||
(set-snipclass gui-snip-class)))
|
||||
|
||||
(provide gui-code-snip%
|
||||
(rename gui-snip-class snip-class)))
|
|
@ -1,101 +0,0 @@
|
|||
(module simple-control mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"feature.rkt")
|
||||
|
||||
(define gb:make-message-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-label get-label-size draw-label)
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "message"))]
|
||||
[gb-get-min-size
|
||||
(lambda (dc)
|
||||
(get-label-size dc))]
|
||||
[draw
|
||||
(lambda (dc x y . other)
|
||||
(draw-label dc x y))]
|
||||
[gb-get-default-class (lambda () 'message%)])
|
||||
(super-new))))
|
||||
|
||||
(define gb:message-snip% (gb:make-message-snip%
|
||||
(gb:make-text-label-snip% gb:atomic-snip%
|
||||
"Message")
|
||||
"gb:message"))
|
||||
|
||||
(register-class gb:message-snip% "gb:message")
|
||||
|
||||
(define gb:make-button-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-label get-label-size get-callback-names draw-label)
|
||||
(private-field
|
||||
[m 5])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "button"))]
|
||||
[gb-get-min-size
|
||||
(lambda (dc)
|
||||
(let-values ([(x y) (get-label-size dc)])
|
||||
(values (+ (* 2 m) x) (+ (* 2 m) y))))]
|
||||
[draw
|
||||
(lambda (dc x y . other)
|
||||
(send dc draw-rounded-rectangle x y w h 3)
|
||||
(let-values ([(lw lh) (get-label-size dc)])
|
||||
(draw-label dc
|
||||
(+ (+ x m) (/ (- w lw (* 2 m)) 2))
|
||||
(+ (+ y m) (/ (- h lh (* 2 m)) 2)))))]
|
||||
[gb-get-default-class (lambda () 'button%)])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-check-box-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-style get-label get-callback-names get-label-size draw-label)
|
||||
(private-field
|
||||
[hspace 2]
|
||||
[boxsize 12])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "checkbox"))]
|
||||
[gb-get-min-size
|
||||
(lambda (dc)
|
||||
(let-values ([(x y) (get-label-size dc)])
|
||||
(values (+ boxsize hspace x) (max boxsize y))))]
|
||||
[draw
|
||||
(lambda (dc x y . other)
|
||||
(let-values ([(lx ly) (get-label-size dc)])
|
||||
(send dc draw-rectangle x (+ y (/ (- h boxsize) 2)) boxsize boxsize)
|
||||
(draw-label dc (+ x boxsize hspace) (+ y (/ (- h ly) 2)))))]
|
||||
[gb-get-default-class (lambda () 'check-box%)])
|
||||
(super-new))))
|
||||
|
||||
(define gb:button-snip% (gb:make-button-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-label-snip% gb:atomic-snip%
|
||||
"Button"))
|
||||
"gb:button"))
|
||||
|
||||
(define gb:check-box-snip% (gb:make-check-box-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-label-snip% gb:atomic-snip%
|
||||
"Checkbox"))
|
||||
"gb:checkbox"))
|
||||
|
||||
(register-class gb:button-snip% "gb:button")
|
||||
(register-class gb:check-box-snip% "gb:checkbox")
|
||||
|
||||
|
||||
(provide gb:message-snip%
|
||||
gb:button-snip%
|
||||
gb:check-box-snip%))
|
|
@ -1,192 +0,0 @@
|
|||
(module slider-guage mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"feature.rkt")
|
||||
|
||||
(define gb:make-slider-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field vertical-layout?)
|
||||
(inherit get-label get-callback-names gb-need-recalc-size)
|
||||
(field
|
||||
[init-value 0]
|
||||
[min-value 0]
|
||||
[max-value 10]
|
||||
[arrow-size 10]
|
||||
[height arrow-size]
|
||||
[line-height 3]
|
||||
[min-width 50]
|
||||
[darrow (list (make-object mred:point% 0 0)
|
||||
(make-object mred:point% arrow-size 0)
|
||||
(make-object mred:point% (quotient arrow-size 2) (quotient arrow-size 2)))]
|
||||
[rarrow (list (make-object mred:point% 0 0)
|
||||
(make-object mred:point% 0 arrow-size)
|
||||
(make-object mred:point% (quotient arrow-size 2) (quotient arrow-size 2)))])
|
||||
(public*
|
||||
[slider-install
|
||||
(lambda (mn mx in)
|
||||
(set! min-value mn)
|
||||
(set! max-value mx)
|
||||
(set! init-value in))])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[min-val (make-number-control controls "Minimum:" 0 (lambda () -10000) (lambda () 10000)
|
||||
(lambda (x)
|
||||
(set! min-value x)
|
||||
(send max-val check)
|
||||
(send init-val check)
|
||||
(gb-need-recalc-size)))]
|
||||
[max-val (make-number-control controls "Maximum:" 10 (lambda () (send min-val get-val)) (lambda () 10000)
|
||||
(lambda (x)
|
||||
(set! max-value x)
|
||||
(send init-val check)
|
||||
(gb-need-recalc-size)))]
|
||||
[init-val (make-number-control controls "Initial:" 0 (lambda () (send min-val get-val))
|
||||
(lambda () (send max-val get-val))
|
||||
(lambda (x)
|
||||
(set! init-value x)
|
||||
(gb-need-recalc-size)))])))]
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "slider"))]
|
||||
[init-vertical-layout? (lambda () #f)]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(if vertical-layout?
|
||||
(values height min-width)
|
||||
(values min-width height)))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(let ([percent (/ (- init-value min-value) (- max-value min-value))])
|
||||
(if vertical-layout?
|
||||
(begin
|
||||
(send dc draw-rectangle
|
||||
(+ x (/ arrow-size 2)) (+ y (/ arrow-size 2))
|
||||
line-height (- h arrow-size))
|
||||
(send dc draw-polygon rarrow x (+ y (* percent (- h arrow-size)))))
|
||||
(begin
|
||||
(send dc draw-rectangle
|
||||
(+ x (/ arrow-size 2)) (+ y (/ arrow-size 2))
|
||||
(- w arrow-size) line-height)
|
||||
(send dc draw-polygon darrow (+ x (* percent (- w arrow-size))) y)))))]
|
||||
[gb-get-default-class (lambda () 'slider%)]
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
(list*
|
||||
`[min-value ,min-value]
|
||||
`[max-value ,max-value]
|
||||
`[init-value ,init-value]
|
||||
(super gb-instantiate-arguments)))]
|
||||
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o slider-install min-value max-value init-value)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put min-value)
|
||||
(send stream put max-value)
|
||||
(send stream put init-value))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(slider-install (send stream get-exact)
|
||||
(send stream get-exact)
|
||||
(send stream get-exact)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:slider-snip% (gb:make-slider-snip%
|
||||
(gb:make-layout-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"Slider")))
|
||||
"gb:slider"))
|
||||
|
||||
(register-class gb:slider-snip% "gb:slider")
|
||||
|
||||
(define gb:make-gauge-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field vertical-layout?)
|
||||
(inherit get-label gb-need-recalc-size)
|
||||
(field
|
||||
[max-value 10]
|
||||
[min-height 10]
|
||||
[min-width 50])
|
||||
(public*
|
||||
[gauge-install
|
||||
(lambda (mx)
|
||||
(set! max-value mx))])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[max-val (make-number-control controls "Maximum:" 10 (lambda () 1) (lambda () 10000)
|
||||
(lambda (x)
|
||||
(set! max-value x)
|
||||
(gb-need-recalc-size)))])))]
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "gauge"))]
|
||||
[init-vertical-layout? (lambda () #f)]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(if vertical-layout?
|
||||
(values min-height min-width)
|
||||
(values min-width min-height)))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(send dc draw-rectangle x y w h)
|
||||
(let ([b (send dc get-brush)])
|
||||
(send dc set-brush (send mred:the-brush-list find-or-create-brush "BLACK" 'solid))
|
||||
(send dc draw-rectangle
|
||||
x (if vertical-layout? (+ y (* 0.75 h)) y)
|
||||
(if vertical-layout? w (* 0.25 w)) (if vertical-layout? (* 0.25 h) h))
|
||||
(send dc set-brush b)))]
|
||||
[gb-get-default-class (lambda () 'gauge%)]
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
(list*
|
||||
`[range ,max-value]
|
||||
(super gb-instantiate-arguments)))]
|
||||
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o gauge-install max-value)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put max-value))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(gauge-install (send stream get-exact)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:gauge-snip% (gb:make-gauge-snip%
|
||||
(gb:make-layout-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"Gauge"))
|
||||
"gb:gauge"))
|
||||
|
||||
(register-class gb:gauge-snip% "gb:gauge")
|
||||
|
||||
|
||||
(provide gb:slider-snip%
|
||||
gb:gauge-snip%))
|
|
@ -1,26 +0,0 @@
|
|||
/* XPM */
|
||||
static char *slider[] = {
|
||||
/* width height num_colors chars_per_pixel */
|
||||
" 16 16 3 1",
|
||||
/* colors */
|
||||
". c #000000",
|
||||
"# c #a0a0a0",
|
||||
"a c #ffffff",
|
||||
/* pixels */
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaa.....aaaaaa",
|
||||
"aaaaaa...aaaaaaa",
|
||||
"aaaaaaa.aaaaaaaa",
|
||||
"a##############a",
|
||||
"a..............a",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa",
|
||||
"aaaaaaaaaaaaaaaa"
|
||||
};
|
|
@ -1,135 +0,0 @@
|
|||
(module text-field mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"feature.rkt")
|
||||
|
||||
(define gb:make-text-initial-snip%
|
||||
(lambda (cl)
|
||||
(class cl
|
||||
(inherit gb-need-recalc-size get-style)
|
||||
(private-field
|
||||
[initial "value"])
|
||||
(public*
|
||||
[get-initial (lambda () initial)]
|
||||
[get-initial-size
|
||||
(lambda (dc)
|
||||
(let-values ([(w h d a) (send dc get-text-extent initial
|
||||
(send (get-style) get-font))])
|
||||
(values w h)))]
|
||||
|
||||
[initial-install
|
||||
(lambda (i)
|
||||
(set! initial i))])
|
||||
(override*
|
||||
[get-frame%
|
||||
(lambda ()
|
||||
(class (super get-frame%)
|
||||
(inherit-field controls)
|
||||
(super-new)
|
||||
(private-field
|
||||
[initial-text
|
||||
(make-one-line/callback-edit controls "Initial:"
|
||||
(lambda (txt)
|
||||
(set! initial txt)
|
||||
(gb-need-recalc-size))
|
||||
initial)])))]
|
||||
|
||||
[copy
|
||||
(lambda ()
|
||||
(let ([o (super copy)])
|
||||
(send o initial-install initial)
|
||||
o))]
|
||||
[write
|
||||
(lambda (stream)
|
||||
(super write stream)
|
||||
(send stream put (string->bytes/utf-8 initial)))]
|
||||
[read
|
||||
(lambda (stream version)
|
||||
(super read stream version)
|
||||
(initial-install ((get-bytes->string version) (send stream get-bytes))))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-text-hscroll-checkable-snip%
|
||||
(lambda (cl)
|
||||
(class (gb:make-boolean-configure-snip% cl 'hscroll "Horizontal Scroll" #f
|
||||
void
|
||||
(lambda (f snip)
|
||||
(send (send f find-control 'hscroll)
|
||||
enable
|
||||
(send snip get-tagged-value 'multi))))
|
||||
(inherit get-tagged-value)
|
||||
(override*
|
||||
[gb-get-style
|
||||
(lambda ()
|
||||
(append
|
||||
(if (get-tagged-value 'hscroll)
|
||||
'(hscroll)
|
||||
null)
|
||||
(super gb-get-style)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:make-text-snip%
|
||||
(lambda (cl cn)
|
||||
(class cl
|
||||
(inherit-field w h)
|
||||
(inherit get-initial-size get-initial
|
||||
get-callback-names get-multi
|
||||
get-label)
|
||||
(private-field
|
||||
[margin 2])
|
||||
(override*
|
||||
[get-classname (lambda () cn)]
|
||||
[init-name (lambda () (new-name "text"))]
|
||||
[init-x-stretch? (lambda () #t)]
|
||||
[get-label-top-margin (lambda () margin)]
|
||||
[get-min-body-size
|
||||
(lambda (dc)
|
||||
(let-values ([(w h) (get-initial-size dc)])
|
||||
(values (+ w (* 2 margin))
|
||||
(+ (* h (if (get-multi) 3 1))
|
||||
(* 2 margin)))))]
|
||||
[draw-body
|
||||
(lambda (dc x y w h)
|
||||
(send dc draw-rectangle x y w h)
|
||||
(send dc draw-text (get-initial) (+ x margin) (+ y margin)))]
|
||||
[get-callback-kinds (lambda ()
|
||||
(list "-change-callback" "-return-callback" "-focus-callback"))]
|
||||
[gb-get-default-class (lambda () 'text-field%)]
|
||||
[gb-get-style (lambda () (append
|
||||
(super gb-get-style)
|
||||
(if (get-multi) '(multiple) '(single))))]
|
||||
[gb-get-unified-callback
|
||||
(lambda ()
|
||||
(let-values ([(change return focus)
|
||||
(apply values (get-callback-names))])
|
||||
`(lambda (b e)
|
||||
(let ([t (send e get-event-type)])
|
||||
(cond
|
||||
[(eq? t 'text-field) (,change b e)]
|
||||
[(eq? t 'text-field-enter) (,return b e)]
|
||||
[else (,focus b e)])))))]
|
||||
[gb-instantiate-arguments
|
||||
(lambda ()
|
||||
(cons
|
||||
`[init-value ,(get-initial)]
|
||||
(super gb-instantiate-arguments)))])
|
||||
(super-new))))
|
||||
|
||||
(define gb:text-snip% (gb:make-text-snip%
|
||||
(gb:make-text-hscroll-checkable-snip%
|
||||
(gb:make-multi-checkable-snip%
|
||||
(gb:make-text-initial-snip%
|
||||
(gb:make-callback-snip%
|
||||
(gb:make-text-labelled-snip% gb:atomic-snip%
|
||||
"Text")))))
|
||||
"gb:text"))
|
||||
|
||||
(register-class gb:text-snip% "gb:text")
|
||||
|
||||
(provide gb:text-snip%))
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * text_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" . . ",
|
||||
" . ",
|
||||
" XXXXXXXXX.XX ",
|
||||
" X . X ",
|
||||
" X ...... . X ",
|
||||
" X . .. . . X ",
|
||||
" X .. . X ",
|
||||
" X .. . X ",
|
||||
" X .. . .X ",
|
||||
" X .... X ",
|
||||
" X X ",
|
||||
" XXXXXXXXXXXX ",
|
||||
" ",
|
||||
" ",
|
||||
" "};
|
|
@ -1,76 +0,0 @@
|
|||
(module tool mzscheme
|
||||
(require drscheme/tool
|
||||
mred
|
||||
mzlib/unit
|
||||
mzlib/class
|
||||
string-constants
|
||||
mzlib/contract
|
||||
"top-level.rkt"
|
||||
"toolbar.rkt"
|
||||
"readable.rkt")
|
||||
|
||||
(provide tool@)
|
||||
|
||||
(define-syntax (name stx) (syntax-case stx () [(_ x e) #'(let ((x e)) x)]))
|
||||
|
||||
(define tool@
|
||||
(unit
|
||||
(import drscheme:tool^)
|
||||
(export drscheme:tool-exports^)
|
||||
(define (phase1) (void))
|
||||
(define (phase2)
|
||||
(drscheme:get/extend:extend-unit-frame
|
||||
(lambda (drs:frame%)
|
||||
(name guibuilder-frame%
|
||||
(class drs:frame%
|
||||
(inherit get-insert-menu get-edit-target-object)
|
||||
|
||||
(define toolbar #f)
|
||||
(define toolbar-shown? #f)
|
||||
|
||||
(define/override (get-definitions/interactions-panel-parent)
|
||||
(let ([p (super get-definitions/interactions-panel-parent)])
|
||||
(set! toolbar (new toolbar% [parent p][style '(deleted)]))
|
||||
(add-tools toolbar #f
|
||||
(lambda (c%)
|
||||
(let ([e (get-edit-target-object)])
|
||||
(if (e . is-a? . gb:edit%)
|
||||
(send e insert-element c%)
|
||||
(message-box
|
||||
(string-constant gui-tool-heading)
|
||||
(string-constant gui-tool-before-clicking-message)
|
||||
this
|
||||
'(ok stop))))))
|
||||
(new vertical-panel% (parent p))))
|
||||
|
||||
(define/override (add-show-menu-items menu)
|
||||
(super add-show-menu-items menu)
|
||||
(make-object menu-item%
|
||||
(string-constant gui-tool-show-gui-toolbar)
|
||||
menu
|
||||
(lambda (i e)
|
||||
(let ([p (send toolbar get-parent)])
|
||||
(if toolbar-shown?
|
||||
(send p delete-child toolbar)
|
||||
(send p change-children (lambda (l)
|
||||
(cons toolbar l))))
|
||||
(set! toolbar-shown? (not toolbar-shown?))
|
||||
(send i set-label (if toolbar-shown?
|
||||
(string-constant gui-tool-hide-gui-toolbar)
|
||||
(string-constant gui-tool-show-gui-toolbar)))))))
|
||||
|
||||
(super-new)
|
||||
|
||||
(make-object menu-item% (string-constant gui-tool-insert-gui) (get-insert-menu)
|
||||
(lambda (b e)
|
||||
(let ([e (get-edit-target-object)])
|
||||
(when e
|
||||
(let* ([gb (make-object gb:edit%)]
|
||||
[s (make-object gui-code-snip% gb)])
|
||||
(send e insert s)
|
||||
(send gb create-main-panel)
|
||||
(send gb set-caret-owner #f 'display))))))
|
||||
(inherit register-capability-menu-item)
|
||||
(register-capability-menu-item 'drscheme:special:insert-gui-tool (get-insert-menu)))))))
|
||||
|
||||
(drscheme:language:register-capability 'drscheme:special:insert-gui-tool (flat-contract boolean?) #t))))
|
|
@ -1,159 +0,0 @@
|
|||
(module toolbar mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/file
|
||||
mzlib/pretty
|
||||
mzlib/etc
|
||||
mzlib/list
|
||||
"utils.rkt")
|
||||
|
||||
;; These modules implement snips for the various
|
||||
;; kinds of windows and controls.
|
||||
(require "base.rkt"
|
||||
"panel.rkt"
|
||||
"simple-control.rkt"
|
||||
"text-field.rkt"
|
||||
"multiple-choice.rkt"
|
||||
"slider-guage.rkt"
|
||||
"canvas.rkt")
|
||||
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; Frame
|
||||
;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(define-struct tool (icon callback active?))
|
||||
|
||||
(define lg-pen (send mred:the-pen-list find-or-create-pen
|
||||
(make-object mred:color% 200 200 200) 0 'solid))
|
||||
|
||||
(define dg-pen (send mred:the-pen-list find-or-create-pen
|
||||
(make-object mred:color% 140 140 140) 0 'solid))
|
||||
|
||||
(define icons (make-hash-table))
|
||||
|
||||
(define toolbar%
|
||||
(class mred:canvas%
|
||||
(inherit min-height stretchable-height get-dc)
|
||||
(init parent [style '()])
|
||||
(private-field
|
||||
[margin 2]
|
||||
[icon-size 16]
|
||||
[tools null]
|
||||
[active-tool #f])
|
||||
(private*
|
||||
[deactivate-tool
|
||||
(lambda ()
|
||||
(when active-tool
|
||||
(set-tool-active?! active-tool #f)
|
||||
(set! active-tool #f)
|
||||
(on-paint)))]
|
||||
[activate-tool
|
||||
(lambda (mx my only)
|
||||
(let ([y 0]
|
||||
[h (+ icon-size (* 2 margin))]
|
||||
[w (+ icon-size (* 2 margin))])
|
||||
(let loop ([l tools][x 0])
|
||||
(unless (null? l)
|
||||
(if (and (<= x mx (+ x w)) (<= y my (+ y h))
|
||||
(or (not only) (eq? (car l) only)))
|
||||
(begin
|
||||
(set! active-tool (car l))
|
||||
(set-tool-active?! active-tool #t)
|
||||
(on-paint))
|
||||
(loop (cdr l) (+ x w)))))))])
|
||||
(private-field
|
||||
[can-drag #f])
|
||||
(override*
|
||||
[on-paint
|
||||
(lambda ()
|
||||
(let ([dc (get-dc)]
|
||||
[y 0]
|
||||
[h (+ icon-size (* 2 margin))]
|
||||
[w (+ icon-size (* 2 margin))])
|
||||
(let loop ([l tools][x 0])
|
||||
(unless (null? l)
|
||||
(let ([tool (car l)])
|
||||
(let ([p (send dc get-pen)]
|
||||
[on? (tool-active? tool)])
|
||||
(send dc set-pen (if on? dg-pen lg-pen))
|
||||
(send dc draw-line x y (+ x w -1) y)
|
||||
(send dc draw-line x y x (+ y h -1))
|
||||
(send dc draw-line x (add1 y) (+ x w -2) (add1 y))
|
||||
(send dc draw-line (add1 x) y (add1 x) (+ y h -2))
|
||||
(send dc set-pen (if on? lg-pen dg-pen))
|
||||
(send dc draw-line (+ x 1) (+ y h -1) (+ x w -1) (+ y h -1))
|
||||
(send dc draw-line (+ x w -1) (+ y 1) (+ x w -1) (+ y h -1))
|
||||
(send dc draw-line (+ x 2) (+ y h -2) (+ x w -2) (+ y h -2))
|
||||
(send dc draw-line (+ x w -2) (+ y 2) (+ x w -2) (+ y h -2))
|
||||
(send dc set-pen p))
|
||||
(if (tool-icon tool)
|
||||
(send dc draw-bitmap (tool-icon tool) (+ x margin) margin)
|
||||
(send dc draw-rectangle (+ x margin) margin icon-size icon-size)))
|
||||
(loop (cdr l) (+ x w))))))]
|
||||
[on-event
|
||||
(lambda (e)
|
||||
(cond
|
||||
[(send e button-down?)
|
||||
(deactivate-tool)
|
||||
(activate-tool (send e get-x) (send e get-y) #f)
|
||||
(set! can-drag active-tool)]
|
||||
[(send e button-up?)
|
||||
(set! can-drag #f)
|
||||
(when active-tool
|
||||
(let ([cb (tool-callback active-tool)])
|
||||
(deactivate-tool)
|
||||
(cb #f #f)))]
|
||||
[(send e dragging?)
|
||||
(when can-drag
|
||||
(let ([old-active active-tool])
|
||||
(set! active-tool #f)
|
||||
(activate-tool (send e get-x) (send e get-y) can-drag)
|
||||
(when (and (not active-tool) old-active)
|
||||
(set-tool-active?! old-active #f)
|
||||
(on-paint))))]
|
||||
[else (set! can-drag #f)
|
||||
(deactivate-tool)]))])
|
||||
(public*
|
||||
[append-tool
|
||||
(lambda (icon-name cb)
|
||||
(let* ([name (string->symbol icon-name)]
|
||||
[icon
|
||||
(hash-table-get
|
||||
icons name
|
||||
(lambda ()
|
||||
(let* ([icon (make-object mred:bitmap%
|
||||
(build-path (collection-path "guibuilder")
|
||||
icon-name))])
|
||||
(if (send icon ok?)
|
||||
icon
|
||||
#f))))])
|
||||
(hash-table-put! icons name icon)
|
||||
(set! tools (append tools (list (make-tool icon cb #f))))))])
|
||||
(super-new [parent parent] [style (cons 'no-focus style)])
|
||||
(min-height (+ icon-size (* margin 2)))
|
||||
(stretchable-height #f)))
|
||||
|
||||
(define (add-tools toolbar emenu insert-element)
|
||||
(let* ([append-element-type
|
||||
(lambda (name icon c%)
|
||||
(let ([maker (lambda (i e) (insert-element c%))])
|
||||
(when toolbar
|
||||
(send toolbar append-tool icon maker))
|
||||
(when emenu
|
||||
(make-object mred:menu-item% name emenu maker))))])
|
||||
(append-element-type "New Vertical Panel" "vpanel.xpm" gb:vertical-panel-snip%)
|
||||
(append-element-type "New Horizontal Panel" "hpanel.xpm" gb:horizontal-panel-snip%)
|
||||
(append-element-type "New Message Label" "message.xpm" gb:message-snip%)
|
||||
(append-element-type "New Button" "button.xpm" gb:button-snip%)
|
||||
(append-element-type "New Checkbox" "checkbox.xpm" gb:check-box-snip%)
|
||||
(append-element-type "New Text Field" "text.xpm" gb:text-snip%)
|
||||
(append-element-type "New List" "list.xpm" gb:list-box-snip%)
|
||||
(append-element-type "New Radiobox" "radiobox.xpm" gb:radio-box-snip%)
|
||||
(append-element-type "New Choice" "choice.xpm" gb:choice-snip%)
|
||||
(append-element-type "New Slider" "slider.xpm" gb:slider-snip%)
|
||||
(append-element-type "New Gauge" "gauge.xpm" gb:gauge-snip%)
|
||||
(append-element-type "New Canvas" "canvas.xpm" gb:canvas-snip%)
|
||||
(append-element-type "New Editor Canvas" "mcanvas.xpm" gb:editor-canvas-snip%)))
|
||||
|
||||
(provide toolbar%
|
||||
add-tools))
|
|
@ -1,633 +0,0 @@
|
|||
#lang racket/base
|
||||
|
||||
(require racket/class
|
||||
racket/file
|
||||
racket/gui
|
||||
racket/pretty
|
||||
racket/list
|
||||
(prefix-in mred: racket/gui)
|
||||
(prefix-in framework: framework)
|
||||
"utils.rkt"
|
||||
"base.rkt"
|
||||
"panel.rkt")
|
||||
|
||||
;; INVARIANT: If a snip is selected, then no ancestor or
|
||||
;; descendant of the snip can be selected. Otherwise, the
|
||||
;; dragging rules get complicated (perhaps impossible).
|
||||
|
||||
;; INVARIANT: a child must be ordered before its parent in the
|
||||
;; pasteboard. Not only does this affect drawing, but it also
|
||||
;; affects how select-all and rubber-banding work due to the
|
||||
;; ancestor/descendant-selection-exclusion rule.
|
||||
|
||||
(define START-FRAME-WIDTH 100)
|
||||
(define START-FRAME-HEIGHT 100)
|
||||
|
||||
;; Keep in order of choice items:
|
||||
(define FRAME-MODE 0)
|
||||
(define DIALOG-MODE 1)
|
||||
(define PANEL-MODE 2)
|
||||
|
||||
(define -FIRST-MODE- FRAME-MODE)
|
||||
(define -LAST-MODE- PANEL-MODE)
|
||||
|
||||
(define top-font (send mred:the-font-list find-or-create-font
|
||||
12 'default 'normal 'normal #f))
|
||||
|
||||
;; for use of eval on the generated code
|
||||
(define-namespace-anchor anchor)
|
||||
|
||||
(define gb:edit%
|
||||
(class mred:pasteboard%
|
||||
(inherit set-selected find-next-selected-snip insert
|
||||
find-first-snip is-selected? add-selected remove-selected
|
||||
get-admin find-snip begin-edit-sequence end-edit-sequence
|
||||
get-snip-location delete erase set-modified resize
|
||||
invalidate-bitmap-cache
|
||||
begin-write-header-footer-to-file end-write-header-footer-to-file
|
||||
get-keymap)
|
||||
(private-field
|
||||
[dragging? #f]
|
||||
[pasting? #f]
|
||||
[copying? #f]
|
||||
[cur-hilite #f]
|
||||
[cur-hilite-pos 0]
|
||||
[cur-id 1]
|
||||
[last-empty-click -inf.0])
|
||||
(public*
|
||||
[new-id (lambda ()
|
||||
(begin0
|
||||
(number->string cur-id)
|
||||
(set! cur-id (add1 cur-id))))]
|
||||
[for-each-snip
|
||||
(lambda (f)
|
||||
(let loop ([s (find-first-snip)])
|
||||
(when s
|
||||
(f s)
|
||||
(loop (send s next)))))]
|
||||
[for-each-selected-snip
|
||||
(lambda (f)
|
||||
(let loop ([s (find-next-selected-snip #f)])
|
||||
(when s
|
||||
(f s)
|
||||
(loop (find-next-selected-snip s)))))]
|
||||
[in-selected-hierarchy?
|
||||
(lambda (s)
|
||||
(or (is-selected? s)
|
||||
(let ([parent (send s gb-get-parent)])
|
||||
(and parent
|
||||
(in-selected-hierarchy? parent)))))]
|
||||
[find-unselected-snip
|
||||
(lambda (x y)
|
||||
(let ([s (find-snip x y)])
|
||||
(if (or (not s) (and (not (in-selected-hierarchy? s))
|
||||
(send s container?)))
|
||||
s
|
||||
(let loop ([s (find-first-snip)])
|
||||
(cond
|
||||
[(not s) #f]
|
||||
[(and (send s container?)
|
||||
(not (in-selected-hierarchy? s)))
|
||||
(let ([tb (box 0)]
|
||||
[lb (box 0)]
|
||||
[bb (box 0)]
|
||||
[rb (box 0)])
|
||||
(get-snip-location s lb tb #f)
|
||||
(get-snip-location s rb bb #t)
|
||||
(if (and (<= (unbox lb) x (unbox rb))
|
||||
(<= (unbox tb) y (unbox bb)))
|
||||
s
|
||||
(loop (send s next))))]
|
||||
[else (loop (send s next))])))))]
|
||||
[find-snip-by-XXX
|
||||
(lambda (id get)
|
||||
(let/ec found
|
||||
(for-each-snip
|
||||
(lambda (s)
|
||||
(when (equal? id (get s))
|
||||
(found s))))
|
||||
#f))]
|
||||
[find-snip-by-id
|
||||
(lambda (id)
|
||||
(find-snip-by-XXX id (gb-id)))]
|
||||
[find-snip-by-original-id
|
||||
(lambda (id)
|
||||
(find-snip-by-XXX id gb-original-id))]
|
||||
[find-snip-by-name
|
||||
(lambda (id)
|
||||
(find-snip-by-XXX id gb-name))]
|
||||
|
||||
[top-resized
|
||||
(lambda (snip old-w old-h w h)
|
||||
(when (eq? snip main-panel)
|
||||
(unless (= top-level-type PANEL-MODE)
|
||||
(invalidate-bitmap-cache 0 0
|
||||
(+ (max old-w w) (* 2 margin))
|
||||
(+ (max old-h h) (* 2 margin)
|
||||
(or frame-label-h 0) 2)))))])
|
||||
|
||||
(augment*
|
||||
[can-move-to?
|
||||
(lambda (snip x y dragging?)
|
||||
(or (not (eq? snip main-panel))
|
||||
(and (= x main-panel-x)
|
||||
(= y main-panel-y))))]
|
||||
[after-move-to
|
||||
(lambda (snip x y dragging?)
|
||||
(when dragging?
|
||||
(send snip gb-drag-children-along x y)))]
|
||||
[after-resize
|
||||
(lambda (snip w h did?)
|
||||
(when (and (eq? snip main-panel) did?)
|
||||
(unless (= top-level-type PANEL-MODE)
|
||||
(invalidate-bitmap-cache
|
||||
0 0 last-frame-paint-w last-frame-paint-h))))]
|
||||
[on-interactive-move
|
||||
(lambda (e)
|
||||
(set! dragging? #t)
|
||||
(for-each-snip (lambda (s) (send s gb-set-stable-position)))
|
||||
(inner (void) on-interactive-move e))]
|
||||
[on-select
|
||||
(lambda (s on?)
|
||||
(when (and (not copying?) on?)
|
||||
; deselect parents:
|
||||
(let loop ([p (send s gb-get-parent)])
|
||||
(when p
|
||||
(if (is-selected? p)
|
||||
(remove-selected p)
|
||||
(loop (send p gb-get-parent)))))
|
||||
; deselect children:
|
||||
(for-each
|
||||
(lambda (c)
|
||||
(when (is-selected? c)
|
||||
(remove-selected c)))
|
||||
(send s gb-get-children))))]
|
||||
[after-interactive-move
|
||||
(lambda (e)
|
||||
(set! dragging? #f)
|
||||
|
||||
;; Adjust parent of selected snips & move selected snip's children
|
||||
(for-each-selected-snip
|
||||
(lambda (snip)
|
||||
(when (not (eq? snip main-panel))
|
||||
(let* ([parent (send snip gb-get-parent)]
|
||||
[pos (if parent
|
||||
(send parent gb-get-child-pos snip)
|
||||
-1)])
|
||||
(if cur-hilite
|
||||
(when (or (not (eq? cur-hilite parent))
|
||||
(not (= pos cur-hilite-pos)))
|
||||
(when parent
|
||||
(send parent gb-remove-child snip))
|
||||
(send cur-hilite gb-add-child snip cur-hilite-pos)
|
||||
(set! cur-hilite-pos (add1 cur-hilite-pos)))
|
||||
(when parent
|
||||
(send parent gb-remove-child snip)
|
||||
(send snip gb-install this #f))))
|
||||
(send snip gb-need-recalc-size))))
|
||||
|
||||
(when cur-hilite
|
||||
(send cur-hilite gb-hilite #f)
|
||||
(set! cur-hilite #f))
|
||||
|
||||
(inner (void) after-interactive-move e))])
|
||||
(override*
|
||||
[interactive-adjust-move
|
||||
(lambda (snip x-box y-box)
|
||||
(super interactive-adjust-move snip x-box y-box)
|
||||
;; The following doesn't really work very well.
|
||||
#;
|
||||
(let ([parent (send snip gb-get-parent)])
|
||||
(when parent
|
||||
(let-values ([(x y w h)
|
||||
(send (let loop ([p parent])
|
||||
(let ([parent (send p gb-get-parent)])
|
||||
(if parent
|
||||
(loop parent)
|
||||
p)))
|
||||
gb-get-position-and-size)])
|
||||
(when (and (<= x (unbox x-box) (+ x w))
|
||||
(<= y (unbox y-box) (+ y h)))
|
||||
(set-box! x-box (send snip gb-get-stable-x))
|
||||
(set-box! y-box (send snip gb-get-stable-y)))))))]
|
||||
[interactive-adjust-resize
|
||||
(lambda (snip wb hb)
|
||||
(super interactive-adjust-resize snip wb hb)
|
||||
(let-values ([(x-min y-min) (send snip gb-get-saved-min-size)])
|
||||
(when (or (not (gb-x-stretch? snip))
|
||||
(<= (unbox wb) x-min))
|
||||
(set-box! wb x-min))
|
||||
(when (or (not (gb-y-stretch? snip))
|
||||
(<= (unbox hb) y-min))
|
||||
(set-box! hb y-min))))])
|
||||
(augment*
|
||||
[after-interactive-resize
|
||||
(lambda (snip)
|
||||
(inner (void) after-interactive-resize snip)
|
||||
(send snip gb-need-recalc-size))])
|
||||
(override*
|
||||
[on-default-event
|
||||
(lambda (e)
|
||||
(unless dragging?
|
||||
(when (send e button-down?)
|
||||
(unless (find-next-selected-snip #f)
|
||||
(when ((- (send e get-time-stamp) last-empty-click)
|
||||
. < .
|
||||
(send (get-keymap) get-double-click-interval))
|
||||
(open-dialog))
|
||||
(set! last-empty-click (send e get-time-stamp)))))
|
||||
(when dragging?
|
||||
(let ([x (send e get-x)]
|
||||
[y (send e get-y)]
|
||||
[xb (box 0)]
|
||||
[yb (box 0)])
|
||||
(send (get-admin) get-dc xb yb)
|
||||
(let ([lx (+ x (unbox xb))]
|
||||
[ly (+ y (unbox yb))])
|
||||
(let ([s (find-unselected-snip lx ly)])
|
||||
(when s
|
||||
(set! cur-hilite-pos (send s gb-find-position lx ly)))
|
||||
(when (and (or cur-hilite s)
|
||||
(not (eq? cur-hilite s)))
|
||||
(begin-edit-sequence)
|
||||
(when cur-hilite
|
||||
(send cur-hilite gb-hilite #f)
|
||||
(set! cur-hilite #f))
|
||||
(when s
|
||||
(set! cur-hilite s)
|
||||
(send s gb-hilite #t))
|
||||
(end-edit-sequence))))))
|
||||
(super on-default-event e))]
|
||||
[on-double-click
|
||||
(lambda (snip e)
|
||||
(send snip gb-open-dialog))])
|
||||
(augment*
|
||||
[after-delete
|
||||
(lambda (snip)
|
||||
(for-each (lambda (i) (delete i)) (send snip gb-get-children))
|
||||
(let ([parent (send snip gb-get-parent)])
|
||||
(when parent
|
||||
(send parent gb-remove-child snip)))
|
||||
(inner (void) after-delete snip))]
|
||||
[can-insert?
|
||||
(lambda (snip before x y)
|
||||
(is-a? snip gb:snip%))]
|
||||
[after-insert
|
||||
(lambda (snip behind x y)
|
||||
(when pasting?
|
||||
(dynamic-wind
|
||||
(lambda () (set! pasting? #f))
|
||||
(lambda () (send snip gb-install this #f))
|
||||
(lambda () (set! pasting? #t))))
|
||||
(inner (void) after-insert snip behind x y))])
|
||||
(private*
|
||||
[do-generic-paste
|
||||
(lambda (time super-call)
|
||||
(dynamic-wind
|
||||
(lambda () (set! pasting? #t))
|
||||
(lambda () (super-call time))
|
||||
(lambda () (set! pasting? #f)))
|
||||
(let ([a-paste #f])
|
||||
(for-each-snip
|
||||
(lambda (s)
|
||||
(unless a-paste
|
||||
(let ([oi (gb-original-id s)])
|
||||
(when oi
|
||||
(set! a-paste s))))))
|
||||
(handle-new-arrivals)
|
||||
(when a-paste
|
||||
(let ([top-paste (let loop ([a-paste a-paste])
|
||||
(let ([p (send a-paste gb-get-parent)])
|
||||
(if p
|
||||
(loop p)
|
||||
a-paste)))])
|
||||
(send main-panel gb-add-child top-paste)
|
||||
(set-selected top-paste)))))])
|
||||
(override*
|
||||
[do-paste
|
||||
(lambda (time)
|
||||
(do-generic-paste time (lambda (time) (super do-paste time))))]
|
||||
[do-paste-x-selection
|
||||
(lambda (time)
|
||||
(do-generic-paste time (lambda (time) (super do-paste-x-selection time))))])
|
||||
(public*
|
||||
[handle-new-arrivals
|
||||
(lambda ()
|
||||
(let loop ()
|
||||
((let/ec k
|
||||
(for-each-snip
|
||||
(lambda (s)
|
||||
(when (send s gb-reconnect-to-original-children)
|
||||
(k loop))))
|
||||
void)))
|
||||
(for-each-snip (lambda (s) (send s gb-forget-original-id))))])
|
||||
(override*
|
||||
[do-copy
|
||||
(lambda (time delete?)
|
||||
(dynamic-wind
|
||||
(lambda () (set! copying? #t))
|
||||
(lambda ()
|
||||
(when (find-next-selected-snip #f)
|
||||
(letrec ([selected
|
||||
(let loop ([s (find-next-selected-snip #f)])
|
||||
(let ([next (find-next-selected-snip s)])
|
||||
(if next
|
||||
(cons s (loop next))
|
||||
(list s))))]
|
||||
[close-selected
|
||||
(lambda (method)
|
||||
(lambda (s)
|
||||
(for-each
|
||||
(lambda (child)
|
||||
(method child)
|
||||
((close-selected method) child))
|
||||
(send s gb-get-children))))])
|
||||
(for-each (close-selected (lambda (x) (add-selected x))) selected)
|
||||
(super do-copy time delete?)
|
||||
(for-each (close-selected (lambda (x) (remove-selected x))) selected))))
|
||||
(lambda () (set! copying? #f))))])
|
||||
(public*
|
||||
[get-selected-snip
|
||||
(lambda ()
|
||||
(let ([s (find-next-selected-snip #f)])
|
||||
(if (or (not s)
|
||||
(not (find-next-selected-snip s)))
|
||||
main-panel
|
||||
s)))]
|
||||
[insert-element
|
||||
(lambda (c%)
|
||||
(let* ([i (make-object c%)]
|
||||
[se (get-selected-snip)]
|
||||
[s (if (send se container?)
|
||||
se
|
||||
(or (gb-parent se)
|
||||
main-panel))])
|
||||
(send s gb-add-child i)
|
||||
(set-selected s)))])
|
||||
(init-field
|
||||
[auto-show? #t]
|
||||
[top-level-type FRAME-MODE]
|
||||
[frame-label "Frame"]
|
||||
[top-name "top"])
|
||||
(private-field
|
||||
[frame-label-w #f]
|
||||
[frame-label-h #f]
|
||||
[last-frame-paint-w 0]
|
||||
[last-frame-paint-h 0]
|
||||
[main-panel-x 0]
|
||||
[main-panel-y 0]
|
||||
[margin 2]
|
||||
[configure-frame #f])
|
||||
(public*
|
||||
[get-top-level-type
|
||||
(lambda () top-level-type)]
|
||||
[get-auto-show
|
||||
(lambda () auto-show?)]
|
||||
[get-frame-label
|
||||
(lambda () frame-label)]
|
||||
[open-dialog
|
||||
(lambda ()
|
||||
(unless configure-frame
|
||||
(set! configure-frame (make-object
|
||||
(class mred:frame%
|
||||
(augment*
|
||||
[on-close
|
||||
(lambda ()
|
||||
(set! configure-frame #f)
|
||||
(inner (void) on-close))])
|
||||
(super-new))
|
||||
"Output"))
|
||||
(let ([p (make-object mred:vertical-panel% configure-frame)])
|
||||
(send p set-alignment 'left 'center)
|
||||
(letrec ([update-frame
|
||||
(lambda ()
|
||||
(send main-panel gb-need-recalc-size)
|
||||
(invalidate-bitmap-cache 0 0 'end 'end))]
|
||||
[kind-choice
|
||||
(make-object mred:choice%
|
||||
"Output:"
|
||||
'("Frame" "Dialog" "Panel")
|
||||
p
|
||||
(lambda (c e)
|
||||
(let ([mode (send c get-selection)])
|
||||
(set! top-level-type mode)
|
||||
(send frame-stuff enable (< mode PANEL-MODE))
|
||||
(update-frame))))]
|
||||
[frame-stuff (make-object mred:vertical-panel% p)]
|
||||
[name-text (make-one-line/callback-edit
|
||||
frame-stuff
|
||||
"Scheme Name:"
|
||||
(lambda (txt)
|
||||
(set! top-name txt))
|
||||
top-name)]
|
||||
[title-text (make-one-line/callback-edit
|
||||
frame-stuff
|
||||
"Frame Title:"
|
||||
(lambda (txt)
|
||||
(unless (string=? frame-label txt)
|
||||
(set! frame-label txt)
|
||||
(let ([w frame-label-w]
|
||||
[h frame-label-h])
|
||||
(set! frame-label-h #f)
|
||||
(update-frame))))
|
||||
frame-label)]
|
||||
[auto-show-check (make-object mred:check-box%
|
||||
"Show Automatically" frame-stuff
|
||||
(lambda (c e)
|
||||
(set! auto-show? (send c get-value))))])
|
||||
(send frame-stuff set-alignment 'left 'center)
|
||||
(send frame-stuff enable (< top-level-type PANEL-MODE))
|
||||
(send kind-choice stretchable-width #f)
|
||||
(send kind-choice set-selection top-level-type)
|
||||
(send auto-show-check set-value auto-show?))))
|
||||
(send configure-frame show #t))]
|
||||
[get-main-location
|
||||
(lambda (snip dc dx dy)
|
||||
(when (eq? snip main-panel)
|
||||
(if (= top-level-type PANEL-MODE)
|
||||
(begin
|
||||
(set! main-panel-x 0)
|
||||
(set! main-panel-y 0))
|
||||
(begin
|
||||
(unless frame-label-h
|
||||
(let-values ([(w h d a) (send dc get-text-extent
|
||||
frame-label top-font)])
|
||||
(set! frame-label-w w)
|
||||
(set! frame-label-h h)))
|
||||
(set! main-panel-x margin)
|
||||
(set! main-panel-y (+ frame-label-h 2 margin))))
|
||||
(set-box! dx main-panel-x)
|
||||
(set-box! dy main-panel-y)))])
|
||||
(override*
|
||||
[on-paint
|
||||
(lambda (pre? dc l t r b dx dy show-caret?)
|
||||
(unless (or (not pre?) (= top-level-type PANEL-MODE)
|
||||
(not main-panel))
|
||||
(let ([tb (box 0)]
|
||||
[lb (box 0)]
|
||||
[bb (box 0)]
|
||||
[rb (box 0)])
|
||||
(get-snip-location main-panel lb tb #f)
|
||||
(get-snip-location main-panel rb bb #t)
|
||||
(let* ([w (- (unbox rb) (unbox lb))]
|
||||
[h (- (unbox bb) (unbox tb))]
|
||||
[th (+ (or frame-label-h 0) 2)]
|
||||
[tw (+ (* 2 margin) w)]
|
||||
[totalh (+ th (* 2 margin) h)])
|
||||
(when (and (or (<= 0 l tw) (<= 0 r tw) (<= l 0 tw r))
|
||||
(or (<= 0 t totalh) (<= 0 b totalh) (<= t 0 totalh b)))
|
||||
(set! last-frame-paint-w tw)
|
||||
(set! last-frame-paint-h totalh)
|
||||
(send dc draw-rectangle dx dy
|
||||
tw totalh)
|
||||
(send dc draw-line dx (+ dy th)
|
||||
(+ dx tw -1) (+ dy th))
|
||||
(with-clipping-region
|
||||
dc (add1 dx) (add1 dy)
|
||||
(+ tw -2) (- th 2)
|
||||
(lambda ()
|
||||
(let ([f (send dc get-font)])
|
||||
(send dc set-font f)
|
||||
(send dc draw-text frame-label
|
||||
(+ dx (/ (- tw (or frame-label-w 0)) 2))
|
||||
(+ dy 1))
|
||||
(send dc set-font f)))))))))]
|
||||
[write-footers-to-file
|
||||
(lambda (stream)
|
||||
(super write-footers-to-file stream)
|
||||
(let ([out (lambda (name val)
|
||||
(let ([info (box 0)])
|
||||
(begin-write-header-footer-to-file stream name info)
|
||||
(send stream put val)
|
||||
(end-write-header-footer-to-file stream (unbox info))))])
|
||||
(out "gb:mode" top-level-type)
|
||||
(out "gb:title-utf8" (string->bytes/utf-8 frame-label))
|
||||
(out "gb:top-name-utf8" (string->bytes/utf-8 top-name))
|
||||
(out "gb:show" (if auto-show? 1 0))))]
|
||||
[read-footer-from-file
|
||||
(lambda (stream kind)
|
||||
(cond
|
||||
[(string=? kind "gb:mode")
|
||||
(set! top-level-type
|
||||
(min -LAST-MODE-
|
||||
(max -FIRST-MODE- (send stream get-exact))))]
|
||||
[(string=? kind "gb:title")
|
||||
(set! frame-label (bytes->string/latin-1 (send stream get-bytes)))]
|
||||
[(string=? kind "gb:title-utf8")
|
||||
(set! frame-label (bytes->string/utf-8 (send stream get-bytes)))]
|
||||
[(string=? kind "gb:top-name-utf8")
|
||||
(set! top-name (bytes->string/latin-1 (send stream get-bytes)))]
|
||||
[(string=? kind "gb:top-name")
|
||||
(set! top-name (bytes->string/utf-8 (send stream get-bytes)))]
|
||||
[(string=? kind "gb:show")
|
||||
(set! auto-show? (positive? (send stream get-exact)))]
|
||||
[else (super read-footer-from-file stream kind)]))]
|
||||
[copy-self-to (lambda (e)
|
||||
(send e prepare-to-load)
|
||||
(super copy-self-to e)
|
||||
(send e done-loading #t))]
|
||||
[copy-self (lambda ()
|
||||
(let ([e (new gb:edit%
|
||||
[auto-show? auto-show?]
|
||||
[top-level-type top-level-type]
|
||||
[frame-label frame-label]
|
||||
[top-name top-name])])
|
||||
(copy-self-to e)
|
||||
e))])
|
||||
(private-field
|
||||
[main-panel #f])
|
||||
(public*
|
||||
[get-main-panel (lambda () main-panel)]
|
||||
[create-main-panel
|
||||
(lambda ()
|
||||
(erase)
|
||||
(set! main-panel (make-object gb:panel-snip%))
|
||||
(insert main-panel 0 0)
|
||||
(resize main-panel START-FRAME-WIDTH START-FRAME-HEIGHT)
|
||||
(send main-panel gb-install this #f)
|
||||
(send main-panel set-id "0")
|
||||
(send main-panel gb-need-recalc-size)
|
||||
(set-modified #f))])
|
||||
(public*
|
||||
[prepare-to-load
|
||||
(lambda ()
|
||||
(set! pasting? #t))]
|
||||
[done-loading
|
||||
(lambda (ok?)
|
||||
(set! pasting? #f)
|
||||
(when ok?
|
||||
(set! main-panel (find-snip-by-original-id "0"))
|
||||
(send main-panel set-id "0")
|
||||
(handle-new-arrivals)
|
||||
(set-modified #f)))])
|
||||
(augment*
|
||||
[on-load-file
|
||||
(lambda (file mode)
|
||||
(prepare-to-load))]
|
||||
[after-load-file
|
||||
(lambda (ok?)
|
||||
(done-loading ok?))])
|
||||
|
||||
;; Code generation:
|
||||
(public*
|
||||
[instantiate
|
||||
(lambda ()
|
||||
(let ([code (build-code #t #f)])
|
||||
(thread
|
||||
(lambda ()
|
||||
(parameterize ([mred:current-eventspace (mred:make-eventspace)]
|
||||
[current-namespace (namespace-anchor->namespace anchor)])
|
||||
(eval code))))))]
|
||||
[view-source
|
||||
(lambda ()
|
||||
(let ([port (open-output-string)])
|
||||
(pretty-print (build-code #f #f) port)
|
||||
(let ([f (make-object (framework:frame:text-mixin framework:frame:editor%)
|
||||
"code.scm")])
|
||||
(send (send f get-editor) insert (get-output-string port))
|
||||
(send f show #t))))]
|
||||
[build-code
|
||||
(lambda (force-frame? as-class?)
|
||||
(let* ([main (get-main-panel)]
|
||||
[type (get-top-level-type)]
|
||||
[frame-label (if (and (= type PANEL-MODE) force-frame?)
|
||||
"Panel Tester"
|
||||
(get-frame-label))]
|
||||
[mode (make-output-mode as-class? force-frame?)]
|
||||
[top (string->symbol top-name)])
|
||||
`(,@(cond
|
||||
[as-class? '(class object%)]
|
||||
[(and (= type PANEL-MODE)
|
||||
(not force-frame?))
|
||||
'(lambda (top))]
|
||||
[else '(begin)])
|
||||
,@(if as-class?
|
||||
(if (and (= type PANEL-MODE) (not force-frame?))
|
||||
'((init top))
|
||||
'())
|
||||
'())
|
||||
,@(cond
|
||||
[(or (= type FRAME-MODE)
|
||||
(and (= type PANEL-MODE) force-frame?))
|
||||
(if as-class?
|
||||
`((public* [get-top% (lambda () frame%)])
|
||||
(field [,top (make-object (get-top%) ,frame-label)]))
|
||||
`((define ,top (make-object frame% ,frame-label))))]
|
||||
[(= type PANEL-MODE) null]
|
||||
[else
|
||||
(if as-class?
|
||||
`((public* [get-top% (lambda () dialog%)])
|
||||
(field [,top (make-object (get-top%) ,frame-label)]))
|
||||
`((define ,top (make-object dialog% ,frame-label))))])
|
||||
,@(send main gb-instantiate 'top mode)
|
||||
,@(if as-class?
|
||||
'((super-new))
|
||||
null)
|
||||
,@(if (and (not force-frame?)
|
||||
(or (= type PANEL-MODE) (not (get-auto-show))))
|
||||
null
|
||||
`((send ,top show #t))))))])
|
||||
|
||||
(super-new)))
|
||||
|
||||
(provide gb:edit%)
|
|
@ -1,101 +0,0 @@
|
|||
|
||||
(module utils mzscheme
|
||||
(require (prefix mred: mred)
|
||||
mzlib/class
|
||||
mzlib/etc
|
||||
mzlib/list)
|
||||
|
||||
(define-syntax (private-field stx)
|
||||
(syntax-case stx ()
|
||||
[(_ (id val) ...)
|
||||
(syntax/loc stx (begin (define id val) ...))]))
|
||||
|
||||
(define make-one-line/callback-edit
|
||||
(opt-lambda (parent label cb [v ""])
|
||||
(make-object mred:text-field% label parent
|
||||
(lambda (t e) (cb (send t get-value))) v)))
|
||||
|
||||
(define make-number-control
|
||||
(lambda (parent label value get-min get-max set-v)
|
||||
(let* ([p (make-object mred:horizontal-panel% parent)]
|
||||
[l (make-object mred:message% label p)]
|
||||
[vl (make-object mred:message% "999999" p)]
|
||||
[set-value
|
||||
(lambda (n)
|
||||
(set! value n)
|
||||
(send vl set-label (number->string n))
|
||||
(set-v n))]
|
||||
[b (make-object mred:button%
|
||||
"Set..."
|
||||
p
|
||||
(lambda (b e)
|
||||
(let ([v (mred:get-text-from-user
|
||||
(format "~a, in [~a, ~a]:" label (get-min) (get-max))
|
||||
label
|
||||
#f
|
||||
(number->string value))])
|
||||
(when v
|
||||
(let ([n (string->number v)])
|
||||
(if (and (integer? n) (exact? n)
|
||||
(>= n (get-min)) (<= n (get-max)))
|
||||
(set-value n)
|
||||
(mred:message-box "Error" "Bad value")))))))])
|
||||
(send vl set-label (number->string value))
|
||||
(make-object (class object% ()
|
||||
(public*
|
||||
[get-val (lambda () value)]
|
||||
[check (lambda ()
|
||||
(when (< value (get-min))
|
||||
(set-value (get-min)))
|
||||
(when (> value (get-max))
|
||||
(set-value (get-max))))])
|
||||
(super-new))))))
|
||||
|
||||
(define new-name (lambda (base) (symbol->string (gensym base))))
|
||||
|
||||
(define (stream-write-list stream l)
|
||||
(send stream put (length l))
|
||||
(for-each
|
||||
(lambda (i)
|
||||
(send stream put (string->bytes/utf-8 i)))
|
||||
l))
|
||||
|
||||
(define (get-bytes->string version)
|
||||
(if (version . >= . 5)
|
||||
bytes->string/utf-8
|
||||
bytes->string/latin-1))
|
||||
|
||||
(define (stream-read-list stream version)
|
||||
(let ([n (send stream get-exact)]
|
||||
[b->s (get-bytes->string version)])
|
||||
(let loop ([n n])
|
||||
(if (zero? n)
|
||||
null
|
||||
(cons (b->s (send stream get-bytes)) (loop (sub1 n)))))))
|
||||
|
||||
(define cached-region #f)
|
||||
(define cached-region-dc #f)
|
||||
|
||||
(define (with-clipping-region dc x y w h thunk)
|
||||
(let ([r (send dc get-clipping-region)]
|
||||
[r2 (if (eq? dc cached-region-dc)
|
||||
cached-region
|
||||
(make-object mred:region% dc))])
|
||||
(set! cached-region-dc #f)
|
||||
(send r2 set-rectangle x y w h)
|
||||
(send r2 intersect r)
|
||||
(send dc set-clipping-region r2)
|
||||
(thunk)
|
||||
(send dc set-clipping-region r)
|
||||
(set! cached-region r2)
|
||||
(set! cached-region-dc dc)))
|
||||
|
||||
(provide private-field
|
||||
make-one-line/callback-edit
|
||||
make-number-control
|
||||
new-name
|
||||
get-bytes->string
|
||||
stream-write-list
|
||||
stream-read-list
|
||||
with-clipping-region))
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
/* XPM */
|
||||
static char * vpanel_xpm[] = {
|
||||
"16 16 3 1",
|
||||
" c #FFFFFFFFFFFF",
|
||||
". c #000000000000",
|
||||
"X c #A0A0A0A0A0A0",
|
||||
" ",
|
||||
" .......... ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" . XXXX . ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" . XXXX . ",
|
||||
" . XXXX . ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" . XXXX . ",
|
||||
" . . ",
|
||||
" . . ",
|
||||
" .......... ",
|
||||
" "};
|
Loading…
Reference in New Issue
Block a user