Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 53 additions & 21 deletions handin-client/client-gui.rkt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

(require racket/class racket/unit racket/file racket/gui/base net/sendurl
mrlib/switchable-button mrlib/bitmap-label drracket/tool framework
drracket/private/auto-language
"info.rkt" "client.rkt" "this-collection.rkt")

(provide tool@)
Expand Down Expand Up @@ -708,25 +709,6 @@

(define handin-icon (scale-by-half (in-this-collection "icon.png")))

(define (editors->string editors)
(let* ([base (make-object editor-stream-out-bytes-base%)]
[stream (make-object editor-stream-out% base)])
(write-editor-version stream base)
(write-editor-global-header stream)
(for ([ed (in-list editors)]) (send ed write-to-file stream))
(write-editor-global-footer stream)
(send base get-bytes)))

(define (string->editor! str defs)
(let* ([base (make-object editor-stream-in-bytes-base% str)]
[stream (make-object editor-stream-in% base)])
(read-editor-version stream base #t)
(read-editor-global-header stream)
(send* defs (begin-edit-sequence #f)
(erase) (read-from-file stream)
(end-edit-sequence))
(read-editor-global-footer stream)))

(define tool@
(unit
(import drracket:tool^)
Expand All @@ -738,6 +720,56 @@
(dynamic-require `(lib "updater.rkt" ,this-collection-name) 'bg-update)
void))

(define (get-lang-prefix modname editor)
(let* ([lang-settings (send editor get-next-settings)]
[lang (drracket:language-configuration:language-settings-language lang-settings)]
[settings (drracket:language-configuration:language-settings-settings lang-settings)])
(send lang get-metadata modname settings)))

(define (with-fake-header editor)
(let ([new-editor (send editor copy-self)]
[text (get-lang-prefix 'handin editor)])
(when text
(send new-editor set-position 0)
(send new-editor insert-port (open-input-string text)))
new-editor))

(define (editors->string definitions interactions)
(let* ([base (make-object editor-stream-out-bytes-base%)]
[stream (make-object editor-stream-out% base)]
[definitions-with-fake-header (with-fake-header definitions)])
(write-editor-version stream base)
(write-editor-global-header stream)
(for ([ed (in-list (list definitions-with-fake-header interactions))]) (send ed write-to-file stream))
(write-editor-global-footer stream)
(send base get-bytes)))

; Adapted from
; https://github.com/racket/drracket/blob/a2f8efc910ffd5e0992279ff59bfe7145598d5ba/drracket/drracket/private/unit.rkt#L619-L643
(define (guess-language defs)
(let-values ([(matching-language settings)
(pick-new-language
defs
(drracket:language-configuration:get-languages)
#f #f)])
(when matching-language
(send defs set-next-settings
(drracket:language-configuration:language-settings
matching-language
settings)
#f))))

(define (string->editor! str defs)
(let* ([base (make-object editor-stream-in-bytes-base% str)]
[stream (make-object editor-stream-in% base)])
(read-editor-version stream base #t)
(read-editor-global-header stream)
(send* defs (begin-edit-sequence #f)
(erase) (read-from-file stream))
(guess-language defs)
(send defs end-edit-sequence)
(read-editor-global-footer stream)))

(define tool-button-label (bitmap-label-maker button-label/h handin-icon))

(define (make-new-unit-frame% super%)
Expand Down Expand Up @@ -793,8 +825,8 @@
[callback
(lambda (button)
(let ([content (editors->string
(list (get-definitions-text)
(get-interactions-text)))])
(get-definitions-text)
(get-interactions-text))])
(new handin-frame%
[parent this]
[content content]
Expand Down