moved to unit/s and new mred initialization system

original commit: 8e5bc8572fb3e75a962b5f5314f53ea9b6fff100
This commit is contained in:
Robby Findler 1996-06-15 20:39:16 +00:00
parent ace788472e
commit ab53e9de2f
4 changed files with 1506 additions and 1500 deletions

View File

@ -1,374 +1,377 @@
(define-sigfunctor (mred:edit@ mred:edit^) (define mred:edit@
(import mred:debug^ mred:finder^ mred:path-utils^ mred:mode^ (unit/s mred:edit^
mred:scheme-paren^ mred:keymap^ mzlib:function^) (import [mred:debug mred:debug^] [mred:finder mred:finder^]
[mred:path-utils mred:path-utils^] [mred:mode mred:mode^]
[mred:scheme-paren mred:scheme-paren^] [mred:keymap mred:keymap^]
[mzlib:function mzlib:function^])
(define-struct range (start end pen brush)) (define-struct range (start end pen brush))
(define-struct rectangle (left top width height pen brush)) (define-struct rectangle (left top width height pen brush))
(define make-std-buffer% (define make-std-buffer%
(lambda (buffer%) (lambda (buffer%)
(class buffer% args (class buffer% args
(inherit modified? get-filename save-file set-max-width) (inherit modified? get-filename save-file set-max-width)
(rename (rename
[super-set-filename set-filename] [super-set-filename set-filename]
[super-set-modified set-modified] [super-set-modified set-modified]
[super-on-change on-change] [super-on-change on-change]
[super-on-save-file on-save-file]) [super-on-save-file on-save-file])
(private (private
[auto-saved-name #f] [auto-saved-name #f]
[auto-save-out-of-date? #t] [auto-save-out-of-date? #t]
[auto-save-error? #f]) [auto-save-error? #f])
(public (public
[get-file (lambda (d) (let ([v (mred:finder^:get-file d)]) [get-file (lambda (d) (let ([v (mred:finder:get-file d)])
(if v (if v
v v
'())))] '())))]
[put-file (lambda (d f) (let ([v (mred:finder^:put-file f d)]) [put-file (lambda (d f) (let ([v (mred:finder:put-file f d)])
(if v (if v
v v
'())))] '())))]
[auto-set-wrap? #f] [auto-set-wrap? #f]
[set-auto-set-wrap [set-auto-set-wrap
(lambda (v) (lambda (v)
(set! auto-set-wrap? v) (set! auto-set-wrap? v)
(if (not v) (if (not v)
(set-max-width -1)))] (set-max-width -1)))]
[active-canvas #f] [active-canvas #f]
[set-active-canvas [set-active-canvas
(lambda (c) (lambda (c)
(set! active-canvas c))] (set! active-canvas c))]
[canvases '()] [canvases '()]
[add-canvas [add-canvas
(lambda (canvas) (lambda (canvas)
(set! canvases (cons canvas canvases)))] (set! canvases (cons canvas canvases)))]
[remove-canvas [remove-canvas
(lambda (canvas) (lambda (canvas)
(set! canvases (mzlib:function^:remove canvas canvases)))] (set! canvases (mzlib:function:remove canvas canvases)))]
[mode #f] [mode #f]
[set-mode [set-mode
(lambda (m) (lambda (m)
#f)] #f)]
[set-modified [set-modified
(lambda (modified?) (lambda (modified?)
(if auto-saved-name (if auto-saved-name
(if (not modified?) (if (not modified?)
(begin (begin
(delete-file auto-saved-name) (delete-file auto-saved-name)
(set! auto-saved-name #f)) (set! auto-saved-name #f))
(set! auto-save-out-of-date? #t))) (set! auto-save-out-of-date? #t)))
(super-set-modified modified?) (super-set-modified modified?)
(for-each (lambda (canvas) (send canvas edit-modified modified?)) (for-each (lambda (canvas) (send canvas edit-modified modified?))
canvases))] canvases))]
[set-filename [set-filename
(opt-lambda (name [temp? #f]) (opt-lambda (name [temp? #f])
(super-set-filename name temp?) (super-set-filename name temp?)
(for-each (lambda (canvas) (send canvas edit-renamed name)) (for-each (lambda (canvas) (send canvas edit-renamed name))
canvases))] canvases))]
[on-change [on-change
(lambda () (lambda ()
(super-on-change) (super-on-change)
(set! auto-save-out-of-date? #t))] (set! auto-save-out-of-date? #t))]
[auto-save? #t] [auto-save? #t]
[do-autosave [do-autosave
(lambda () (lambda ()
(when (and auto-save? (when (and auto-save?
(not auto-save-error?) (not auto-save-error?)
(modified?) (modified?)
(or (not auto-saved-name) (or (not auto-saved-name)
auto-save-out-of-date?)) auto-save-out-of-date?))
(let* ([orig-name (get-filename)] (let* ([orig-name (get-filename)]
[auto-name (mred:path-utils^:generate-autosave-name orig-name)] [auto-name (mred:path-utils:generate-autosave-name orig-name)]
[success (save-file auto-name wx:const-media-ff-copy)]) [success (save-file auto-name wx:const-media-ff-copy)])
(if success (if success
(begin (begin
(if auto-saved-name (if auto-saved-name
(delete-file auto-saved-name)) (delete-file auto-saved-name))
(set! auto-saved-name auto-name) (set! auto-saved-name auto-name)
(set! auto-save-out-of-date? #f)) (set! auto-save-out-of-date? #f))
(begin (begin
(wx:message-box (wx:message-box
(format "Error autosaving ~s.~n~a~n~a" (format "Error autosaving ~s.~n~a~n~a"
(if (null? orig-name) "Untitled" orig-name) (if (null? orig-name) "Untitled" orig-name)
"Autosaving is turned off" "Autosaving is turned off"
"until the file is saved.") "until the file is saved.")
"Warning") "Warning")
(set! auto-save-error? #t))))))] (set! auto-save-error? #t))))))]
[remove-autosave [remove-autosave
(lambda () (lambda ()
(when auto-saved-name (when auto-saved-name
(delete-file auto-saved-name) (delete-file auto-saved-name)
(set! auto-saved-name #f)))] (set! auto-saved-name #f)))]
[backup? #t] [backup? #t]
[on-save-file [on-save-file
(lambda (name format) (lambda (name format)
(set! auto-save-error? #f) (set! auto-save-error? #f)
(if (super-on-save-file name format) (if (super-on-save-file name format)
(begin (begin
(if (and backup? (if (and backup?
(not (= format wx:const-media-ff-copy))) (not (= format wx:const-media-ff-copy)))
(if (file-exists? name) (if (file-exists? name)
(let ([back-name (mred:path-utils^:generate-backup-name name)]) (let ([back-name (mred:path-utils:generate-backup-name name)])
(unless (file-exists? back-name) (unless (file-exists? back-name)
(rename-file name back-name))))) (rename-file name back-name)))))
#t) #t)
#f))] #f))]
[get-canvas [get-canvas
(lambda () (lambda ()
(cond (cond
[(and active-canvas [(and active-canvas
(member active-canvas canvases)) (member active-canvas canvases))
active-canvas] active-canvas]
[(null? canvases) #f] [(null? canvases) #f]
[else (car canvases)]))] [else (car canvases)]))]
[get-frame [get-frame
(lambda () (lambda ()
(let ([c (get-canvas)]) (let ([c (get-canvas)])
(if c (if c
(let ([f (send c get-parent)]) (let ([f (send c get-parent)])
(if (null? f) (if (null? f)
#f #f
f)) f))
#f)))]) #f)))])
(sequence (sequence
(apply super-init args))))) (apply super-init args)))))
(define edits% (define edits%
(class-asi wx:snip% (class-asi wx:snip%
(private (private
[edits null]) [edits null])
(public (public
[add [add
(lambda (edit) (lambda (edit)
(unless (let loop ([e edits]) (unless (let loop ([e edits])
(cond (cond
[(null? e) #f] [(null? e) #f]
[else (if (eq? this (car e)) [else (if (eq? this (car e))
#t #t
(loop (cdr e)))])) (loop (cdr e)))]))
(set! edits (cons edit edits))))]))) (set! edits (cons edit edits))))])))
(define edits (make-object edits%)) (define edits (make-object edits%))
(define make-edit% (define make-edit%
(lambda (super%) (lambda (super%)
(class (make-std-buffer% super%) args (class (make-std-buffer% super%) args
(inherit mode canvases (inherit mode canvases
invalidate-bitmap-cache invalidate-bitmap-cache
begin-edit-sequence end-edit-sequence begin-edit-sequence end-edit-sequence
flash-on get-keymap get-start-position flash-on get-keymap get-start-position
on-default-char on-default-event on-default-char on-default-event
set-file-format get-style-list) set-file-format get-style-list)
(rename [super-on-focus on-focus] (rename [super-on-focus on-focus]
[super-on-paint on-paint] [super-on-paint on-paint]
[super-on-local-event on-local-event] [super-on-local-event on-local-event]
[super-on-local-char on-local-char] [super-on-local-char on-local-char]
[super-after-set-position after-set-position] [super-after-set-position after-set-position]
[super-on-edit-sequence on-edit-sequence] [super-on-edit-sequence on-edit-sequence]
[super-on-change-style on-change-style] [super-on-change-style on-change-style]
[super-on-insert on-insert] [super-on-insert on-insert]
[super-on-delete on-delete] [super-on-delete on-delete]
[super-on-set-size-constraint on-set-size-constraint] [super-on-set-size-constraint on-set-size-constraint]
[super-after-edit-sequence after-edit-sequence] [super-after-edit-sequence after-edit-sequence]
[super-after-change-style after-change-style] [super-after-change-style after-change-style]
[super-after-insert after-insert] [super-after-insert after-insert]
[super-after-delete after-delete] [super-after-delete after-delete]
[super-after-set-size-constraint after-set-size-constraint]) [super-after-set-size-constraint after-set-size-constraint])
(public (public
[set-mode [set-mode
(lambda (m) (lambda (m)
(if mode (if mode
(send mode deinstall this)) (send mode deinstall this))
(if (is-a? m mred:mode^:mode%) (if (is-a? m mred:mode:mode%)
(begin (begin
(set! mode m) (set! mode m)
(set-file-format (ivar m file-format)) (set-file-format (ivar m file-format))
(send (send (get-style-list) (send (send (get-style-list)
find-named-style "Standard") find-named-style "Standard")
set-delta (ivar m standard-style-delta)) set-delta (ivar m standard-style-delta))
(send m install this)) (send m install this))
(begin (begin
(set! mode #f) (set! mode #f)
(send (send (get-style-list) (send (send (get-style-list)
find-named-style "Standard") find-named-style "Standard")
set-delta (make-object wx:style-delta%)))))] set-delta (make-object wx:style-delta%)))))]
[on-focus [on-focus
(lambda (on?) (lambda (on?)
(super-on-focus on?) (super-on-focus on?)
(when mode (when mode
(send mode on-focus this on?)))] (send mode on-focus this on?)))]
[on-local-event [on-local-event
(lambda (mouse) (lambda (mouse)
(if (or (not mode) (if (or (not mode)
(not (send mode on-event this mouse))) (not (send mode on-event this mouse)))
(super-on-local-event mouse)))] (super-on-local-event mouse)))]
[on-insert [on-insert
(lambda (start len) (lambda (start len)
(if (or (not mode) (send mode on-insert this start len)) (if (or (not mode) (send mode on-insert this start len))
(super-on-insert start len)))] (super-on-insert start len)))]
[on-delete [on-delete
(lambda (start len) (lambda (start len)
(if (or (not mode) (send mode on-delete this start len)) (if (or (not mode) (send mode on-delete this start len))
(super-on-delete start len)))] (super-on-delete start len)))]
[on-change-style [on-change-style
(lambda (start len) (lambda (start len)
(if (or (not mode) (send mode on-change-style this start len)) (if (or (not mode) (send mode on-change-style this start len))
(super-on-change-style start len)))] (super-on-change-style start len)))]
[on-edit-sequence [on-edit-sequence
(lambda () (lambda ()
(when mode (when mode
(send mode on-edit-sequence this)) (send mode on-edit-sequence this))
(super-on-edit-sequence))] (super-on-edit-sequence))]
[on-set-size-constraint [on-set-size-constraint
(lambda () (lambda ()
(if (or (not mode) (send mode on-set-size-constraint this)) (if (or (not mode) (send mode on-set-size-constraint this))
(super-on-set-size-constraint)))] (super-on-set-size-constraint)))]
[after-insert [after-insert
(lambda (start len) (lambda (start len)
(if mode (send mode after-insert this start len)) (if mode (send mode after-insert this start len))
(super-after-insert start len))] (super-after-insert start len))]
[after-delete [after-delete
(lambda (start len) (lambda (start len)
(if mode (send mode after-delete this start len)) (if mode (send mode after-delete this start len))
(super-after-delete start len))] (super-after-delete start len))]
[after-change-style [after-change-style
(lambda (start len) (lambda (start len)
(when mode (send mode after-change-style this start len)) (when mode (send mode after-change-style this start len))
(super-after-change-style start len))] (super-after-change-style start len))]
[after-edit-sequence [after-edit-sequence
(lambda () (lambda ()
(when mode (when mode
(send mode after-edit-sequence this)) (send mode after-edit-sequence this))
(super-after-edit-sequence))] (super-after-edit-sequence))]
[after-set-size-constraint [after-set-size-constraint
(lambda () (lambda ()
(when mode (when mode
(send mode after-set-size-constraint this)) (send mode after-set-size-constraint this))
(super-after-set-size-constraint))] (super-after-set-size-constraint))]
[after-set-position [after-set-position
(lambda () (lambda ()
(when mode (when mode
(send mode after-set-position this)) (send mode after-set-position this))
(super-after-set-position))] (super-after-set-position))]
[ranges null] [ranges null]
[add-range [add-range
(lambda (start end pen brush) (lambda (start end pen brush)
(let ([l (make-range start end pen brush)]) (let ([l (make-range start end pen brush)])
(set! ranges (cons l ranges)) (set! ranges (cons l ranges))
(recompute-range-rectangles) (recompute-range-rectangles)
(lambda () (set! ranges (lambda () (set! ranges
(let loop ([r ranges]) (let loop ([r ranges])
(cond (cond
[(null? r) r] [(null? r) r]
[else (if (eq? (car r) l) [else (if (eq? (car r) l)
(cdr r) (cdr r)
(cons (car r) (loop (cdr r))))]))) (cons (car r) (loop (cdr r))))])))
(recompute-range-rectangles))))] (recompute-range-rectangles))))]
[range-rectangles null] [range-rectangles null]
[recompute-range-rectangles [recompute-range-rectangles
(lambda () (lambda ()
(let ([new-rectangles (let ([new-rectangles
(lambda (range) (lambda (range)
(let ([start (range-start range)] (let ([start (range-start range)]
[end (range-end range)] [end (range-end range)]
[pen (range-pen range)] [pen (range-pen range)]
[brush (range-brush range)] [brush (range-brush range)]
[buffer-width (box 0)] [buffer-width (box 0)]
[start-x (box 0)] [start-x (box 0)]
[top-start-y (box 0)] [top-start-y (box 0)]
[bottom-start-y (box 0)] [bottom-start-y (box 0)]
[end-x (box 0)] [end-x (box 0)]
[top-end-y (box 0)] [top-end-y (box 0)]
[bottom-end-y (box 0)]) [bottom-end-y (box 0)])
(send this get-extent buffer-width null) (send this get-extent buffer-width null)
(send this position-location start start-x top-start-y #t #f #t) (send this position-location start start-x top-start-y #t #f #t)
(send this position-location end end-x top-end-y #t #t #t) (send this position-location end end-x top-end-y #t #t #t)
(send this position-location start start-x bottom-start-y #f #f #t) (send this position-location start start-x bottom-start-y #f #f #t)
(send this position-location end end-x bottom-end-y #f #t #t) (send this position-location end end-x bottom-end-y #f #t #t)
(cond (cond
[(= (unbox top-start-y) (unbox top-end-y)) [(= (unbox top-start-y) (unbox top-end-y))
(list (make-rectangle (unbox start-x) (list (make-rectangle (unbox start-x)
(unbox top-start-y) (unbox top-start-y)
(- (unbox end-x) (unbox start-x)) (- (unbox end-x) (unbox start-x))
(- (unbox bottom-start-y) (unbox top-start-y)) (- (unbox bottom-start-y) (unbox top-start-y))
pen brush))] pen brush))]
[else [else
(list (list
(make-rectangle (unbox start-x) (make-rectangle (unbox start-x)
(unbox top-start-y) (unbox top-start-y)
(- (unbox buffer-width) (unbox start-x)) (- (unbox buffer-width) (unbox start-x))
(- (unbox bottom-start-y) (unbox top-start-y)) (- (unbox bottom-start-y) (unbox top-start-y))
pen brush) pen brush)
(make-rectangle 0 (make-rectangle 0
(unbox bottom-start-y) (unbox bottom-start-y)
(unbox buffer-width) (unbox buffer-width)
(- (unbox top-end-y) (unbox bottom-start-y)) (- (unbox top-end-y) (unbox bottom-start-y))
pen brush) pen brush)
(make-rectangle 0 (make-rectangle 0
(unbox top-end-y) (unbox top-end-y)
(unbox end-x) (unbox end-x)
(- (unbox bottom-end-y) (unbox top-end-y)) (- (unbox bottom-end-y) (unbox top-end-y))
pen brush))])))] pen brush))])))]
[invalidate-rectangle [invalidate-rectangle
(lambda (r) (lambda (r)
(invalidate-bitmap-cache (rectangle-left r) (invalidate-bitmap-cache (rectangle-left r)
(rectangle-top r) (rectangle-top r)
(rectangle-width r) (rectangle-width r)
(rectangle-height r)))] (rectangle-height r)))]
[old-rectangles range-rectangles]) [old-rectangles range-rectangles])
(set! range-rectangles (set! range-rectangles
(mzlib:function^:foldl (lambda (x l) (append (new-rectangles x) l)) (mzlib:function:foldl (lambda (x l) (append (new-rectangles x) l))
null ranges)) null ranges))
(begin-edit-sequence) (begin-edit-sequence)
(for-each invalidate-rectangle old-rectangles) (for-each invalidate-rectangle old-rectangles)
(for-each invalidate-rectangle range-rectangles) (for-each invalidate-rectangle range-rectangles)
(end-edit-sequence)))] (end-edit-sequence)))]
[on-paint [on-paint
(lambda (before dc left top right bottom dx dy draw-caret) (lambda (before dc left top right bottom dx dy draw-caret)
(super-on-paint before dc left top right bottom dx dy draw-caret) (super-on-paint before dc left top right bottom dx dy draw-caret)
(unless before (unless before
(for-each (lambda (rectangle) (for-each (lambda (rectangle)
(let ([pen (rectangle-pen rectangle)] (let ([pen (rectangle-pen rectangle)]
[brush (rectangle-brush rectangle)] [brush (rectangle-brush rectangle)]
[old-pen (send dc get-pen)] [old-pen (send dc get-pen)]
[old-brush (send dc get-brush)] [old-brush (send dc get-brush)]
[left (rectangle-left rectangle)] [left (rectangle-left rectangle)]
[top (rectangle-top rectangle)] [top (rectangle-top rectangle)]
[width (rectangle-width rectangle)] [width (rectangle-width rectangle)]
[height (rectangle-height rectangle)]) [height (rectangle-height rectangle)])
(send dc set-pen pen) (send dc set-pen pen)
(send dc set-brush brush) (send dc set-brush brush)
(unless (or (zero? width) (unless (or (zero? width)
(zero? height)) (zero? height))
(send dc draw-rectangle (+ left dx) (+ top dy) width height)) (send dc draw-rectangle (+ left dx) (+ top dy) width height))
(send dc set-pen old-pen) (send dc set-pen old-pen)
(send dc set-brush old-brush))) (send dc set-brush old-brush)))
range-rectangles)))]) range-rectangles)))])
(sequence (sequence
(apply super-init args) (apply super-init args)
(send edits add this) (send edits add this)
(let ([keymap (get-keymap)]) (let ([keymap (get-keymap)])
(mred:keymap^:set-keymap-error-handler keymap) (mred:keymap:set-keymap-error-handler keymap)
(mred:keymap^:set-keymap-implied-shifts keymap) (mred:keymap:set-keymap-implied-shifts keymap)
(send keymap chain-to-keymap mred:keymap^:global-keymap #f)))))) (send keymap chain-to-keymap mred:keymap:global-keymap #f))))))
(define edit% (make-edit% wx:media-edit%)) (define edit% (make-edit% wx:media-edit%))
(define make-pasteboard% make-std-buffer%) (define make-pasteboard% make-std-buffer%)
(define pasteboard% (make-pasteboard% wx:media-pasteboard%))) (define pasteboard% (make-pasteboard% wx:media-pasteboard%))))

View File

@ -1,37 +1,35 @@
;; [Robby] (define mred:exit@
;; exit doesn't actually exit, now. (unit/s mred:exit^
(import [mred:debug mred:debug^])
(rename (-exit exit))
(define-sigfunctor (mred:exit@ mred:exit^) (define exit-callbacks '())
(import mred:debug^)
(rename (-exit exit))
(define exit-callbacks '()) (define insert-exit-callback
(lambda (f)
(set! exit-callbacks (cons f exit-callbacks))
f))
(define insert-exit-callback (define remove-exit-callback
(lambda (f) (lambda (cb)
(set! exit-callbacks (cons f exit-callbacks)) (set! exit-callbacks
f)) (let loop ([cb-list exit-callbacks])
(cond
[(null? cb-list) ()]
[(eq? cb (car cb-list)) (cdr cb-list)]
[else (cons (car cb-list) (loop (cdr cb-list)))])))))
(define remove-exit-callback (define -exit
(lambda (cb) (lambda ()
(set! exit-callbacks (set! exit-callbacks
(let loop ([cb-list exit-callbacks]) (let loop ([cb-list exit-callbacks])
(cond (cond
[(null? cb-list) ()] [(null? cb-list) ()]
[(eq? cb (car cb-list)) (cdr cb-list)] [(not ((car cb-list))) cb-list]
[else (cons (car cb-list) (loop (cdr cb-list)))]))))) [else (loop (cdr cb-list))])))
(if (null? exit-callbacks)
(define -exit (begin (when mred:debug:exit?
(lambda () (exit))
(set! exit-callbacks #t)
(let loop ([cb-list exit-callbacks]) #f)))))
(cond
[(null? cb-list) ()]
[(not ((car cb-list))) cb-list]
[else (loop (cdr cb-list))])))
(if (null? exit-callbacks)
(begin (when mred:debug^:exit?
(exit))
#t)
#f))))

View File

@ -1,432 +1,434 @@
(define-sigfunctor (mred:finder@ mred:finder^) (define mred:finder@
(import mred:debug^ mzlib:string^ mzlib:function^ mzlib:file^) (unit/s mred:finder^
(import [mred:debug mred:debug^] [mzlib:string mzlib:string^]
[mzlib:function mzlib:function^] [mzlib:file mzlib:file^])
(define filter-match? (define filter-match?
(lambda (filter name msg) (lambda (filter name msg)
(let-values ([(base name dir?) (split-path name)]) (let-values ([(base name dir?) (split-path name)])
(if (mzlib:string^:regexp-match-exact? filter name) (if (mzlib:string:regexp-match-exact? filter name)
#t #t
(begin (begin
(wx:message-box msg "Error") (wx:message-box msg "Error")
#f))))) #f)))))
(define last-directory #f) (define last-directory #f)
(define make-relative (define make-relative
(lambda (s) s)) (lambda (s) s))
(define current-find-file-directory (define current-find-file-directory
(opt-lambda ([dir 'get]) (opt-lambda ([dir 'get])
(cond (cond
[(eq? dir 'get) [(eq? dir 'get)
(if (not last-directory) (if (not last-directory)
(set! last-directory (current-directory))) (set! last-directory (current-directory)))
last-directory] last-directory]
[(and (string? dir) [(and (string? dir)
(directory-exists? dir)) (directory-exists? dir))
(set! last-directory dir) (set! last-directory dir)
#t] #t]
[else #f]))) [else #f])))
(define finder-dialog% (define finder-dialog%
(class wx:dialog-box% (save-mode? replace-ok? multi-mode? (class wx:dialog-box% (save-mode? replace-ok? multi-mode?
result-box start-dir result-box start-dir
start-name prompt start-name prompt
file-filter file-filter-msg) file-filter file-filter-msg)
(inherit (inherit
new-line tab fit center new-line tab fit center
show show
popup-menu) popup-menu)
(private (private
[WIDTH 500] [WIDTH 500]
[HEIGHT 500] [HEIGHT 500]
dirs current-dir dirs current-dir
last-selected last-selected
[select-counter 0]) [select-counter 0])
(private (private
[set-directory [set-directory
(lambda (dir) ; dir is normalied (lambda (dir) ; dir is normalied
(set! current-dir dir) (set! current-dir dir)
(set! last-directory dir) (set! last-directory dir)
(let-values (let-values
([(dir-list menu-list) ([(dir-list menu-list)
(let loop ([this-dir dir] (let loop ([this-dir dir]
[dir-list ()] [dir-list ()]
[menu-list ()]) [menu-list ()])
(let-values ([(base-dir in-dir dir?) (split-path this-dir)]) (let-values ([(base-dir in-dir dir?) (split-path this-dir)])
(if (eq? wx:platform 'windows) (if (eq? wx:platform 'windows)
(mzlib:string^:string-lowercase! in-dir)) (mzlib:string:string-lowercase! in-dir))
(let* ([dir-list (cons this-dir dir-list)] (let* ([dir-list (cons this-dir dir-list)]
[menu-list (cons in-dir menu-list)]) [menu-list (cons in-dir menu-list)])
(if base-dir (if base-dir
(loop base-dir dir-list menu-list) (loop base-dir dir-list menu-list)
; No more ; No more
(values dir-list menu-list)))))]) (values dir-list menu-list)))))])
(set! dirs dir-list) (set! dirs dir-list)
(send dir-choice clear) (send dir-choice clear)
(let loop ([choices menu-list]) (let loop ([choices menu-list])
(unless (null? choices) (unless (null? choices)
(send dir-choice append (car choices)) (send dir-choice append (car choices))
(loop (cdr choices)))) (loop (cdr choices))))
(send dir-choice set-selection (sub1 (length dirs))) (send dir-choice set-selection (sub1 (length dirs)))
(send dir-choice set-size -1 -1 -1 -1)) (send dir-choice set-size -1 -1 -1 -1))
(send name-list clear) (send name-list clear)
(send name-list set (send name-list set
(mzlib:function^:quicksort (mzlib:function:quicksort
(let loop ([l (directory-list dir)]) (let loop ([l (directory-list dir)])
(if (null? l) (if (null? l)
'() '()
(let ([s (car l)] (let ([s (car l)]
[rest (loop (cdr l))]) [rest (loop (cdr l))])
(if (directory-exists? (build-path dir s)) (if (directory-exists? (build-path dir s))
(cons (cons
(string-append s (string-append s
(case wx:platform (case wx:platform
(unix "/") (unix "/")
(windows "\\") (windows "\\")
(macintosh ":"))) (macintosh ":")))
rest) rest)
(if (or (not file-filter) (if (or (not file-filter)
(mzlib:string^:regexp-match-exact? file-filter s)) (mzlib:string:regexp-match-exact? file-filter s))
(cons s rest) (cons s rest)
rest))))) rest)))))
(if (eq? wx:platform 'unix) string<? string-ci<?))) (if (eq? wx:platform 'unix) string<? string-ci<?)))
(set! last-selected -1))]) (set! last-selected -1))])
(public (public
[do-dir [do-dir
(lambda (choice event) (lambda (choice event)
(let ([which (send event get-selection)]) (let ([which (send event get-selection)])
(if (< which (length dirs)) (if (< which (length dirs))
(set-directory (list-ref dirs which)))))] (set-directory (list-ref dirs which)))))]
[do-goto [do-goto
(opt-lambda (button event [default ""]) (opt-lambda (button event [default ""])
(let ([orig-dir (wx:get-text-from-user (let ([orig-dir (wx:get-text-from-user
"Directory" "Go to Directory" "Directory" "Go to Directory"
default)]) default)])
(if (string? orig-dir) (if (string? orig-dir)
(let ([dir (mzlib:file^:normalize-path orig-dir current-dir)]) (let ([dir (mzlib:file:normalize-path orig-dir current-dir)])
(if (directory-exists? dir) (if (directory-exists? dir)
(set-directory dir) (set-directory dir)
(begin (begin
(wx:message-box (wx:message-box
(string-append "Bad directory: " dir) (string-append "Bad directory: " dir)
"Error") "Error")
(do-goto button event orig-dir)))))))] (do-goto button event orig-dir)))))))]
[on-default-action [on-default-action
(lambda (which) (lambda (which)
(if (eq? which name-list) (if (eq? which name-list)
(let* ([which (send name-list get-string-selection)] (let* ([which (send name-list get-string-selection)]
[dir (build-path current-dir [dir (build-path current-dir
(make-relative which))]) (make-relative which))])
(if (directory-exists? dir) (if (directory-exists? dir)
(set-directory (mzlib:file^:normalize-path dir)) (set-directory (mzlib:file:normalize-path dir))
(if save-mode? (if save-mode?
(send name-field set-value which) (send name-field set-value which)
(if multi-mode? (if multi-mode?
(do-add) (do-add)
(do-ok))))) (do-ok)))))
(if (eq? which name-field) (if (eq? which name-field)
(do-ok))))] (do-ok))))]
[do-name [do-name
(lambda (text event) (lambda (text event)
(if (eq? (send event get-event-type) (if (eq? (send event get-event-type)
wx:const-event-type-text-enter-command) wx:const-event-type-text-enter-command)
(do-ok)))] (do-ok)))]
[do-name-list [do-name-list
(lambda args #f)] (lambda args #f)]
[do-result-list [do-result-list
(lambda args #f)] (lambda args #f)]
[do-into-dir [do-into-dir
(lambda args (lambda args
(let ([name (send name-list get-string-selection)]) (let ([name (send name-list get-string-selection)])
(if (string? name) (if (string? name)
(let ([name (build-path current-dir (let ([name (build-path current-dir
(make-relative name))]) (make-relative name))])
(if (directory-exists? name) (if (directory-exists? name)
(set-directory (mzlib:file^:normalize-path name)))))))] (set-directory (mzlib:file:normalize-path name)))))))]
[do-ok [do-ok
(lambda args (lambda args
(if multi-mode? (if multi-mode?
(let loop ([n (sub1 select-counter)][result ()]) (let loop ([n (sub1 select-counter)][result ()])
(if (< n 0) (if (< n 0)
(begin
(set-box! result-box result)
(show #f))
(loop (sub1 n)
(cons (send result-list get-string n)
result))))
(let ([name
(if save-mode?
(send name-field get-value)
(send name-list get-string-selection))])
(cond
[(not (string? name)) 'nothing-selected]
[(string=? name "")
(wx:message-box "You must specify a file name"
"Error")]
[(and save-mode?
file-filter
(not (mzlib:string^:regexp-match-exact? file-filter name)))
(wx:message-box file-filter-msg "Error")]
[else
(let ([file (build-path current-dir
(make-relative name))])
(if (directory-exists? file)
(if save-mode?
(wx:message-box
"That is the name of a directory."
"Error")
(set-directory (mzlib:file^:normalize-path file)))
(if (or (not save-mode?)
(not (file-exists? file))
replace-ok?
(= (wx:message-box
(string-append
"The file "
name
" already exists. "
"Replace it?")
"Warning"
wx:const-yes-no)
wx:const-yes))
(begin (begin
(set-box! result-box (mzlib:file^:normalize-path file)) (set-box! result-box result)
(show #f)))))]))))] (show #f))
(loop (sub1 n)
(cons (send result-list get-string n)
result))))
(let ([name
(if save-mode?
(send name-field get-value)
(send name-list get-string-selection))])
(cond
[(not (string? name)) 'nothing-selected]
[(string=? name "")
(wx:message-box "You must specify a file name"
"Error")]
[(and save-mode?
file-filter
(not (mzlib:string:regexp-match-exact? file-filter name)))
(wx:message-box file-filter-msg "Error")]
[else
(let ([file (build-path current-dir
(make-relative name))])
(if (directory-exists? file)
(if save-mode?
(wx:message-box
"That is the name of a directory."
"Error")
(set-directory (mzlib:file:normalize-path file)))
(if (or (not save-mode?)
(not (file-exists? file))
replace-ok?
(= (wx:message-box
(string-append
"The file "
name
" already exists. "
"Replace it?")
"Warning"
wx:const-yes-no)
wx:const-yes))
(begin
(set-box! result-box (mzlib:file:normalize-path file))
(show #f)))))]))))]
[add-one [add-one
(lambda (name) (lambda (name)
(unless (or (directory-exists? name) (unless (or (directory-exists? name)
(> (send result-list find-string name) -1)) (> (send result-list find-string name) -1))
(set! select-counter (add1 select-counter)) (set! select-counter (add1 select-counter))
(send result-list append (mzlib:file^:normalize-path name))))] (send result-list append (mzlib:file:normalize-path name))))]
[do-add [do-add
(lambda args (lambda args
(let ([name (send name-list get-string-selection)]) (let ([name (send name-list get-string-selection)])
(if (string? name) (if (string? name)
(let ([name (build-path current-dir (let ([name (build-path current-dir
(make-relative name))]) (make-relative name))])
(add-one name)))))] (add-one name)))))]
[do-add-all [do-add-all
(lambda args (lambda args
(let loop ([n 0]) (let loop ([n 0])
(let ([name (send name-list get-string n)]) (let ([name (send name-list get-string n)])
(if (and (string? name) (if (and (string? name)
(positive? (string-length name))) (positive? (string-length name)))
(let ([name (build-path current-dir (let ([name (build-path current-dir
(make-relative name))]) (make-relative name))])
(add-one name) (add-one name)
(loop (add1 n)))))))] (loop (add1 n)))))))]
[do-remove [do-remove
(lambda args (lambda args
(let loop ([n 0]) (let loop ([n 0])
(if (< n select-counter) (if (< n select-counter)
(if (send result-list selected? n) (if (send result-list selected? n)
(begin (begin
(send result-list delete n) (send result-list delete n)
(set! select-counter (sub1 select-counter)) (set! select-counter (sub1 select-counter))
(loop n)) (loop n))
(loop (add1 n))))))] (loop (add1 n))))))]
[do-cancel [do-cancel
(lambda args (lambda args
(set-box! result-box #f) (set-box! result-box #f)
(show #f))] (show #f))]
[on-close (lambda () #f)]) [on-close (lambda () #f)])
(sequence (sequence
(super-init () (if save-mode? "Put File" "Get File") (super-init () (if save-mode? "Put File" "Get File")
#t 300 300 WIDTH HEIGHT) #t 300 300 WIDTH HEIGHT)
(make-object wx:message% this prompt) (make-object wx:message% this prompt)
(new-line)) (new-line))
(private (private
[dir-choice (make-object wx:choice% [dir-choice (make-object wx:choice%
this do-dir '() -1 -1 -1 -1 this do-dir '() -1 -1 -1 -1
'("XXXXXXXXXXXXXXXXXXXXXXXXXXX"))] '("XXXXXXXXXXXXXXXXXXXXXXXXXXX"))]
[name-list (begin [name-list (begin
(new-line) (new-line)
(make-object wx:list-box%
this do-name-list
() wx:const-single
-1 -1
(if multi-mode? (* 1/2 WIDTH) WIDTH) 300
() wx:const-needed-sb))]
[result-list
(if multi-mode?
(make-object wx:list-box% (make-object wx:list-box%
this do-name-list this do-result-list
() wx:const-single ()
-1 -1 (if (eq? wx:window-system 'motif)
(if multi-mode? (* 1/2 WIDTH) WIDTH) 300 wx:const-extended
() wx:const-needed-sb))] wx:const-multiple)
-1 -1
(* 1/2 WIDTH) 300
() wx:const-needed-sb))])
(sequence
(new-line))
[result-list (private
(if multi-mode? [name-field
(make-object wx:list-box% (if save-mode?
this do-result-list (let ([v (make-object wx:text%
() this do-name
(if (eq? wx:window-system 'motif) "Name: " ""
wx:const-extended -1 -1
wx:const-multiple) 400 -1
-1 -1 wx:const-process-enter)])
(* 1/2 WIDTH) 300 (if (string? start-name)
() wx:const-needed-sb))]) (send v set-value start-name))
(sequence (new-line)
(new-line)) v))]
[into-dir-button
(if save-mode?
(make-object wx:button%
this do-into-dir "Open Directory"))]
[goto-button (make-object wx:button%
this do-goto "Go to Directory...")]
[add-button (if multi-mode?
(make-object wx:button%
this do-add
"Add"))]
[add-all-button (if multi-mode?
(make-object wx:button%
this do-add-all
"Add All"))]
[remove-button (if multi-mode?
(make-object wx:button%
this do-remove
"Remove"))])
(sequence
(if multi-mode?
(tab 40)
(tab 100)))
(private
[cancel-button (make-object wx:button%
this do-cancel
"Cancel")]
[ok-button
(let ([w (send cancel-button get-width)])
(make-object wx:button%
this do-ok
"OK" -1 -1 w))])
(sequence
(fit)
(private (cond
[name-field [(and start-dir
(if save-mode? (not (null? start-dir))
(let ([v (make-object wx:text% (directory-exists? start-dir))
this do-name (set-directory (mzlib:file:normalize-path start-dir))]
"Name: " "" [last-directory (set-directory last-directory)]
-1 -1 [else (set-directory (current-directory))])
400 -1
wx:const-process-enter)])
(if (string? start-name)
(send v set-value start-name))
(new-line)
v))]
[into-dir-button
(if save-mode?
(make-object wx:button%
this do-into-dir "Open Directory"))]
[goto-button (make-object wx:button%
this do-goto "Go to Directory...")]
[add-button (if multi-mode?
(make-object wx:button%
this do-add
"Add"))]
[add-all-button (if multi-mode?
(make-object wx:button%
this do-add-all
"Add All"))]
[remove-button (if multi-mode?
(make-object wx:button%
this do-remove
"Remove"))])
(sequence
(if multi-mode?
(tab 40)
(tab 100)))
(private
[cancel-button (make-object wx:button%
this do-cancel
"Cancel")]
[ok-button
(let ([w (send cancel-button get-width)])
(make-object wx:button%
this do-ok
"OK" -1 -1 w))])
(sequence
(fit)
(cond (center wx:const-both)
[(and start-dir
(not (null? start-dir))
(directory-exists? start-dir))
(set-directory (mzlib:file^:normalize-path start-dir))]
[last-directory (set-directory last-directory)]
[else (set-directory (current-directory))])
(center wx:const-both) (show #t))))
(show #t)))) (define common-put-file
(opt-lambda ([name ()][directory ()][replace? #f]
[prompt "Select File"][filter #f]
[filter-msg "That name does not have the right form"])
(let* ([directory (if (and (null? directory)
(string? name))
(or (mzlib:file:path-only name) null)
directory)]
[name (or (and (string? name)
(mzlib:file:file-name-from-path name))
name)]
[v (box #f)])
(make-object finder-dialog% #t replace? #f v
directory name prompt filter filter-msg)
(unbox v))))
(define common-put-file (define common-get-file
(opt-lambda ([name ()][directory ()][replace? #f] (opt-lambda ([directory ()][prompt "Select File"][filter #f]
[prompt "Select File"][filter #f] [filter-msg "Bad name"])
[filter-msg "That name does not have the right form"]) (let ([v (box #f)])
(let* ([directory (if (and (null? directory) (make-object finder-dialog% #f #f #f v directory '() prompt
(string? name)) filter filter-msg)
(or (mzlib:file^:path-only name) null) (unbox v))))
directory)]
[name (or (and (string? name)
(mzlib:file^:file-name-from-path name))
name)]
[v (box #f)])
(make-object finder-dialog% #t replace? #f v
directory name prompt filter filter-msg)
(unbox v))))
(define common-get-file (define common-get-file-list
(opt-lambda ([directory ()][prompt "Select File"][filter #f] (opt-lambda ([directory ()][prompt "Select Files"][filter #f]
[filter-msg "Bad name"]) [filter-msg "Bad name"])
(let ([v (box #f)]) (let ([v (box ())])
(make-object finder-dialog% #f #f #f v directory '() prompt (make-object finder-dialog% #f #f #t v directory '() prompt
filter filter-msg) filter filter-msg)
(unbox v)))) (unbox v))))
(define common-get-file-list (define std-put-file
(opt-lambda ([directory ()][prompt "Select Files"][filter #f] (opt-lambda ([name ()][directory ()][replace? #f][prompt "Select File"]
[filter-msg "Bad name"]) [filter #f]
(let ([v (box ())]) [filter-msg
(make-object finder-dialog% #f #f #t v directory '() prompt "That filename does not have the right form."])
filter filter-msg) (let* ([directory (if (and (null? directory)
(unbox v)))) (string? name))
(or (mzlib:file:path-only name) null)
directory)]
[name (or (and (string? name)
(mzlib:file:file-name-from-path name))
name)]
[f (wx:file-selector prompt directory name
'()
(if (eq? wx:platform 'windows)
"*.*"
"*")
wx:const-save)])
(if (or (null? f) (and filter (not (filter-match? filter
f
filter-msg))))
#f
(let* ([f (mzlib:file:normalize-path f)]
[dir (mzlib:file:path-only f)]
[name (mzlib:file:file-name-from-path f)])
(cond
[(not (and (string? dir) (directory-exists? dir)))
(wx:message-box "Error" "That directory does not exist.")
#f]
[(or (not name) (equal? name ""))
(wx:message-box "Error" "Empty filename.")
#f]
[else f]))))))
(define std-put-file (define std-get-file
(opt-lambda ([name ()][directory ()][replace? #f][prompt "Select File"] (opt-lambda ([directory ()][prompt "Select File"][filter #f]
[filter #f] [filter-msg
[filter-msg "That filename does not have the right form."])
"That filename does not have the right form."]) (let ([f (wx:file-selector prompt directory)])
(let* ([directory (if (and (null? directory) (if (null? f)
(string? name)) #f
(or (mzlib:file^:path-only name) null) (if (or (not filter) (filter-match? filter f filter-msg))
directory)] (let ([f (mzlib:file:normalize-path f)])
[name (or (and (string? name) (cond
(mzlib:file^:file-name-from-path name)) [(directory-exists? f)
name)] (wx:message-box "Error"
[f (wx:file-selector prompt directory name "That is a directory name.")
'() #f]
(if (eq? wx:platform 'windows) [(not (file-exists? f))
"*.*" (wx:message-box "That file does not exist.")
"*") #f]
wx:const-save)]) [else f]))
(if (or (null? f) (and filter (not (filter-match? filter #f)))))
f
filter-msg))))
#f
(let* ([f (mzlib:file^:normalize-path f)]
[dir (mzlib:file^:path-only f)]
[name (mzlib:file^:file-name-from-path f)])
(cond
[(not (and (string? dir) (directory-exists? dir)))
(wx:message-box "Error" "That directory does not exist.")
#f]
[(or (not name) (equal? name ""))
(wx:message-box "Error" "Empty filename.")
#f]
[else f]))))))
(define std-get-file ; By default, use platform-specific get/put
(opt-lambda ([directory ()][prompt "Select File"][filter #f] (define put-file std-put-file)
[filter-msg (define get-file std-get-file)))
"That filename does not have the right form."])
(let ([f (wx:file-selector prompt directory)])
(if (null? f)
#f
(if (or (not filter) (filter-match? filter f filter-msg))
(let ([f (mzlib:file^:normalize-path f)])
(cond
[(directory-exists? f)
(wx:message-box "Error"
"That is a directory name.")
#f]
[(not (file-exists? f))
(wx:message-box "That file does not exist.")
#f]
[else f]))
#f)))))
; By default, use platform-specific get/put
(define put-file std-put-file)
(define get-file std-get-file))

File diff suppressed because it is too large Load Diff