..
original commit: 66b994ad812701bb81802b48e2c6cdf1523b8fa8
This commit is contained in:
parent
b1c16cfbeb
commit
0403e29bdc
|
@ -40,223 +40,224 @@
|
||||||
save-file/gui-error))
|
save-file/gui-error))
|
||||||
|
|
||||||
(define basic-mixin
|
(define basic-mixin
|
||||||
(mixin (editor<%>) (basic<%>)
|
(let ([mred:get-file get-file])
|
||||||
|
(mixin (editor<%>) (basic<%>)
|
||||||
(inherit get-filename save-file)
|
|
||||||
(define/public save-file/gui-error
|
(inherit get-filename save-file)
|
||||||
(opt-lambda ([input-filename #f]
|
(define/public save-file/gui-error
|
||||||
[fmt 'same]
|
(opt-lambda ([input-filename #f]
|
||||||
[show-errors? #t])
|
[fmt 'same]
|
||||||
(let ([filename (if (or (not input-filename)
|
[show-errors? #t])
|
||||||
(equal? input-filename ""))
|
(let ([filename (if (or (not input-filename)
|
||||||
(let ([internal-filename (get-filename)])
|
(equal? input-filename ""))
|
||||||
(if (or (not internal-filename)
|
(let ([internal-filename (get-filename)])
|
||||||
(equal? internal-filename ""))
|
(if (or (not internal-filename)
|
||||||
(get-file)
|
(equal? internal-filename ""))
|
||||||
internal-filename))
|
(mred:get-file)
|
||||||
input-filename)])
|
internal-filename))
|
||||||
(if filename
|
input-filename)])
|
||||||
(let ([result (save-file filename fmt #f)])
|
(if filename
|
||||||
(unless result
|
(let ([result (save-file filename fmt #f)])
|
||||||
(when show-errors?
|
(unless result
|
||||||
(message-box
|
(when show-errors?
|
||||||
(string-constant error-saving)
|
(message-box
|
||||||
(format (string-constant error-saving-file/name)
|
(string-constant error-saving)
|
||||||
filename))))
|
(format (string-constant error-saving-file/name)
|
||||||
result)
|
filename))))
|
||||||
#f))))
|
result)
|
||||||
|
#f))))
|
||||||
(inherit refresh-delayed?
|
|
||||||
get-canvas
|
(inherit refresh-delayed?
|
||||||
get-max-width get-admin)
|
get-canvas
|
||||||
|
get-max-width get-admin)
|
||||||
(rename [super-can-save-file? can-save-file?])
|
|
||||||
(override can-save-file?)
|
(rename [super-can-save-file? can-save-file?])
|
||||||
[define can-save-file?
|
(override can-save-file?)
|
||||||
(lambda (filename format)
|
[define can-save-file?
|
||||||
(and (if (equal? filename (get-filename))
|
(lambda (filename format)
|
||||||
(if (save-file-out-of-date?)
|
(and (if (equal? filename (get-filename))
|
||||||
(gui-utils:get-choice
|
(if (save-file-out-of-date?)
|
||||||
(string-constant file-has-been-modified)
|
(gui-utils:get-choice
|
||||||
(string-constant overwrite-file-button-label)
|
(string-constant file-has-been-modified)
|
||||||
(string-constant cancel)
|
(string-constant overwrite-file-button-label)
|
||||||
(string-constant warning)
|
(string-constant cancel)
|
||||||
#f
|
(string-constant warning)
|
||||||
(get-top-level-focus-window))
|
#f
|
||||||
#t)
|
(get-top-level-focus-window))
|
||||||
#t)
|
#t)
|
||||||
(super-can-save-file? filename format)))]
|
#t)
|
||||||
|
(super-can-save-file? filename format)))]
|
||||||
(rename [super-after-save-file after-save-file]
|
|
||||||
[super-after-load-file after-load-file])
|
(rename [super-after-save-file after-save-file]
|
||||||
[define last-saved-file-time #f]
|
[super-after-load-file after-load-file])
|
||||||
|
[define last-saved-file-time #f]
|
||||||
[define/override after-save-file
|
|
||||||
(lambda (sucess?)
|
[define/override after-save-file
|
||||||
|
(lambda (sucess?)
|
||||||
;; update recently opened file names
|
|
||||||
(let* ([temp-b (box #f)]
|
;; update recently opened file names
|
||||||
[filename (get-filename temp-b)])
|
(let* ([temp-b (box #f)]
|
||||||
(unless (unbox temp-b)
|
[filename (get-filename temp-b)])
|
||||||
(when filename
|
(unless (unbox temp-b)
|
||||||
(handler:add-to-recent filename))))
|
(when filename
|
||||||
|
(handler:add-to-recent filename))))
|
||||||
;; update last-saved-file-time
|
|
||||||
(when sucess?
|
;; update last-saved-file-time
|
||||||
(let ([filename (get-filename)])
|
(when sucess?
|
||||||
(set! last-saved-file-time
|
(let ([filename (get-filename)])
|
||||||
(and filename
|
(set! last-saved-file-time
|
||||||
(file-exists? filename)
|
(and filename
|
||||||
(file-or-directory-modify-seconds filename)))))
|
(file-exists? filename)
|
||||||
|
(file-or-directory-modify-seconds filename)))))
|
||||||
(super-after-save-file sucess?))]
|
|
||||||
|
(super-after-save-file sucess?))]
|
||||||
[define/override after-load-file
|
|
||||||
(lambda (sucess?)
|
[define/override after-load-file
|
||||||
(when sucess?
|
(lambda (sucess?)
|
||||||
(let ([filename (get-filename)])
|
(when sucess?
|
||||||
(set! last-saved-file-time
|
(let ([filename (get-filename)])
|
||||||
(and filename
|
(set! last-saved-file-time
|
||||||
(file-exists? filename)
|
(and filename
|
||||||
(file-or-directory-modify-seconds filename)))))
|
(file-exists? filename)
|
||||||
(super-after-load-file sucess?))]
|
(file-or-directory-modify-seconds filename)))))
|
||||||
(public save-file-out-of-date?)
|
(super-after-load-file sucess?))]
|
||||||
[define save-file-out-of-date?
|
(public save-file-out-of-date?)
|
||||||
(lambda ()
|
[define save-file-out-of-date?
|
||||||
(and
|
(lambda ()
|
||||||
last-saved-file-time
|
(and
|
||||||
(let ([fn (get-filename)])
|
last-saved-file-time
|
||||||
(and fn
|
(let ([fn (get-filename)])
|
||||||
(file-exists? fn)
|
(and fn
|
||||||
(let ([ms (file-or-directory-modify-seconds fn)])
|
(file-exists? fn)
|
||||||
(< last-saved-file-time ms))))))]
|
(let ([ms (file-or-directory-modify-seconds fn)])
|
||||||
|
(< last-saved-file-time ms))))))]
|
||||||
[define has-focus #f]
|
|
||||||
(rename [super-on-focus on-focus])
|
[define has-focus #f]
|
||||||
(override on-focus)
|
(rename [super-on-focus on-focus])
|
||||||
[define on-focus
|
(override on-focus)
|
||||||
(lambda (x)
|
[define on-focus
|
||||||
(set! has-focus x))]
|
(lambda (x)
|
||||||
(public has-focus?)
|
(set! has-focus x))]
|
||||||
[define has-focus?
|
(public has-focus?)
|
||||||
(lambda ()
|
[define has-focus?
|
||||||
has-focus)]
|
(lambda ()
|
||||||
|
has-focus)]
|
||||||
(public on-close get-top-level-window)
|
|
||||||
[define on-close (lambda () (void))]
|
(public on-close get-top-level-window)
|
||||||
[define get-top-level-window
|
[define on-close (lambda () (void))]
|
||||||
(lambda ()
|
[define get-top-level-window
|
||||||
(let loop ([text this])
|
(lambda ()
|
||||||
(let ([editor-admin (send text get-admin)])
|
(let loop ([text this])
|
||||||
(cond
|
(let ([editor-admin (send text get-admin)])
|
||||||
[(is-a? editor-admin editor-snip-editor-admin<%>)
|
(cond
|
||||||
(let* ([snip (send editor-admin get-snip)]
|
[(is-a? editor-admin editor-snip-editor-admin<%>)
|
||||||
[snip-admin (send snip get-admin)])
|
(let* ([snip (send editor-admin get-snip)]
|
||||||
(loop (send snip-admin get-editor)))]
|
[snip-admin (send snip get-admin)])
|
||||||
[(send text get-canvas) => (lambda (canvas)
|
(loop (send snip-admin get-editor)))]
|
||||||
(send canvas get-top-level-window))]
|
[(send text get-canvas) => (lambda (canvas)
|
||||||
[else
|
(send canvas get-top-level-window))]
|
||||||
#f]))))]
|
[else
|
||||||
|
#f]))))]
|
||||||
(public editing-this-file?)
|
|
||||||
[define editing-this-file? (lambda () #f)]
|
(public editing-this-file?)
|
||||||
|
[define editing-this-file? (lambda () #f)]
|
||||||
[define edit-sequence-queue null]
|
|
||||||
[define edit-sequence-ht (make-hash-table)]
|
[define edit-sequence-queue null]
|
||||||
[define in-local-edit-sequence? #f]
|
[define edit-sequence-ht (make-hash-table)]
|
||||||
(public local-edit-sequence? run-after-edit-sequence extend-edit-sequence-queue)
|
[define in-local-edit-sequence? #f]
|
||||||
[define local-edit-sequence? (lambda () in-local-edit-sequence?)]
|
(public local-edit-sequence? run-after-edit-sequence extend-edit-sequence-queue)
|
||||||
[define run-after-edit-sequence
|
[define local-edit-sequence? (lambda () in-local-edit-sequence?)]
|
||||||
(case-lambda
|
[define run-after-edit-sequence
|
||||||
[(t) (run-after-edit-sequence t #f)]
|
(case-lambda
|
||||||
[(t sym)
|
[(t) (run-after-edit-sequence t #f)]
|
||||||
(unless (and (procedure? t)
|
[(t sym)
|
||||||
(= 0 (procedure-arity t)))
|
(unless (and (procedure? t)
|
||||||
(error 'editor:basic::run-after-edit-sequence
|
(= 0 (procedure-arity t)))
|
||||||
"expected procedure of arity zero, got: ~s~n" t))
|
(error 'editor:basic::run-after-edit-sequence
|
||||||
(unless (or (symbol? sym) (not sym))
|
"expected procedure of arity zero, got: ~s~n" t))
|
||||||
(error 'editor:basic::run-after-edit-sequence
|
(unless (or (symbol? sym) (not sym))
|
||||||
"expected second argument to be a symbol or #f, got: ~s~n"
|
(error 'editor:basic::run-after-edit-sequence
|
||||||
sym))
|
"expected second argument to be a symbol or #f, got: ~s~n"
|
||||||
(if (refresh-delayed?)
|
sym))
|
||||||
(if in-local-edit-sequence?
|
(if (refresh-delayed?)
|
||||||
(cond
|
(if in-local-edit-sequence?
|
||||||
[(symbol? sym)
|
|
||||||
(hash-table-put! edit-sequence-ht sym t)]
|
|
||||||
[else (set! edit-sequence-queue
|
|
||||||
(cons t edit-sequence-queue))])
|
|
||||||
(let ([snip-admin (get-admin)])
|
|
||||||
(cond
|
|
||||||
[(not snip-admin)
|
|
||||||
(t)] ;; refresh-delayed? is always #t when there is no admin.
|
|
||||||
[(is-a? snip-admin editor-snip-editor-admin<%>)
|
|
||||||
(send (send (send (send snip-admin get-snip) get-admin) get-editor)
|
|
||||||
run-after-edit-sequence t sym)]
|
|
||||||
[else
|
|
||||||
(message-box "run-after-edit-sequence error"
|
|
||||||
(format "refresh-delayed? is #t but snip admin, ~s, is not an editor-snip-editor-admin<%>"
|
|
||||||
snip-admin))
|
|
||||||
'(t)])))
|
|
||||||
(t))
|
|
||||||
(void)])]
|
|
||||||
[define extend-edit-sequence-queue
|
|
||||||
(lambda (l ht)
|
|
||||||
(hash-table-for-each ht (lambda (k t)
|
|
||||||
(hash-table-put!
|
|
||||||
edit-sequence-ht
|
|
||||||
k t)))
|
|
||||||
(set! edit-sequence-queue (append l edit-sequence-queue)))]
|
|
||||||
(rename
|
|
||||||
[super-after-edit-sequence after-edit-sequence]
|
|
||||||
[super-on-edit-sequence on-edit-sequence])
|
|
||||||
(override on-edit-sequence after-edit-sequence)
|
|
||||||
[define on-edit-sequence
|
|
||||||
(lambda ()
|
|
||||||
(super-on-edit-sequence)
|
|
||||||
(set! in-local-edit-sequence? #t))]
|
|
||||||
[define after-edit-sequence
|
|
||||||
(lambda ()
|
|
||||||
(set! in-local-edit-sequence? #f)
|
|
||||||
(super-after-edit-sequence)
|
|
||||||
(let ([queue edit-sequence-queue]
|
|
||||||
[ht edit-sequence-ht]
|
|
||||||
[find-enclosing-edit
|
|
||||||
(lambda (edit)
|
|
||||||
(let ([admin (send edit get-admin)])
|
|
||||||
(cond
|
(cond
|
||||||
[(is-a? admin editor-snip-editor-admin<%>)
|
[(symbol? sym)
|
||||||
(send (send (send admin get-snip) get-admin) get-editor)]
|
(hash-table-put! edit-sequence-ht sym t)]
|
||||||
[else #f])))])
|
[else (set! edit-sequence-queue
|
||||||
(set! edit-sequence-queue null)
|
(cons t edit-sequence-queue))])
|
||||||
(set! edit-sequence-ht (make-hash-table))
|
(let ([snip-admin (get-admin)])
|
||||||
(let loop ([edit (find-enclosing-edit this)])
|
(cond
|
||||||
(cond
|
[(not snip-admin)
|
||||||
[(and edit (not (send edit local-edit-sequence?)))
|
(t)] ;; refresh-delayed? is always #t when there is no admin.
|
||||||
(loop (find-enclosing-edit edit))]
|
[(is-a? snip-admin editor-snip-editor-admin<%>)
|
||||||
[edit (send edit extend-edit-sequence-queue queue ht)]
|
(send (send (send (send snip-admin get-snip) get-admin) get-editor)
|
||||||
[else
|
run-after-edit-sequence t sym)]
|
||||||
(hash-table-for-each ht (lambda (k t) (t)))
|
[else
|
||||||
(for-each (lambda (t) (t)) queue)]))))]
|
(message-box "run-after-edit-sequence error"
|
||||||
|
(format "refresh-delayed? is #t but snip admin, ~s, is not an editor-snip-editor-admin<%>"
|
||||||
(override on-new-box)
|
snip-admin))
|
||||||
[define on-new-box
|
'(t)])))
|
||||||
(lambda (type)
|
(t))
|
||||||
(cond
|
(void)])]
|
||||||
[(eq? type 'text) (make-object editor-snip% (make-object text:basic%))]
|
[define extend-edit-sequence-queue
|
||||||
[else (make-object editor-snip% (make-object pasteboard:basic%))]))]
|
(lambda (l ht)
|
||||||
|
(hash-table-for-each ht (lambda (k t)
|
||||||
|
(hash-table-put!
|
||||||
(override get-file put-file)
|
edit-sequence-ht
|
||||||
[define get-file (lambda (d)
|
k t)))
|
||||||
(parameterize ([finder:dialog-parent-parameter
|
(set! edit-sequence-queue (append l edit-sequence-queue)))]
|
||||||
(get-top-level-window)])
|
(rename
|
||||||
(finder:get-file d)))]
|
[super-after-edit-sequence after-edit-sequence]
|
||||||
[define put-file (lambda (d f) (parameterize ([finder:dialog-parent-parameter
|
[super-on-edit-sequence on-edit-sequence])
|
||||||
(get-top-level-window)])
|
(override on-edit-sequence after-edit-sequence)
|
||||||
(finder:put-file f d)))]
|
[define on-edit-sequence
|
||||||
|
(lambda ()
|
||||||
|
(super-on-edit-sequence)
|
||||||
(super-instantiate ())))
|
(set! in-local-edit-sequence? #t))]
|
||||||
|
[define after-edit-sequence
|
||||||
|
(lambda ()
|
||||||
|
(set! in-local-edit-sequence? #f)
|
||||||
|
(super-after-edit-sequence)
|
||||||
|
(let ([queue edit-sequence-queue]
|
||||||
|
[ht edit-sequence-ht]
|
||||||
|
[find-enclosing-edit
|
||||||
|
(lambda (edit)
|
||||||
|
(let ([admin (send edit get-admin)])
|
||||||
|
(cond
|
||||||
|
[(is-a? admin editor-snip-editor-admin<%>)
|
||||||
|
(send (send (send admin get-snip) get-admin) get-editor)]
|
||||||
|
[else #f])))])
|
||||||
|
(set! edit-sequence-queue null)
|
||||||
|
(set! edit-sequence-ht (make-hash-table))
|
||||||
|
(let loop ([edit (find-enclosing-edit this)])
|
||||||
|
(cond
|
||||||
|
[(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)]))))]
|
||||||
|
|
||||||
|
(override on-new-box)
|
||||||
|
[define on-new-box
|
||||||
|
(lambda (type)
|
||||||
|
(cond
|
||||||
|
[(eq? type 'text) (make-object editor-snip% (make-object text:basic%))]
|
||||||
|
[else (make-object editor-snip% (make-object pasteboard:basic%))]))]
|
||||||
|
|
||||||
|
|
||||||
|
(override get-file put-file)
|
||||||
|
[define get-file (lambda (d)
|
||||||
|
(parameterize ([finder:dialog-parent-parameter
|
||||||
|
(get-top-level-window)])
|
||||||
|
(finder:get-file d)))]
|
||||||
|
[define put-file (lambda (d f) (parameterize ([finder:dialog-parent-parameter
|
||||||
|
(get-top-level-window)])
|
||||||
|
(finder:put-file f d)))]
|
||||||
|
|
||||||
|
|
||||||
|
(super-instantiate ()))))
|
||||||
|
|
||||||
(define -keymap<%> (interface (basic<%>) get-keymaps))
|
(define -keymap<%> (interface (basic<%>) get-keymaps))
|
||||||
(define keymap-mixin
|
(define keymap-mixin
|
||||||
|
|
Loading…
Reference in New Issue
Block a user