original commit: added8761de66065677d0ab2f4966ef75bb2d376
This commit is contained in:
Robby Findler 1998-10-15 20:25:59 +00:00
parent 75868b396a
commit 08f0d3cc22
15 changed files with 1129 additions and 1437 deletions

View File

@ -1,4 +1,4 @@
(unit/sig framework:application^
(dunit/sig framework:application^
(import)
(define current-app-name (make-parameter

View File

@ -1,44 +1,47 @@
(unit/sig framework:autosave^
(dunit/sig framework:autosave^
(import mred-interfaces^
[exit : framework:exit^]
[preferences : framework:preferences^])
(define objects null)
(define autosave-timer%
(class timer% ()
(inherit start)
(override
[notify
(lambda ()
(when (preferences:get 'framework:autosaving-on?)
(set! objects
(let loop ([list objects])
(if (null? list)
null
(let ([object (weak-box-value (car list))])
(if object
(begin
(send object do-autosave)
(cons (car list) (loop (cdr list))))
(loop (cdr list))))))))
(let ([seconds (preferences:get 'framework:autosave-delay)])
(start (* 1000 seconds) #t)))])
(sequence
(super-init)
(let ([seconds (preferences:get 'framework:autosave-delay)])
(start (* 1000 seconds) #t)))))
(define timer #f)
(define register
(let* ([objects null]
[autosave-timer%
(class timer% ()
(inherit start)
(override
[notify
(lambda ()
(when (preferences:get 'framework:autosaving-on?)
(set! objects
(let loop ([list objects])
(if (null? list)
null
(let ([object (weak-box-value (car list))])
(if object
(begin
(send object do-autosave)
(cons (car list) (loop (cdr list))))
(loop (cdr list))))))))
(let ([seconds (preferences:get 'framework:autosave-delay)])
(start (* 1000 seconds) #t)))])
(sequence
(super-init)
(let ([seconds (preferences:get 'framework:autosave-delay)])
(start (* 1000 seconds) #t))))]
[timer #f])
(lambda (b)
(unless timer
(set! timer (make-object autosave-timer%)))
(set! objects
(let loop ([objects objects])
(cond
[(null? objects) (list (make-weak-box b))]
[else (let ([weak-box (car objects)])
(if (weak-box-value weak-box)
(cons weak-box (loop (cdr objects)))
(loop (cdr objects))))])))))))
(lambda (b)
(unless timer
(set! timer (make-object autosave-timer%)))
(set! objects
(let loop ([objects objects])
(cond
[(null? objects) (list (make-weak-box b))]
[else (let ([weak-box (car objects)])
(if (weak-box-value weak-box)
(cons weak-box (loop (cdr objects)))
(loop (cdr objects))))]))))))

View File

@ -1,95 +1,100 @@
(unit/sig framework:canvas^
(dunit/sig framework:canvas^
(import mred-interfaces^
[preferences : framework:preferences^])
(define wide-snip<%> (interface (editor-canvas<%>)
add-wide-snip
add-tall-snip))
;; wx: this need to collude with
;; the edit, since the edit has the right callbacks.
(define make-wide-snip%
(lambda (super%)
(class-asi super%
(inherit get-media)
(rename [super-on-size on-size])
(private
[wide-snips null]
[tall-snips null]
[update-snip-size
(lambda (width?)
(lambda (s)
(let* ([width (box 0)]
[height (box 0)]
[leftm (box 0)]
[rightm (box 0)]
[topm (box 0)]
[bottomm (box 0)]
[left-edge-box (box 0)]
[top-edge-box (box 0)]
[snip-media (send s get-this-media)]
[edit (get-media)])
(when edit
(send edit
run-after-edit-sequence
(lambda ()
(let ([admin (send edit get-admin)])
(send admin get-view #f #f width height)
(send s get-margin leftm topm rightm bottomm)
(define wide-snip-mixin
(mixin (editor-canvas<%>) (wide-snip<%>) args
(inherit get-editor)
(rename [super-on-size on-size])
(private
[wide-snips null]
[tall-snips null]
[update-snip-size
(lambda (width?)
(lambda (s)
(let* ([width (box 0)]
[height (box 0)]
[leftm (box 0)]
[rightm (box 0)]
[topm (box 0)]
[bottomm (box 0)]
[left-edge-box (box 0)]
[top-edge-box (box 0)]
[snip-media (send s get-this-media)]
[edit (get-editor)])
(when edit
(send edit
run-after-edit-sequence
(lambda ()
(let ([admin (send edit get-admin)])
(send admin get-view #f #f width height)
(send s get-margin leftm topm rightm bottomm)
;; when the width is to be maximized and there is a
;; newline just behind the snip, we know that the left
;; edge is zero. Special case for efficiency in the
;; console printer
(let ([fallback
(lambda ()
(send edit get-snip-position-and-location
s #f left-edge-box top-edge-box))])
(cond
[(not width?) (fallback)]
[(let ([prev (send s previous)])
(and (not prev
(member 'hard-newline (send prev get-flags)))))
(set-box! left-edge-box 0)]
[else (fallback)]))
;; when the width is to be maximized and there is a
;; newline just behind the snip, we know that the left
;; edge is zero. Special case for efficiency in the
;; console printer
(let ([fallback
(lambda ()
(send edit get-snip-position-and-location
s #f left-edge-box top-edge-box))])
(cond
[(not width?) (fallback)]
[(let ([prev (send s previous)])
(and (not prev
(member 'hard-newline (send prev get-flags)))))
(set-box! left-edge-box 0)]
[else (fallback)]))
(if width?
(let ([snip-width (- (unbox width)
(unbox left-edge-box)
(unbox leftm)
(unbox rightm)
;; this two is the space that
;; the caret needs at the right of
;; a buffer.
2)])
(send* s
(set-min-width snip-width)
(set-max-width snip-width))
(when snip-media
(send snip-media set-max-width
(if (send snip-media auto-wrap)
snip-width
0))))
(let ([snip-height (- (unbox height)
(unbox top-edge-box)
(unbox topm)
(unbox bottomm))])
(send* s
(set-min-height snip-height)
(set-max-height snip-height)))))))))))])
(public
[add-wide-snip
(lambda (snip)
(set! wide-snips (cons snip wide-snips))
((update-snip-size #t) snip))]
[add-tall-snip
(lambda (snip)
(set! tall-snips (cons snip tall-snips))
((update-snip-size #f) snip))]
[on-size
(lambda (width height)
(super-on-size width height)
(for-each (update-snip-size #t) wide-snips)
(for-each (update-snip-size #f) tall-snips))]))))
(if width?
(let ([snip-width (- (unbox width)
(unbox left-edge-box)
(unbox leftm)
(unbox rightm)
;; this two is the space that
;; the caret needs at the right of
;; a buffer.
2)])
(send* s
(set-min-width snip-width)
(set-max-width snip-width))
(when snip-media
(send snip-media set-max-width
(if (send snip-media auto-wrap)
snip-width
0))))
(let ([snip-height (- (unbox height)
(unbox top-edge-box)
(unbox topm)
(unbox bottomm))])
(send* s
(set-min-height snip-height)
(set-max-height snip-height)))))))))))])
(public
[add-wide-snip
(lambda (snip)
(set! wide-snips (cons snip wide-snips))
((update-snip-size #t) snip))]
[add-tall-snip
(lambda (snip)
(set! tall-snips (cons snip tall-snips))
((update-snip-size #f) snip))])
(override
[on-size
(lambda (width height)
(super-on-size width height)
(for-each (update-snip-size #t) wide-snips)
(for-each (update-snip-size #f) tall-snips))])
(sequence
(apply super-init args))))
(define wide-snip% (make-wide-snip% editor-canvas%)))
(define wide-snip% (wide-snip-mixin editor-canvas%)))

View File

@ -1,4 +1,4 @@
(unit/sig framework:editor^
(dunit/sig framework:editor^
(import mred-interfaces^
[autosave : framework:autosave^]
[finder : framework:finder^]
@ -6,18 +6,20 @@
[keymap : framework:keymap^]
[icon : framework:icon^]
[preferences : framework:preferences^]
[gui-utils : framework:gui-utils^])
[text : framework:text^]
[pasteboard : framework:pasteboard^])
(define basic<%>
(interface (editor<%>)
editing-this-file?
local-edit-sequence?
run-after-edit-sequence
get-text-snip
get-pasteboard-snip
default-auto-wrap?))
default-auto-wrap?
get-top-level-window
locked?
on-close))
(define make-basic%
(define basic-mixin
(mixin (editor<%>) (basic<%>) args
(inherit get-filename save-file
refresh-delayed?
@ -25,62 +27,47 @@
get-keymap
get-max-width get-admin set-filename)
(rename [super-set-modified set-modified]
[super-on-save-file on-save-file]
[super-on-focus on-focus]
[super-load-file load-file]
[super-lock lock])
(public [editing-this-file? #f])
(public
[on-close void]
[get-top-level-window
(lambda ()
(let ([c (get-canvas)])
(and c
(send c get-top-level-window))))])
(override
[load-file
(opt-lambda ([filename #f]
[the-format 'guess]
[show-dialog? #t])
(let ([filename (or filename
(parameterize ([finder:dialog-parent-parameter
(let ([canvas (get-canvas)])
(and canvas
(send canvas get-top-level-window)))])
(finder:get-file)))])
(and filename
(if (file-exists? filename)
(let ([res (super-load-file filename the-format #f)])
(when (and (not res)
show-dialog?)
(message-box
"Error Loading File"
(format "Error loading file ~a" filename))
res))
(set-filename filename)))))])
(public [editing-this-file? (lambda () #f)])
(private
[edit-sequence-queue null]
[edit-sequence-ht (make-hash-table)])
(private
[in-local-edit-sequence? #f])
(public
[local-edit-sequence? #f]
[local-edit-sequence? (lambda () in-local-edit-sequence?)]
[run-after-edit-sequence
(rec run-after-edit-sequence
(case-lambda
[(t) (run-after-edit-sequence t #f)]
[(t sym)
(unless (and (procedure? t)
(= 0 (arity t)))
(error 'media-buffer::run-after-edit-sequence
"expected procedure of arity zero, got: ~s~n" t))
(unless (or (symbol? sym) (not sym))
(error 'media-buffer::run-after-edit-sequence
"expected second argument to be a symbol, got: ~s~n"
sym))
(if (refresh-delayed?)
(cond
[(symbol? sym)
(hash-table-put! edit-sequence-ht sym t)]
[else (set! edit-sequence-queue
(cons t edit-sequence-queue))])
(t))
(void)]))]
(case-lambda
[(t) (run-after-edit-sequence t #f)]
[(t sym)
(unless (and (procedure? t)
(= 0 (arity t)))
(error 'media-buffer::run-after-edit-sequence
"expected procedure of arity zero, got: ~s~n" t))
(unless (or (symbol? sym) (not sym))
(error 'media-buffer::run-after-edit-sequence
"expected second argument to be a symbol, got: ~s~n"
sym))
(if (refresh-delayed?)
(cond
[(symbol? sym)
(hash-table-put! edit-sequence-ht sym t)]
[else (set! edit-sequence-queue
(cons t edit-sequence-queue))])
(t))
(void)])]
[extend-edit-sequence-queue
(lambda (l ht)
(hash-table-for-each ht (lambda (k t)
@ -95,10 +82,10 @@
[on-edit-sequence
(lambda ()
(super-on-edit-sequence)
(set! local-edit-sequence? #t))]
(set! in-local-edit-sequence? #t))]
[after-edit-sequence
(lambda ()
(set! local-edit-sequence? #f)
(set! in-local-edit-sequence? #f)
(super-after-edit-sequence)
(let ([queue edit-sequence-queue]
[ht edit-sequence-ht]
@ -115,67 +102,56 @@
(set! edit-sequence-ht (make-hash-table))
(let loop ([edit (find-enclosing-edit this)])
(cond
[(and edit (not (ivar edit local-edit-sequence?)))
[(and edit (not (send edit local-edit-sequence?)))
(loop (find-enclosing-edit edit))]
[edit (send edit extend-edit-sequence-queue queue ht)]
[else
(hash-table-for-each ht (lambda (k t) (t)))
(for-each (lambda (t) (t)) queue)]))))])
(private
[is-locked? #f])
(public
[locked? #f])
[locked? (lambda () is-locked?)])
(override
[lock
[lock
(lambda (x)
(set! locked? x)
(super-lock x))])
(public
[get-text-snip (lambda () (make-object editor-snip% (make-object text%)))]
[get-pasteboard-snip (lambda () (make-object editor-snip% (make-object pasteboard%)))])
(override
(set! is-locked? x)
(super-lock x))]
[on-new-box
(lambda (type)
(cond
[(eq? type 'text) (get-text-snip)]
[else (get-pasteboard-snip)]))])
[(eq? type 'text) (make-object editor-snip% (make-object text:basic%))]
[else (make-object editor-snip% (make-object pasteboard:basic%))]))])
(public
(override
[get-file (lambda (d)
(let ([v (parameterize ([finder:dialog-parent-parameter
(and (get-canvas)
(send (get-canvas) get-top-level-window))])
(finder:get-file d))])
(if v
v
null)))]
[put-file (lambda (d f) (let ([v (parameterize ([finder:dialog-parent-parameter
(and (get-canvas)
(send (get-canvas) get-top-level-window))])
(finder:put-file f d))])
(if v
v
null)))])
(parameterize ([finder:dialog-parent-parameter
(get-top-level-window)])
(finder:get-file d)))]
[put-file (lambda (d f) (parameterize ([finder:dialog-parent-parameter
(get-top-level-window)])
(finder:put-file f d)))])
(public
[default-auto-wrap? #t])
[default-auto-wrap? (lambda () #t)])
(inherit auto-wrap)
(sequence
(apply super-init args)
(auto-wrap default-auto-wrap?))))
(auto-wrap (default-auto-wrap?)))))
(define file<%> (interface (basic<%>)))
(define make-file%
(define file-mixin
(mixin (basic<%>) (file<%>) args
(inherit get-keymap
get-filename lock get-style-list
is-modified? change-style set-modified
get-frame)
get-top-level-window)
(rename [super-after-save-file after-save-file]
[super-after-load-file after-load-file])
(override [editing-this-file? #t])
(override [editing-this-file? (lambda () #t)])
(private
[check-lock
(lambda ()
@ -213,15 +189,14 @@
do-autosave
remove-autosave))
; wx: when should autosave files be removed?
; also, what about checking the autosave files when a file is
; wx: what about checking the autosave files when a file is
; opened?
(define make-backup-autosave%
(define backup-autosave-mixin
(mixin (basic<%>) (backup-autosave<%>) args
(inherit is-modified? get-filename save-file)
(rename [super-on-save-file on-save-file]
[super-on-change on-change]
[super-do-close do-close]
[super-on-close on-close]
[super-set-modified set-modified])
(private
[freshen-backup? #t]
@ -229,30 +204,29 @@
[auto-save-out-of-date? #t]
[auto-save-error? #f])
(public
[auto-save? #t]
[backup? #t])
[backup? (lambda () #t)])
(override
[on-save-file
(lambda (name format)
(set! auto-save-error? #f)
(and (super-on-save-file name format)
(begin
(when (and backup?
(when (and (backup?)
freshen-backup?
(not (eq? format 'copy))
(file-exists? name))
(let ([back-name (path-utils:generate-backup-name name)])
(when freshen-backup?
(set! freshen-backup? #f)
(when (file-exists? back-name)
(delete-file back-name)))
(set! freshen-backup? #f)
(when (file-exists? back-name)
(delete-file back-name))
(with-handlers ([(lambda (x) #t) void])
(copy-file name back-name))))
#t)))]
[do-close
[on-close
(lambda ()
(super-do-close)
(super-on-close)
(remove-autosave)
(set! auto-save? #f))]
(set! autosave? (lambda () #f)))]
[on-change
(lambda ()
(super-on-change)
@ -267,10 +241,10 @@
(set! auto-saved-name #f))))
(super-set-modified modified?))])
(public
[autosave? #t]
[autosave? (lambda () #t)]
[do-autosave
(lambda ()
(when (and auto-save?
(when (and (autosave?)
(not auto-save-error?)
(is-modified?)
(or (not auto-saved-name)
@ -302,9 +276,9 @@
(autosave:register this))))
(define info<%> (interface (basic<%>)))
(define make-info%
(define info-mixin
(mixin (basic<%>) (info<%>) args
(inherit get-frame run-after-edit-sequence)
(inherit get-top-level-window run-after-edit-sequence)
(rename [super-lock lock])
(override
[lock
@ -313,57 +287,8 @@
(run-after-edit-sequence
(rec send-frame-update-lock-icon
(lambda ()
(let ([frame (get-frame)])
(let ([frame (get-top-level-window)])
(when frame
(send frame lock-status-changed)))))
'framework:update-lock-icon))])
(sequence (apply super-init args))))
(define make-clever-file-format%
(mixin (editor<%>) (editor<%>) args
(inherit get-file-format set-file-format ;find-first-snip wx:
)
(rename [super-on-save-file on-save-file]
[super-after-save-file after-save-file])
(private [restore-file-format void])
(override
[after-save-file
(lambda (success)
(restore-file-format)
(super-after-save-file success))]
[on-save-file
(let ([has-non-string-snips
(lambda ()
(let loop ([s (if (is-a? this pasteboard%)
(send this find-first-snip)
(send this find-snip 0 'after))]) ;; wx:
(cond
[(null? s) #f]
[(is-a? s string-snip%)
(loop (send s next))]
[else #t])))])
(lambda (name format)
(when (and (or (eq? format 'same)
(eq? format 'copy))
(not (eq? (get-file-format)
'std)))
(cond
[(eq? format 'copy)
(set! restore-file-format
(let ([f (get-file-format)])
(lambda ()
(set! restore-file-format void)
(set-file-format f))))
(set-file-format 'std)]
[(and (has-non-string-snips)
(or (not (preferences:get 'framework:verify-change-format))
(gui-utils:get-choice "Save this file as plain text?" "No" "Yes")))
(set-file-format 'std)]
[else (void)]))
(or (super-on-save-file name format)
(begin
(restore-file-format)
#f))))])
(sequence (apply super-init args)))))

View File

@ -1,4 +1,4 @@
(unit/sig framework:exit^
(dunit/sig framework:exit^
(import [preferences : framework:preferences^]
[gui-utils : framework:gui-utils^])
(rename (-exit exit))

View File

@ -1,5 +1,5 @@
(unit/sig framework:path-utils^
(dunit/sig framework:path-utils^
(import)
(define generate-autosave-name

View File

@ -2,7 +2,7 @@
;;; Authors: Matthew Flatt, Robby Findler, Paul Steckler
(unit/sig framework:finder^
(dunit/sig framework:finder^
(import mred-interfaces^
[preferences : framework:preferences^]
[gui-utils : framework:gui-utils^]
@ -62,8 +62,7 @@
file-filter
file-filter-msg)
(inherit new-line tab fit center
popup-menu show)
(inherit center show)
(private
[WIDTH 500]
@ -310,8 +309,9 @@
[do-cancel
(lambda args
(set-box! result-box #f)
(show #f))]
(show #f))])
(override
[on-close (lambda () #f)])
(sequence

File diff suppressed because it is too large Load Diff

View File

@ -1,199 +1,200 @@
(unit/sig framework:group^
(dunit/sig framework:group^
(import mred-interfaces^
[exit : framework:exit^]
[frame : framework:frame^]
[mzlib:function : mzlib:function^]
[mzlib:file : mzlib:file^])
(define-struct frame (frame id))
(define %
(let-struct frame (frame id)
(class null ()
(private
[active-frame #f]
[frame-counter 0]
[frames null]
[todo-to-new-frames void]
[empty-close-down (lambda () (void))]
[empty-test (lambda () #t)]
[windows-menus null])
(class null ()
(private
[active-frame #f]
[frame-counter 0]
[frames null]
[todo-to-new-frames void]
[empty-close-down (lambda () (void))]
[empty-test (lambda () #t)]
(private
[get-windows-menu
(lambda (frame)
(and (ivar-in-class? 'windows-menu (object-class frame))
(ivar frame windows-menu)))]
[insert-windows-menu
(lambda (frame)
(let ([menu (get-windows-menu frame)])
(when menu
(set! windows-menus (cons (list menu) windows-menus)))))]
[remove-windows-menu
(lambda (frame)
(let* ([menu (get-windows-menu frame)])
(set! windows-menus
(mzlib:function:remove
menu
windows-menus
(lambda (x y)
(eq? x (car y)))))))]
[windows-menus null])
(private
[get-windows-menu
(lambda (frame)
(and (ivar-in-class? 'windows-menu (object-class frame))
(ivar frame windows-menu)))]
[insert-windows-menu
(lambda (frame)
(let ([menu (get-windows-menu frame)])
(when menu
(set! windows-menus (cons (list menu) windows-menus)))))]
[remove-windows-menu
(lambda (frame)
(let* ([menu (get-windows-menu frame)])
(set! windows-menus
(mzlib:function:remove
menu
windows-menus
(lambda (x y)
(eq? x (car y)))))))]
[update-windows-menus
(lambda ()
(let* ([windows (length windows-menus)]
[get-name (lambda (frame) (send (frame-frame frame) get-label))]
[sorted-frames
(mzlib:function:quicksort
frames
(lambda (f1 f2)
(string-ci<=? (get-name f1)
(get-name f2))))])
(set!
windows-menus
(map
(lambda (menu-list)
(let ([menu (car menu-list)]
[old-ids (cdr menu-list)])
(for-each (lambda (id) (send menu delete id))
old-ids)
(let ([new-ids
(map
(lambda (frame)
(let ([frame (frame-frame frame)]
[default-name "Untitled"])
(send menu append-item
(let ([label (send frame get-label)])
(if (string=? label "")
(if (ivar-in-class? 'get-entire-label (object-class frame))
(let ([label (send frame get-entire-label)])
(if (string=? label "")
default-name
label))
default-name)
label))
(lambda ()
(send frame show #t)))))
sorted-frames)])
(cons menu new-ids))))
windows-menus))))])
(private
[update-close-menu-item-state
(lambda ()
(let* ([set-close-menu-item-state!
(lambda (frame state)
(when (is-a? frame frame:standard-menus<%>)
(let ([close-menu-item (ivar frame file-menu:close-menu)])
(when close-menu-item
(send close-menu-item enable state)))))])
[update-windows-menus
(lambda ()
(let* ([windows (length windows-menus)]
[get-name (lambda (frame) (send (frame-frame frame) get-label))]
[sorted-frames
(mzlib:function:quicksort
frames
(lambda (f1 f2)
(string-ci<=? (get-name f1)
(get-name f2))))])
(set!
windows-menus
(map
(lambda (menu-list)
(let ([menu (car menu-list)]
[old-ids (cdr menu-list)])
(for-each (lambda (id) (send menu delete id))
old-ids)
(let ([new-ids
(map
(lambda (frame)
(let ([frame (frame-frame frame)]
[default-name "Untitled"])
(send menu append-item
(let ([label (send frame get-label)])
(if (string=? label "")
(if (ivar-in-class? 'get-entire-label (object-class frame))
(let ([label (send frame get-entire-label)])
(if (string=? label "")
default-name
label))
default-name)
label))
(lambda ()
(send frame show #t)))))
sorted-frames)])
(cons menu new-ids))))
windows-menus))))])
(private
[update-close-menu-item-state
(lambda ()
(let* ([set-close-menu-item-state!
(lambda (frame state)
(when (is-a? frame frame:standard-menus<%>)
(let ([close-menu-item (ivar frame file-menu:close-menu)])
(when close-menu-item
(send close-menu-item enable state)))))])
(if (eq? (length frames) 1)
(set-close-menu-item-state! (car frames) #f)
(for-each (lambda (a-frame)
(set-close-menu-item-state! a-frame #t))
frames))))])
(public
[set-empty-callbacks
(lambda (test close-down)
(set! empty-test test)
(set! empty-close-down close-down))]
[get-frames (lambda () (map frame-frame frames))]
[frame-label-changed
(lambda (frame)
(when (member frame (map frame-frame frames))
(update-windows-menus)))]
[for-each-frame
(lambda (f)
(for-each (lambda (x) (f (frame-frame x))) frames)
(set! todo-to-new-frames
(let ([old todo-to-new-frames])
(lambda (frame) (old frame) (f frame)))))]
[get-active-frame
(lambda ()
(cond
[active-frame active-frame]
[(null? frames) #f]
[else (frame-frame (car frames))]))]
[set-active-frame
(lambda (f)
(set! active-frame f))]
[insert-frame
(lambda (f)
(set! frame-counter (add1 frame-counter))
(let ([new-frames (cons (make-frame f frame-counter)
frames)])
(set! frames new-frames)
(update-close-menu-item-state)
(insert-windows-menu f)
(update-windows-menus))
(todo-to-new-frames f))]
[can-remove-frame?
(opt-lambda (f)
(let ([new-frames
(mzlib:function:remove
f frames
(lambda (f fr) (eq? f (frame-frame fr))))])
(if (null? new-frames)
(empty-test)
#t)))]
[remove-frame
(opt-lambda (f)
(when (eq? f active-frame)
(set! active-frame #f))
(let ([new-frames
(mzlib:function:remove
f frames
(lambda (f fr) (eq? f (frame-frame fr))))])
(set! frames new-frames)
(update-close-menu-item-state)
(remove-windows-menu f)
(update-windows-menus)
(when (null? frames)
(empty-close-down))))]
[clear
(lambda ()
(and (empty-test)
(begin (set! frames null)
(empty-close-down)
#t)))]
[close-all
(lambda ()
(let/ec escape
(for-each (lambda (f)
(let ([frame (frame-frame f)])
(if (send frame on-close)
(send frame show #f)
(escape #f))))
frames)
#t))]
[locate-file
(lambda (name)
(let* ([normalized
;; allow for the possiblity of filenames that are urls
(with-handlers ([(lambda (x) #t)
(lambda (x) name)])
(mzlib:file:normalize-path name))]
[test-frame
(lambda (frame)
(and (ivar-in-class? 'get-edit (object-class frame))
(let* ([edit (send frame get-edit)]
[filename (send edit get-filename)])
(and (ivar edit editing-this-file?)
(string? filename)
(string=? normalized
(with-handlers ([(lambda (x) #t)
(lambda (x) filename)])
(mzlib:file:normalize-path
filename)))))))])
(let loop ([frames frames])
(cond
[(null? frames) #f]
[else
(let* ([frame (frame-frame (car frames))])
(if (test-frame frame)
frame
(loop (cdr frames))))]))))]))))
(public
[set-empty-callbacks
(lambda (test close-down)
(set! empty-test test)
(set! empty-close-down close-down))]
[get-frames (lambda () (map frame-frame frames))]
[frame-label-changed
(lambda (frame)
(when (member frame (map frame-frame frames))
(update-windows-menus)))]
[for-each-frame
(lambda (f)
(for-each (lambda (x) (f (frame-frame x))) frames)
(set! todo-to-new-frames
(let ([old todo-to-new-frames])
(lambda (frame) (old frame) (f frame)))))]
[get-active-frame
(lambda ()
(cond
[active-frame active-frame]
[(null? frames) #f]
[else (frame-frame (car frames))]))]
[set-active-frame
(lambda (f)
(set! active-frame f))]
[insert-frame
(lambda (f)
(set! frame-counter (add1 frame-counter))
(let ([new-frames (cons (make-frame f frame-counter)
frames)])
(set! frames new-frames)
(update-close-menu-item-state)
(insert-windows-menu f)
(update-windows-menus))
(todo-to-new-frames f))]
[can-remove-frame?
(opt-lambda (f)
(let ([new-frames
(mzlib:function:remove
f frames
(lambda (f fr) (eq? f (frame-frame fr))))])
(if (null? new-frames)
(empty-test)
#t)))]
[remove-frame
(opt-lambda (f)
(when (eq? f active-frame)
(set! active-frame #f))
(let ([new-frames
(mzlib:function:remove
f frames
(lambda (f fr) (eq? f (frame-frame fr))))])
(set! frames new-frames)
(update-close-menu-item-state)
(remove-windows-menu f)
(update-windows-menus)
(when (null? frames)
(empty-close-down))))]
[clear
(lambda ()
(and (empty-test)
(begin (set! frames null)
(empty-close-down)
#t)))]
[close-all
(lambda ()
(let/ec escape
(for-each (lambda (f)
(let ([frame (frame-frame f)])
(if (send frame on-close)
(send frame show #f)
(escape #f))))
frames)
#t))]
[locate-file
(lambda (name)
(let* ([normalized
;; allow for the possiblity of filenames that are urls
(with-handlers ([(lambda (x) #t)
(lambda (x) name)])
(mzlib:file:normalize-path name))]
[test-frame
(lambda (frame)
(and (ivar-in-class? 'get-edit (object-class frame))
(let* ([edit (send frame get-edit)]
[filename (send edit get-filename)])
(and (send edit editing-this-file?)
(string? filename)
(string=? normalized
(with-handlers ([(lambda (x) #t)
(lambda (x) filename)])
(mzlib:file:normalize-path
filename)))))))])
(let loop ([frames frames])
(cond
[(null? frames) #f]
[else
(let* ([frame (frame-frame (car frames))])
(if (test-frame frame)
frame
(loop (cdr frames))))]))))])))
(define the-frame-group (make-object %)))

View File

@ -1,4 +1,4 @@
(unit/sig framework:gui-utils^
(dunit/sig framework:gui-utils^
(import mred-interfaces^)
(define cursor-delay

View File

@ -1,4 +1,4 @@
(unit/sig framework:handler^
(dunit/sig framework:handler^
(import mred-interfaces^
[gui-utils : framework:gui-utils^]
[finder : framework:finder^]

View File

@ -1,4 +1,4 @@
(unit/sig framework:icon^
(dunit/sig framework:icon^
(import mred-interfaces^)
(define icon-path
@ -16,16 +16,16 @@
(begin (set! bitmap (make-object % p type))
bitmap)))))
(define (load-bitmap/mdc % name type)
(define (load-bitmap/bdc % name type)
(let* ([p (build-path icon-path name)]
[bitmap #f]
[memory-dc #f]
[bitmap-dc #f]
[force
(lambda ()
(set! bitmap (make-object % p type))
(set! memory-dc (make-object memory-dc%))
(set! bitmap-dc (make-object bitmap-dc%))
(when (send bitmap ok?)
(send memory-dc select-object bitmap)))])
(send bitmap-dc select-object bitmap)))])
(unless (file-exists? p)
(fprintf (current-error-port) "WARNING: couldn't find ~a~n" p))
(values
@ -34,16 +34,16 @@
(begin (force)
bitmap)))
(lambda ()
(or memory-dc
(or bitmap-dc
(begin (force)
memory-dc))))))
bitmap-dc))))))
(define-values (get-anchor-bitmap get-anchor-mdc)
(load-bitmap/mdc bitmap% "anchor.gif" 'gif))
(define-values (get-lock-bitmap get-lock-mdc)
(load-bitmap/mdc bitmap% "lock.gif" 'gif))
(define-values (get-unlock-bitmap get-unlock-mdc)
(load-bitmap/mdc bitmap% "unlock.gif" 'gif))
(define-values (get-anchor-bitmap get-anchor-bdc)
(load-bitmap/bdc bitmap% "anchor.gif" 'gif))
(define-values (get-lock-bitmap get-lock-bdc)
(load-bitmap/bdc bitmap% "lock.gif" 'gif))
(define-values (get-unlock-bitmap get-unlock-bdc)
(load-bitmap/bdc bitmap% "unlock.gif" 'gif))
(define get-autowrap-bitmap (load-icon bitmap% "return.xbm" 'xbm))
(define get-paren-highlight-bitmap (load-icon bitmap% "paren.xbm" 'xbm))
@ -57,7 +57,7 @@
(lambda ()
(or icon
(begin
(set! icon (make-object icon% p 'xbm))
(set! icon (make-object bitmap% p 'xbm))
icon)))))
(define-values (get-gc-on-dc get-gc-width get-gc-height)
@ -65,14 +65,14 @@
"recycle.gif"
'gif)]
[bitmap #f]
[mdc #f]
[bdc #f]
[fetch
(lambda ()
(unless mdc
(set! mdc (make-object memory-dc%))
(unless bdc
(set! bdc (make-object bitmap-dc%))
(set! bitmap (get-bitmap))
(send mdc select-object bitmap)))])
(values (lambda () (fetch) mdc)
(send bdc select-object bitmap)))])
(values (lambda () (fetch) bdc)
(lambda () (fetch) (if (send bitmap ok?)
(send bitmap get-width)
10))
@ -81,15 +81,15 @@
10)))))
(define get-gc-off-dc
(let ([mdc #f])
(let ([bdc #f])
(lambda ()
(if mdc
mdc
(if bdc
bdc
(begin
(set! mdc (make-object memory-dc%))
(send mdc select-object
(set! bdc (make-object bitmap-dc%))
(send bdc select-object
(make-object bitmap%
(get-gc-width)
(get-gc-height)))
(send mdc clear)
mdc))))))
(send bdc clear)
bdc))))))

View File

@ -1,4 +1,4 @@
(unit/sig framework:keymap^
(dunit/sig framework:keymap^
(import mred-interfaces^
[preferences : framework:preferences^]
[finder : framework:finder^]

View File

@ -1,4 +1,4 @@
(unit/sig ()
(dunit/sig framework:main^
(import mred-interfaces^
[preferences : framework:preferences^]
[exit : framework:exit^]
@ -16,14 +16,10 @@
(preferences:set-default 'framework:show-status-line #t boolean?)
(preferences:set-default 'framework:line-offsets #t boolean?)
(preferences:set 'framework:print-output-mode
'standard
(lambda (x) (or (eq? x 'standard) (eq? x 'postscript))))
(preferences:set-default
'framework:print-output-mode
'standard
(lambda (x) (or (eq? x 'standard) (eq? x 'postscript))))
(preferences:set-default 'framework:highlight-parens #t boolean?)
(preferences:set-default 'framework:fixup-parens #t boolean?)
@ -75,14 +71,15 @@
(preferences:set-default 'framework:delete-forward?
(not (eq? (system-type) 'unix))
boolean?)
(preferences:set 'framework:show-periods-in-dirlist #f boolean?)
(preferences:set 'framework:file-dialogs
(if (eq? (system-type) 'unix)
'common
'std)
(lambda (x)
(or (eq? x 'common)
(eq? x 'std))))
(preferences:set-default 'framework:show-periods-in-dirlist #f boolean?)
(preferences:set-default
'framework:file-dialogs
(if (eq? (system-type) 'unix)
'common
'std)
(lambda (x)
(or (eq? x 'common)
(eq? x 'std))))
(preferences:add-panel
"Indenting"

View File

@ -1,24 +1,26 @@
(unit/sig framework:panel^
(dunit/sig framework:panel^
(import mred-interfaces^
[mzlib:function : mzlib:function^])
(define single<%> (interface (panel%)))
(define make-single%
(rename [-editor<%> editor<%>])
(define single<%> (interface (panel<%>)))
(define single-mixin
(mixin (panel<%>) (single<%>) args
(sequence
(apply super-init args))))
(define single% vertical-panel%)
(define single% (single-mixin vertical-panel%))
(define edit<%>
(define -editor<%>
(interface ()
get-canvas%
collapse
split))
(define make-edit%
(mixin (panel<%>) (edit<%>) args
(define editor-mixin
(mixin (panel<%>) (-editor<%>) args
(rename [super-change-children change-children])
(inherit get-parent change-children children)
(inherit get-parent change-children get-children)
(public [get-canvas% (lambda () editor-canvas%)])
(private
[split-edits null])
@ -30,26 +32,27 @@
(letrec ([helper
(lambda (canvas/panel)
(if (eq? canvas/panel this)
(begin (cond
[(and (= (length children) 1)
(eq? canvas (car children)))
(void)]
[(member canvas children)
(change-children (lambda (l) (list canvas)))]
[else
(change-children
(lambda (l)
(let ([c (make-object (object-class canvas) this)])
(send c set-media media)
(list c))))])
(let ([children (get-children)])
(cond
[(and (= (length children) 1)
(eq? canvas (car children)))
(void)]
[(member canvas children)
(change-children (lambda (l) (list canvas)))]
[else
(change-children
(lambda (l)
(let ([c (make-object (object-class canvas) this)])
(send c set-media media)
(list c))))])
(bell))
(let* ([parent (send canvas/panel get-parent)]
[parents-children (ivar parent children)]
[parents-children (send parent get-children)]
[num-children (length parents-children)])
(if (<= num-children 1)
(helper parent)
(begin (send parent delete-child canvas/panel)
(send (car (ivar parent children)) focus))))))])
(send (car (send parent get-children)) focus))))))])
(send media remove-canvas canvas)
(helper canvas))
(bell))))]
@ -87,7 +90,7 @@
(send* right-split (set-media media))))])
(sequence (apply super-init args))))
(define horizontal-edit%
(make-edit% horizontal-panel%))
(define vertical-edit%
(make-edit% vertical-panel%)))
(define horizontal-editor%
(editor-mixin horizontal-panel%))
(define vertical-editor%
(editor-mixin vertical-panel%)))