diff --git a/collects/drscheme/private/main.ss b/collects/drscheme/private/main.ss index 0d4f898c47..b2b3dc2c30 100644 --- a/collects/drscheme/private/main.ss +++ b/collects/drscheme/private/main.ss @@ -58,6 +58,15 @@ (finder:default-filters))) (application:current-app-name (string-constant drscheme)) + (preferences:set-default 'drscheme:recent-language-names + null + (λ (x) + (and (list? x) + (andmap + (λ (x) + (and (pair? x) + (string? (car x)))) + x)))) (preferences:set-default 'drscheme:show-interactions-on-execute #t boolean?) (preferences:set-default 'drscheme:open-in-tabs #f boolean?) (preferences:set-default 'drscheme:toolbar-shown #t boolean?) diff --git a/collects/drscheme/private/unit.ss b/collects/drscheme/private/unit.ss index 19d1221b91..7ce129a06f 100644 --- a/collects/drscheme/private/unit.ss +++ b/collects/drscheme/private/unit.ss @@ -551,6 +551,26 @@ module browser threading seems wrong. (set-modified #t)) (set! next-settings _next-settings) (change-mode-to-match) + + (let ([f (get-top-level-window)]) + (when (and f + (is-a? f -frame<%>)) + (send f language-changed))) + + (let ([lang (drscheme:language-configuration:language-settings-language next-settings)] + [sets (drscheme:language-configuration:language-settings-settings next-settings)]) + (preferences:set + 'drscheme:recent-language-names + (limit-length + (remove-duplicates + (cons (cons (send lang get-language-name) + (send lang marshall-settings sets)) + (preferences:get 'drscheme:recent-language-names))) + 10))) + (preferences:set + drscheme:language-configuration:settings-preferences-symbol + next-settings) + (after-set-next-settings _next-settings)) (define/pubment (after-set-next-settings s) @@ -948,22 +968,22 @@ module browser threading seems wrong. (inner (void) after-percentage-change)) (super-new))) - (define super-frame% - (drscheme:frame:mixin - (drscheme:frame:basics-mixin - (frame:searchable-text-mixin - (frame:searchable-mixin - (frame:text-info-mixin - (frame:delegate-mixin - (frame:status-line-mixin - (frame:info-mixin - (frame:text-mixin - (frame:open-here-mixin - (frame:editor-mixin - (frame:standard-menus-mixin - (frame:register-group-mixin - (frame:basic-mixin - frame%))))))))))))))) + (define super-frame% + (drscheme:frame:mixin + (drscheme:frame:basics-mixin + (frame:searchable-text-mixin + (frame:searchable-mixin + (frame:text-info-mixin + (frame:delegate-mixin + (frame:status-line-mixin + (frame:info-mixin + (frame:text-mixin + (frame:open-here-mixin + (frame:editor-mixin + (frame:standard-menus-mixin + (frame:register-group-mixin + (frame:basic-mixin + frame%))))))))))))))) (define tab% (class* object% (drscheme:rep:context<%> tab<%>) @@ -1360,11 +1380,11 @@ module browser threading seems wrong. (set! save-init-shown? mod?)) (update-tab-label current-tab))) - (define/private (language-changed) + (define/public (language-changed) (let* ([settings (send definitions-text get-next-settings)] [language (drscheme:language-configuration:language-settings-language settings)]) (send func-defs-canvas language-changed language) - + (send language-message set-lang (send language get-language-name)) (let ([label (send scheme-menu get-label)] [new-label (send language capability-value 'drscheme:language-menu-title)]) (unless (equal? label new-label) @@ -2736,6 +2756,14 @@ module browser threading seems wrong. (define special-menu 'special-menu-not-yet-init) (define/public (get-special-menu) special-menu) + (define/public (choose-language-callback) + (let ([new-settings (drscheme:language-configuration:language-dialog + #f + (send definitions-text get-next-settings) + this)]) + (when new-settings + (send definitions-text set-next-settings new-settings)))) + (define/private (initialize-menus) (let* ([mb (get-menu-bar)] [language-menu-on-demand @@ -2763,17 +2791,7 @@ module browser threading seems wrong. (make-object menu:can-restore-menu-item% (string-constant choose-language-menu-item-label) language-menu - (λ (_1 _2) - (let ([new-settings (drscheme:language-configuration:language-dialog - #f - (send definitions-text get-next-settings) - this)]) - (when new-settings - (send definitions-text set-next-settings new-settings) - (language-changed) - (preferences:set - drscheme:language-configuration:settings-preferences-symbol - new-settings)))) + (λ (_1 _2) (choose-language-callback)) #\l) (make-object separator-menu-item% language-menu) (make-object menu:can-restore-menu-item% @@ -3185,11 +3203,28 @@ module browser threading seems wrong. (set-save-init-shown? (and m (send m is-modified?)))) + (define language-message + (let* ([info-panel (get-info-panel)] + [vp (new vertical-panel% + [parent info-panel] + [alignment '(left center)] + [stretchable-width #f] + [stretchable-height #f])] + [spacer (new horizontal-panel% [parent info-panel])] + [l-m-label (new language-label-message% [parent vp] [frame this])] + [language-message (new language-message% [parent vp])]) + (send info-panel change-children + (λ (l) + (list* vp + spacer + (remq* (list spacer vp) l)))) + language-message)) + (update-save-message) (update-save-button) (language-changed) - (cond + (cond [filename (set! definitions-shown? #t) (set! interactions-shown? #f)] @@ -3208,8 +3243,104 @@ module browser threading seems wrong. (update-toolbar-visiblity) (set! newest-frame this) (send definitions-canvas focus))) - - (define -frame% (frame-mixin super-frame%)) + + (define (limit-length l n) + (let loop ([l l] + [n n]) + (cond + [(or (null? l) (zero? n)) null] + [else (cons (car l) (loop (cdr l) (- n 1)))]))) + (define (remove-duplicates l) + (reverse + (let loop ([l (reverse l)]) + (cond + [(null? l) l] + [else + (if (member (car l) (cdr l)) + (loop (cdr l)) + (cons (car l) (loop (cdr l))))])))) + + (define programming-language-label (string-constant programming-language-label)) + (define second-line-indent 6) + (define language-message% + (class canvas% + (inherit get-dc get-client-size refresh) + (define message "") + (define/public (set-lang l) + (set! message l) + (update-min-widths) + (refresh)) + + (define/override (on-paint) + (let ([dc (get-dc)]) + (let-values ([(w h) (get-client-size)]) + (send dc set-pen (get-panel-background) 1 'transparent) + (send dc set-brush (get-panel-background) 'transparent) + (send dc draw-rectangle 0 0 w h) + (send dc set-font small-control-font) + (send dc draw-text message (get-left-side-padding) 0)))) + + (super-new [style '(transparent)]) + (inherit stretchable-width stretchable-height) + (stretchable-width #f) + (stretchable-height #f) + + (inherit min-width min-height) + (define (update-min-widths) + (let ([dc (get-dc)]) + (let-values ([(w2 h2 _3 _4) (send dc get-text-extent message small-control-font)]) + (min-width (inexact->exact (floor (+ (get-left-side-padding) w2)))) + (min-height (inexact->exact (floor h2)))))))) + + (define language-label-message% + (class name-message% + (init-field frame) + (define/override (fill-popup menu reset) + (let ([added-one? #f]) + (for-each + (λ (name/settings) + (let* ([name (car name/settings)] + [marshalled-settings (cdr name/settings)] + [lang (ormap + (λ (l) (and (equal? (send l get-language-name) name) l)) + (drscheme:language-configuration:get-languages))] + [settings (send lang unmarshall-settings marshalled-settings)]) + (when lang + (unless added-one? + (send (new menu-item% + [label (string-constant recent-languages)] + [callback void] + [parent menu]) + enable #f)) + (set! added-one? #t) + (new menu-item% + [parent menu] + [label (string-append " " + (send lang get-language-name) + (if (send lang default-settings? settings) + "" + (string-append " " (string-constant custom))))] + [callback + (λ (x y) + (send (send frame get-definitions-text) + set-next-settings + (drscheme:language-configuration:make-language-settings + lang + settings)))])))) + (preferences:get 'drscheme:recent-language-names)) + (when added-one? + (new separator-menu-item% [parent menu]))) + (new menu-item% + [label (string-constant choose-language-menu-item-label)] + [parent menu] + [callback + (λ (x y) + (send frame choose-language-callback))])) + + (super-new [label programming-language-label] + [font tiny-control-font]))) + + (define -frame% (frame-mixin super-frame%)) (define module-browser-dragable-panel% (class panel:horizontal-dragable% diff --git a/collects/mrlib/name-message.ss b/collects/mrlib/name-message.ss index 25eba414dc..1615efdad6 100644 --- a/collects/mrlib/name-message.ss +++ b/collects/mrlib/name-message.ss @@ -13,6 +13,7 @@ (define (min-h w) (flat-named-contract "draw-button-label-height" (lambda (h) (h . > . (* 2 border-inset))))) (provide/contract + [get-left-side-padding (-> number?)] (pad-xywh (number? number? (>=/c 0) (>=/c 0) . -> . (values number? number? (>=/c 0) (>=/c 0)))) (draw-button-label (->r ([dc (is-a?/c dc<%>)] @@ -22,13 +23,13 @@ [w (and/c number? (min-w h))] [h (and/c number? (min-h w))] [mouse-over? boolean?] - [grabbed? boolean?]) + [grabbed? boolean?] + [button-label-font (is-a?/c font%)]) void?)) (calc-button-min-sizes - (->* - ((is-a?/c dc<%>) string?) - (number? number?)))) + (->* ((is-a?/c dc<%>) string? (is-a?/c font%)) + (number? number?)))) (provide name-message%) @@ -47,7 +48,8 @@ (define paths #f) ;; label : string - (init-field [label (string-constant untitled)]) + (init-field [label (string-constant untitled)] + [font small-control-font]) (define full-name-window #f) @@ -131,7 +133,7 @@ (inherit get-parent) (define/private (update-min-sizes) - (let-values ([(w h) (calc-button-min-sizes (get-dc) label)]) + (let-values ([(w h) (calc-button-min-sizes (get-dc) label font)]) (min-width w) (min-height h) (send (get-parent) reflow-container))) @@ -152,15 +154,14 @@ (send dc set-brush brush))] [else (when (and (> w 5) (> h 5)) - (draw-button-label dc label 0 0 w h mouse-over? mouse-grabbed?))])))) + (draw-button-label dc label 0 0 w h mouse-over? mouse-grabbed? font))])))) (super-new [style '(transparent)]) (update-min-sizes) (stretchable-width #f) (stretchable-height #f))) - (define button-label-font small-control-font) - + (define (get-left-side-padding) (+ button-label-inset circle-spacer)) (define button-label-inset 1) (define black-color (make-object color% "BLACK")) @@ -185,7 +186,7 @@ (define mouse-grabbed-color (make-object color% 100 100 100)) (define grabbed-fg-color (make-object color% 220 220 220)) - (define (calc-button-min-sizes dc label) + (define (calc-button-min-sizes dc label button-label-font) (let-values ([(w h a d) (send dc get-text-extent label button-label-font)]) (let-values ([(px py pw ph) (pad-xywh 0 0 w h)]) (values pw ph)))) @@ -214,7 +215,7 @@ ans-w ans-h))) - (define (draw-button-label dc label dx dy w h mouse-over? grabbed?) + (define (draw-button-label dc label dx dy w h mouse-over? grabbed? button-label-font) (when (or mouse-over? grabbed?) (let ([color (if grabbed? mouse-grabbed-color diff --git a/collects/string-constants/english-string-constants.ss b/collects/string-constants/english-string-constants.ss index bd24940d0b..0274d24d75 100644 --- a/collects/string-constants/english-string-constants.ss +++ b/collects/string-constants/english-string-constants.ss @@ -921,6 +921,13 @@ please adhere to these guidelines: (use-repeating-decimals "Repeating decimals") (decimal-notation-for-rationals "Use decimal notation for rationals") + ; used in the bottom left of the drscheme frame as the label + ; above the programming language's name + (programming-language-label "Programming language:") + ; used the popup menu from the just above; greyed out and only + ; visible when some languages are in the history + (recent-languages "Recent languages:") + ;; startup wizard screen language selection section (please-select-a-language "Please select a language")