diff --git a/collects/drscheme/private/main.ss b/collects/drscheme/private/main.ss index 4f8f1cabf2..a645b448fd 100644 --- a/collects/drscheme/private/main.ss +++ b/collects/drscheme/private/main.ss @@ -53,6 +53,12 @@ (finder:default-filters))) (application:current-app-name (string-constant drscheme)) +(preferences:set-default 'drscheme:toolbar-state + '(#f . horizontal) + (λ (x) (and (pair? x) + (boolean? (car x)) + (memq (cdr x) '(horizontal vertical))))) + (preferences:set-default 'drscheme:htdp:last-set-teachpacks '() (λ (x) diff --git a/collects/drscheme/private/unit.ss b/collects/drscheme/private/unit.ss index 67a1854675..e4c2e27230 100644 --- a/collects/drscheme/private/unit.ss +++ b/collects/drscheme/private/unit.ss @@ -27,6 +27,7 @@ module browser threading seems wrong. "drsig.ss" "auto-language.ss" "insert-large-letters.ss" + mrlib/switchable-button (prefix-in drscheme:arrow: "../arrow.ss") @@ -275,15 +276,9 @@ module browser threading seems wrong. frame program-filename)))]))) - (define make-execute-bitmap - (bitmap-label-maker (string-constant execute-button-label) - (build-path (collection-path "icons") "run.png"))) - (define make-save-bitmap - (bitmap-label-maker (string-constant save-button-label) - (build-path (collection-path "icons") "save.png"))) - (define make-break-bitmap - (bitmap-label-maker (string-constant break-button-label) - (build-path (collection-path "icons") "break.png"))) + (define execute-bitmap (make-object bitmap% (build-path (collection-path "icons") "run.png") 'png/mask)) + (define break-bitmap (make-object bitmap% (build-path (collection-path "icons") "break.png") 'png/mask)) + (define save-bitmap (make-object bitmap% (build-path (collection-path "icons") "save.png") 'png/mask)) (define-values (get-program-editor-mixin add-to-program-editor-mixin) (let* ([program-editor-mixin @@ -1152,7 +1147,8 @@ module browser threading seems wrong. ;; should only be called by the tab% object (define-local-member-name disable-evaluation-in-tab - enable-evaluation-in-tab) + enable-evaluation-in-tab + update-toolbar-visiblity) (define -frame<%> (interface (drscheme:frame:<%> frame:searchable-text<%> frame:delegate<%> frame:open-here<%>) @@ -1302,36 +1298,85 @@ module browser threading seems wrong. (parent louter-panel) (stretchable-height #f))) (set! logging-panel (make-object horizontal-panel% logging-parent-panel)) - (unless toolbar-shown? + (unless (toolbar-shown?) (send logging-parent-panel change-children (λ (l) '()))) root)) (inherit show-info hide-info is-info-hidden?) - (field [toolbar-shown? (preferences:get 'drscheme:toolbar-shown)] - [toolbar-menu-item #f]) + (field [toolbar-state (preferences:get 'drscheme:toolbar-state)] + [toolbar-vertical-menu-item #f] + [toolbar-horizontal-menu-item #f] + [toolbar-hidden-menu-item #f] + [toolbar-menu #f]) - (define/override (on-toolbar-button-click) - (toggle-toolbar-visiblity)) + ;; returns #t if the toolbar is visible, #f otherwise + (define/private (toolbar-shown?) (car toolbar-state)) - (define/private (toggle-toolbar-visiblity) - (set! toolbar-shown? (not toolbar-shown?)) - (preferences:set 'drscheme:toolbar-shown toolbar-shown?) + (define/private (change-toolbar-state new-state) + (set! toolbar-state new-state) + (preferences:set 'drscheme:toolbar-state new-state) (update-toolbar-visiblity)) - (define/private (update-toolbar-visiblity) - (cond - [toolbar-shown? - (show-info) - (send top-outer-panel change-children (λ (l) (list top-panel))) - (send logging-parent-panel change-children (λ (l) (list logging-panel))) - (send toolbar-menu-item set-label (string-constant hide-toolbar))] - [else - (hide-info) - (send top-outer-panel change-children (λ (l) '())) - (send logging-parent-panel change-children (λ (l) '())) - (send toolbar-menu-item set-label (string-constant show-toolbar))]) + (define/override (on-toolbar-button-click) (change-toolbar-state (cons (not (car toolbar-state)) (cdr toolbar-state)))) + (define/private (set-toolbar-horizontal) (change-toolbar-state (cons #f 'horizontal))) + (define/private (set-toolbar-vertical) (change-toolbar-state (cons #f 'vertical))) + (define/private (set-toolbar-hidden) (change-toolbar-state (cons #t (cdr toolbar-state)))) + + (define/public (update-toolbar-visiblity) + (let* ([hidden? (car (preferences:get 'drscheme:toolbar-state))] + [vertical? (and (not hidden?) + (eq? (cdr (preferences:get 'drscheme:toolbar-state)) + 'vertical))] + [horizontal? (and (not hidden?) + (eq? (cdr (preferences:get 'drscheme:toolbar-state)) + 'horizontal))]) + (send toolbar-horizontal-menu-item check horizontal?) + (send toolbar-vertical-menu-item check vertical?) + (send toolbar-hidden-menu-item check hidden?) + + (cond + [hidden? + (hide-info) + (send top-outer-panel change-children (λ (l) '())) + (send logging-parent-panel change-children (λ (l) '()))] + [vertical? (orient/show #t)] + [horizontal? (orient/show #f)])) (update-defs/ints-resize-corner)) + (define/private (orient/show vertical?) + (begin-container-sequence) + (show-info) + + (let ([bpo (send button-panel get-orientation)]) + (unless (equal? bpo (not vertical?)) + (send button-panel set-orientation (not vertical?)) + + ;; have to be careful to avoid reversing the list when the orientation is already proper + (send button-panel change-children reverse))) + + (let loop ([obj button-panel]) + (cond + [(is-a? obj area-container<%>) + (for-each loop (send obj get-children))] + [(is-a? obj switchable-button%) + (send obj set-label-visible (not vertical?))] + [else (void)])) + (send save-button set-label-visible (not vertical?)) + (send top-outer-panel stretchable-height vertical?) + (send top-outer-panel stretchable-width (not vertical?)) + (send top-panel set-orientation (not vertical?)) + (send toolbar/rest-panel set-orientation vertical?) + (send toolbar/rest-panel change-children (λ (l) + (if vertical? + (append (remq top-outer-panel l) (list top-outer-panel)) + (cons top-outer-panel (remq top-outer-panel l))))) + (send top-outer-panel change-children (λ (l) (list top-panel))) + (send logging-parent-panel change-children (λ (l) (list logging-panel))) + (if vertical? + (send top-panel change-children (λ (x) (remq name-panel x))) + (send top-panel change-children (λ (x) (cons name-panel (remq name-panel x))))) + (end-container-sequence)) + (field [remove-show-status-line-callback (preferences:add-callback 'framework:show-status-line @@ -1342,7 +1387,7 @@ module browser threading seems wrong. (update-defs/ints-resize-corner/pref (preferences:get 'framework:show-status-line))) (define/private (update-defs/ints-resize-corner/pref si-pref) - (let ([bottom-material? (and toolbar-shown? si-pref)]) + (let ([bottom-material? (and (toolbar-shown?) si-pref)]) (let loop ([cs definitions-canvases]) (cond [(null? cs) (void)] @@ -2409,7 +2454,7 @@ module browser threading seems wrong. (define/public (get-interactions-text) interactions-text) (define/public (get-definitions/interactions-panel-parent) - (get-area-container)) + toolbar/rest-panel) (inherit delegated-text-shown? hide-delegated-text show-delegated-text) (define/override (add-show-menu-items show-menu) @@ -2464,13 +2509,27 @@ module browser threading seems wrong. (hide-module-browser) (show-module-browser)))))) - (set! toolbar-menu-item - (new menu-item% - (label (string-constant show-toolbar)) - (parent show-menu) - (callback - (λ (x y) - (toggle-toolbar-visiblity)))))) + (set! toolbar-menu (new menu% + [parent show-menu] + [label "Toolbar"])) + (set! toolbar-horizontal-menu-item + (new checkable-menu-item% + [label "Horizontal Toolbar"] + [parent toolbar-menu] + [callback (λ (x y) (set-toolbar-horizontal))] + [checked #f])) + (set! toolbar-vertical-menu-item + (new checkable-menu-item% + [label "Vertical Toolbar"] + [parent toolbar-menu] + [callback (λ (x y) (set-toolbar-vertical))] + [checked #f])) + (set! toolbar-hidden-menu-item + (new checkable-menu-item% + [label "Hidden Toolbar"] + [parent toolbar-menu] + [callback (λ (x y) (set-toolbar-hidden))] + [checked #f]))) ; @@ -3205,13 +3264,16 @@ module browser threading seems wrong. ; ; ; + (define toolbar/rest-panel (new vertical-panel% [parent (get-area-container)])) + ;; most contain only top-panel (or nothing) - (define top-outer-panel (new horizontal-pane% - (parent (get-area-container)) - (stretchable-height #f))) + (define top-outer-panel (new horizontal-panel% + [parent toolbar/rest-panel] + [alignment '(right top)] + [stretchable-height #f])) [define top-panel (make-object horizontal-panel% top-outer-panel)] - [define name-panel (new vertical-pane% + [define name-panel (new horizontal-panel% (parent top-panel) (alignment '(left center)) (stretchable-width #f) @@ -3259,13 +3321,13 @@ module browser threading seems wrong. [define get-interactions-canvas (λ () interactions-canvas)] (set! save-button - (make-object button% - (make-save-bitmap this) - top-panel - (λ args - (when definitions-text - (save) - (send definitions-canvas focus))))) + (new switchable-button% + [parent top-panel] + [callback (λ (x) (when definitions-text + (save) + (send definitions-canvas focus)))] + [bitmap save-bitmap] + [label (string-constant save-button-label)])) (set! name-message (new drs-name-message% [parent name-panel])) (send name-message stretchable-width #t) @@ -3273,7 +3335,7 @@ module browser threading seems wrong. [define teachpack-items null] [define break-button (void)] [define execute-button (void)] - [define button-panel (make-object horizontal-panel% top-panel)] + [define button-panel (new horizontal-panel% [parent top-panel] [spacing 2])] [define/public get-execute-button (λ () execute-button)] [define/public get-break-button (λ () break-button)] [define/public get-button-panel (λ () button-panel)] @@ -3288,16 +3350,18 @@ module browser threading seems wrong. (frame this))] (set! execute-button - (make-object button% - (make-execute-bitmap this) - button-panel - (λ (button evt) (execute-callback)))) + (new switchable-button% + [parent button-panel] + [callback (λ (x) (execute-callback))] + [bitmap execute-bitmap] + [label (string-constant execute-button-label)])) + (set! break-button - (make-object button% - (make-break-bitmap this) - button-panel - (λ (x y) - (send current-tab break-callback)))) + (new switchable-button% + [parent button-panel] + [callback (λ (x) (send current-tab break-callback))] + [bitmap break-bitmap] + [label (string-constant break-button-label)])) (send button-panel stretchable-height #f) (send button-panel stretchable-width #f) @@ -3347,7 +3411,6 @@ module browser threading seems wrong. (list p (- 1 p))))) (set-label-prefix (string-constant drscheme)) - (update-toolbar-visiblity) (set! newest-frame this) (send definitions-canvas focus))) @@ -3699,6 +3762,7 @@ module browser threading seems wrong. (unless (eq? (system-type) 'macosx) ;; mac os x has a bug where maximizing can make the window too big. (send frame maximize (preferences:get 'drscheme:unit-window-max?)))) + (send frame update-toolbar-visiblity) (send frame show #t) (set! first-frame? #f) frame)))) diff --git a/collects/drscheme/syncheck.ss b/collects/drscheme/syncheck.ss index 2c5bc8d83d..4d5a74cf17 100644 --- a/collects/drscheme/syncheck.ss +++ b/collects/drscheme/syncheck.ss @@ -25,7 +25,7 @@ If the namespace does not, they are colored the unbound color. mzlib/list syntax/toplevel syntax/boundmap - mrlib/bitmap-label + mrlib/switchable-button (prefix-in drscheme:arrow: drscheme/arrow) (prefix-in fw: framework/framework) mred @@ -890,10 +890,7 @@ If the namespace does not, they are colored the unbound color. (super-new))))) - (define syncheck-bitmap - (bitmap-label-maker - (string-constant check-syntax) - (build-path (collection-path "icons") "syncheck.png"))) + (define syncheck-bitmap (make-object bitmap% (build-path (collection-path "icons") "syncheck.png") 'png/mask)) (define syncheck-frame<%> (interface () @@ -1226,10 +1223,11 @@ If the namespace does not, they are colored the unbound color. [stretchable-width #f] [stretchable-height #f])) (define check-syntax-button - (new button% - (label (syncheck-bitmap this)) + (new switchable-button% + (label (string-constant check-syntax)) + (bitmap syncheck-bitmap) (parent check-syntax-button-parent-panel) - (callback (λ (button evt) (syncheck:button-callback))))) + (callback (λ (button) (syncheck:button-callback))))) (define/public (syncheck:get-button) check-syntax-button) (send (get-button-panel) change-children (λ (l) diff --git a/collects/gui-debugger/debug-tool.ss b/collects/gui-debugger/debug-tool.ss index 4331a2a9e8..2cbd12ba7d 100644 --- a/collects/gui-debugger/debug-tool.ss +++ b/collects/gui-debugger/debug-tool.ss @@ -12,7 +12,8 @@ (lib "tool.ss" "drscheme") "marks.ss" syntax/boundmap - (lib "bitmap-label.ss" "mrlib") + mrlib/switchable-button + mrlib/bitmap-label "annotator.ss" "load-sandbox.ss" framework @@ -1055,6 +1056,32 @@ (super-new))) + (define debug-bitmap + (make-object bitmap% + (build-path (collection-path "gui-debugger" "icons") "icon-small.png") + 'png/mask)) + + (define make-pause-label + (bitmap-label-maker + "Pause" + (build-path (collection-path "gui-debugger" "icons") "pause.png"))) + (define make-resume-label + (bitmap-label-maker + "Go" + (build-path (collection-path "gui-debugger" "icons") "resume.png"))) + (define make-step-label + (bitmap-label-maker + "Step" + (build-path (collection-path "gui-debugger" "icons") "step.png"))) + (define make-over-label + (bitmap-label-maker + "Over" + (build-path (collection-path "gui-debugger" "icons") "step-over2.png"))) + (define make-out-label + (bitmap-label-maker + "Out" + (build-path (collection-path "gui-debugger" "icons") "step-out2.png"))) + (define (debug-unit-frame-mixin super%) (class super% @@ -1283,18 +1310,15 @@ [stretchable-width #t])) (define debug-button - (make-object button% - ((bitmap-label-maker - (string-constant debug-tool-button-name) - (build-path (collection-path "gui-debugger" "icons") "icon-small.png")) this) - (make-object vertical-pane% (get-button-panel)) - (lambda (button evt) (set! debug? #t) (execute-callback)))) + (new switchable-button% + (label (string-constant debug-tool-button-name)) + (bitmap debug-bitmap) + (parent (make-object vertical-pane% (get-button-panel))) + (callback (λ (button) (set! debug? #t) (execute-callback))))) (define pause-button (instantiate button% () - [label ((bitmap-label-maker - "Pause" - (build-path (collection-path "gui-debugger" "icons") "pause.png")) this)] + [label (make-pause-label this)] [parent debug-panel] [callback (lambda (button evt) (if (send (get-current-tab) get-stack-frames) @@ -1307,9 +1331,7 @@ (define resume-button (instantiate button% () - [label ((bitmap-label-maker - "Go" - (build-path (collection-path "gui-debugger" "icons") "resume.png")) this)] + [label (make-resume-label this)] [parent debug-panel] [callback (lambda (button evt) (if (send (get-current-tab) get-stack-frames) @@ -1319,9 +1341,7 @@ (define step-button (instantiate button% () - [label ((bitmap-label-maker - "Step" - (build-path (collection-path "gui-debugger" "icons") "step.png")) this)] + [label (make-step-label this)] [parent debug-panel] [callback (lambda (btn evt) (if (send (get-current-tab) get-stack-frames) @@ -1373,18 +1393,14 @@ (define step-over-button (new button% - [label ((bitmap-label-maker - "Over" - (build-path (collection-path "gui-debugger" "icons") "step-over2.png")) this)] + [label (make-over-label this)] [parent debug-panel] [callback (make-big-step-callback #f)] [enabled #f])) (define step-out-button (new button% - [label ((bitmap-label-maker - "Out" - (build-path (collection-path "gui-debugger" "icons") "step-out2.png")) this)] + [label (make-out-label this)] [parent debug-panel] [callback (make-big-step-callback #t)] [enabled #f])) diff --git a/collects/macro-debugger/tool.ss b/collects/macro-debugger/tool.ss index 3ec37f1aba..c7f2ecacb6 100644 --- a/collects/macro-debugger/tool.ss +++ b/collects/macro-debugger/tool.ss @@ -7,7 +7,7 @@ scheme/gui framework/framework drscheme/tool - mrlib/bitmap-label + mrlib/switchable-button string-constants "model/trace.ss" "model/deriv.ss" @@ -55,6 +55,11 @@ (define-local-member-name check-language) (define-local-member-name get-debug-button) + (define macro-debugger-bitmap + (make-object bitmap% + (build-path (collection-path "macro-debugger") "view" "icon-small.png") + 'png/mask)) + (define (macro-debugger-unit-frame-mixin %) (class % (super-new) @@ -65,14 +70,11 @@ (define macro-debug-panel (new vertical-pane% (parent (get-button-panel)))) (define macro-debug-button - (new button% - (label (make-bitmap-label - "Macro Stepper" - (build-path (collection-path "macro-debugger") - "view" - "icon-small.png"))) + (new switchable-button% + (label "Macro Stepper") + (bitmap macro-debugger-bitmap) (parent macro-debug-panel) - (callback (lambda (button event) (execute #t))))) + (callback (λ (button) (execute #t))))) (define/override (execute-callback) (execute #f)) diff --git a/collects/mred/private/mrpanel.ss b/collects/mred/private/mrpanel.ss index 0de38cead1..e78fe88129 100644 --- a/collects/mred/private/mrpanel.ss +++ b/collects/mred/private/mrpanel.ss @@ -94,8 +94,18 @@ (send (send wx area-parent) add-child wx)))) (send parent after-new-child this))))) - (define vertical-panel% (class100*/kw panel% () [(parent [style null]) panel%-keywords] (sequence (super-init parent style)))) - (define horizontal-panel% (class100*/kw panel% () [(parent [style null]) panel%-keywords] (sequence (super-init parent style)))) + (define vertical-panel% + (class100*/kw panel% () + [(parent [style null]) panel%-keywords] + (sequence (super-init parent style)) + (public [set-orientation (λ (x) (send (mred->wx this) set-orientation x))] + [get-orientation (λ () (send (mred->wx this) get-orientation))]))) + (define horizontal-panel% + (class100*/kw panel% () + [(parent [style null]) panel%-keywords] + (sequence (super-init parent style)) + (public [set-orientation (λ (x) (send (mred->wx this) set-orientation x))] + [get-orientation (λ () (send (mred->wx this) get-orientation))]))) (define list-append append) diff --git a/collects/mred/private/wxpanel.ss b/collects/mred/private/wxpanel.ss index 2eaa512baa..bbdc91f321 100644 --- a/collects/mred/private/wxpanel.ss +++ b/collects/mred/private/wxpanel.ss @@ -637,89 +637,95 @@ (sequence (apply super-init args)))) + + (define (wx-make-horizontal/vertical-panel% wx-linear-panel% init-horizontal?) + (class100 wx-linear-panel% args + (inherit major-align minor-align do-align do-get-alignment major-offset minor-offset + spacing border do-graphical-size place-linear-children check-place-children + force-redraw) + (private-field [horizontal? init-horizontal?]) + (public [get-orientation (λ () horizontal?)] + [set-orientation (λ (h?) + (unless (equal? h? horizontal?) + (set! horizontal? h?) + (force-redraw)))]) + (override + [alignment (lambda (h v) + (if horizontal? + (do-align h v + (lambda (x) (major-align x)) + (lambda (x) (minor-align x))) + (do-align h v + (lambda (x) (minor-align x)) + (lambda (x) (major-align x)))))] + [get-alignment (λ () (do-get-alignment (if horizontal? (λ (x y) x) (λ (x y) y))))] + + [do-get-graphical-min-size + (lambda () + (if horizontal? + (do-graphical-size + (lambda (x-accum kid-info hidden?) + (+ x-accum (child-info-x-min (car kid-info)) + (if (or hidden? (null? (cdr kid-info))) + 0 + (spacing)))) + (lambda (y-accum kid-info hidden?) + (max y-accum + (+ (child-info-y-min (car kid-info)) + (* 2 (border)))))) + (do-graphical-size + (lambda (x-accum kid-info hidden?) + (max x-accum + (+ (child-info-x-min (car kid-info)) + (* 2 (border))))) + (lambda (y-accum kid-info hidden?) + (+ y-accum (child-info-y-min (car kid-info)) + (if (or (null? (cdr kid-info)) hidden?) + 0 + (spacing)))))))] + + [do-place-children + (lambda (l w h) + (cond + [horizontal? + (check-place-children l w h) + (place-linear-children l w h + car ; child-info-x-min + caddr ; child-info-x-stretch + (lambda (s) (major-offset s)) + cadr ; child-info-y-min + cadddr ; child-info-y-stretch + (lambda (s t) (minor-offset s t)) + (lambda (width height) width) + (lambda (width height) height) + (lambda (major minor) major) + (lambda (major minor) minor))] + [else + (check-place-children l w h) + (place-linear-children l w h + cadr ; child-info-y-min + cadddr ; child-info-y-stretch + (lambda (s) (major-offset s)) + car ; child-info-x-min + caddr ; child-info-x-stretch + (lambda (s t) (minor-offset s t)) + (lambda (width height) height) + (lambda (width height) width) + (lambda (major minor) minor) + (lambda (major minor) major))]))]) + (sequence (apply super-init args)))) + + ;; horizontal-panel%: a panel which arranges its children in an evenly ;; spaced horizontal row. Items are vertically centered (or stretched ;; to fit the dialog box if they are stretchable). The items are evenly ;; spaced horizontally, with any extra space divided evenly among the ;; stretchable items. - (define (wx-make-horizontal-panel% wx-linear-panel%) - (class100 wx-linear-panel% args - (inherit major-align minor-align do-align do-get-alignment major-offset minor-offset - spacing border do-graphical-size place-linear-children check-place-children) - (override - [alignment (lambda (h v) (do-align h v - (lambda (x) (major-align x)) - (lambda (x) (minor-align x))))] - [get-alignment (lambda () (do-get-alignment (lambda (x y) x)))] - - [do-get-graphical-min-size - (lambda () - (do-graphical-size - (lambda (x-accum kid-info hidden?) - (+ x-accum (child-info-x-min (car kid-info)) - (if (or hidden? (null? (cdr kid-info))) - 0 - (spacing)))) - (lambda (y-accum kid-info hidden?) - (max y-accum - (+ (child-info-y-min (car kid-info)) - (* 2 (border)))))))] - [do-place-children - (lambda (l w h) - (check-place-children l w h) - (place-linear-children l w h - car ; child-info-x-min - caddr ; child-info-x-stretch - (lambda (s) (major-offset s)) - cadr ; child-info-y-min - cadddr ; child-info-y-stretch - (lambda (s t) (minor-offset s t)) - (lambda (width height) width) - (lambda (width height) height) - (lambda (major minor) major) - (lambda (major minor) minor)))]) - (sequence (apply super-init args)))) + (define (wx-make-horizontal-panel% wx-linear-panel%) (wx-make-horizontal/vertical-panel% wx-linear-panel% #t)) ;; vertical-panel%. See horizontal-panel%, but reverse ;; "horizontal" and "vertical." - (define (wx-make-vertical-panel% wx-linear-panel%) - (class100 wx-linear-panel% args - (inherit major-align minor-align do-align do-get-alignment major-offset minor-offset - spacing border do-graphical-size place-linear-children check-place-children) - (override - [alignment (lambda (h v) (do-align h v - (lambda (x) (minor-align x)) - (lambda (x) (major-align x))))] - [get-alignment (lambda () (do-get-alignment (lambda (x y) y)))] - - [do-get-graphical-min-size - (lambda () - (do-graphical-size - (lambda (x-accum kid-info hidden?) - (max x-accum - (+ (child-info-x-min (car kid-info)) - (* 2 (border))))) - (lambda (y-accum kid-info hidden?) - (+ y-accum (child-info-y-min (car kid-info)) - (if (or (null? (cdr kid-info)) hidden?) - 0 - (spacing))))))] - - [do-place-children - (lambda (l w h) - (check-place-children l w h) - (place-linear-children l w h - cadr ; child-info-y-min - cadddr ; child-info-y-stretch - (lambda (s) (major-offset s)) - car ; child-info-x-min - caddr ; child-info-x-stretch - (lambda (s t) (minor-offset s t)) - (lambda (width height) height) - (lambda (width height) width) - (lambda (major minor) minor) - (lambda (major minor) major)))]) - (sequence (apply super-init args)))) + (define (wx-make-vertical-panel% wx-linear-panel%) (wx-make-horizontal/vertical-panel% wx-linear-panel% #f)) (define wx-panel% (wx-make-panel% wx:panel%)) (define wx-linear-panel% (wx-make-linear-panel% wx-panel%)) diff --git a/collects/mrlib/scribblings/mrlib.scrbl b/collects/mrlib/scribblings/mrlib.scrbl index 6fb5e155d2..fa9d797a48 100644 --- a/collects/mrlib/scribblings/mrlib.scrbl +++ b/collects/mrlib/scribblings/mrlib.scrbl @@ -16,6 +16,7 @@ @include-section["name-message.scrbl"] @include-section["path-dialog.scrbl"] @include-section["plot.scrbl"] +@include-section["switchable-button.scrbl"] @section{Acknowledgments} diff --git a/collects/mrlib/switchable-button.ss b/collects/mrlib/switchable-button.ss new file mode 100644 index 0000000000..72e360b148 --- /dev/null +++ b/collects/mrlib/switchable-button.ss @@ -0,0 +1,149 @@ +#lang scheme/base +(require scheme/gui/base + scheme/class) + +(require string-constants/string-constant) +(provide switchable-button%) +(define gap 2) +(define margin 2) +(define w-circle-space 6) +(define h-circle-space 6) + +(define switchable-button% + (class canvas% + (init-field label bitmap callback) + + (inherit get-dc min-width min-height get-client-size refresh) + + (define down? #f) + (define in? #f) + (define/override (on-event evt) + (cond + [(send evt button-down? 'left) + (set! down? #t) + (set! in? #t) + (refresh)] + [(send evt button-up? 'left) + (set! down? #f) + (update-in evt) + (refresh) + (when in? + (callback this))] + [(send evt entering?) + (set! in? #t) + (refresh)] + [(send evt leaving?) + (set! in? #f) + (refresh)] + [(send evt moving?) + (update-in evt)])) + + (define/private (update-in evt) + (let-values ([(cw ch) (get-client-size)]) + (let ([new-in? + (and (<= 0 (send evt get-x) cw) + (<= 0 (send evt get-y) ch))]) + (unless (equal? new-in? in?) + (set! in? new-in?) + (refresh))))) + + (define horizontal? #t) + (define/override (on-paint) + (let ([dc (get-dc)]) + (let-values ([(cw ch) (get-client-size)]) + (let ([alpha (send dc get-alpha)] + [pen (send dc get-pen)] + [brush (send dc get-brush)]) + + (send dc set-alpha + (cond + [in? (if down? + .5 + .2)] + [else 0])) + (send dc set-pen "black" 1 'transparent) + (send dc set-brush "black" 'solid) + (send dc draw-rounded-rectangle + margin + margin + (- cw margin margin) + (- ch margin margin)) + (send dc set-alpha alpha) + + (cond + [horizontal? + (let-values ([(tw th _1 _2) (send dc get-text-extent label)]) + (let ([text-start (+ (/ cw 2) (- (/ tw 2)) (- (/ (send bitmap get-width) 2)))]) + (send dc draw-text label text-start (- (/ ch 2) (/ th 2))) + (draw-the-bitmap (+ text-start tw gap) (- (/ ch 2) (/ (send bitmap get-height) 2)))))] + [else + (draw-the-bitmap (- (/ cw 2) (/ (send bitmap get-width) 2)) + (- (/ ch 2) (/ (send bitmap get-height) 2)))]) + (send dc set-pen pen) + (send dc set-alpha alpha) + (send dc set-brush brush))))) + + (define/private (draw-the-bitmap x y) + (send (get-dc) + draw-bitmap + bitmap + x y + 'solid + (send the-color-database find-color "black") + (send bitmap get-loaded-mask))) + + (define/public (set-label-visible h?) + (unless (equal? horizontal? h?) + (set! horizontal? h?) + (update-sizes) + (refresh))) + + (define/private (update-sizes) + (let ([dc (get-dc)]) + (cond + [horizontal? + (let-values ([(w h _1 _2) (send dc get-text-extent label)]) + (do-w/h (+ w gap (send bitmap get-width)) + (max h (send bitmap get-height))))] + [else + (do-w/h (send bitmap get-width) + (send bitmap get-height))]))) + + (define/private (do-w/h w h) + (let ([w (floor (inexact->exact w))] + [h (floor (inexact->exact h))]) + (min-width (+ w w-circle-space margin margin)) + (min-height (+ h h-circle-space margin margin)))) + + (super-new [style '(transparent)]) + (send (get-dc) set-smoothing 'aligned) + + (inherit stretchable-width stretchable-height) + (stretchable-width #f) + (stretchable-height #f) + (inherit get-graphical-min-size) + (update-sizes))) + +#; +(begin + (define f (new frame% [label ""])) + (define p (new horizontal-panel% [parent f] [alignment '(right top)])) + + (define label (string-constant execute-button-label)) + (define bitmap (make-object bitmap% (build-path (collection-path "icons") "run.png") 'png/mask)) + + (define b1 (new switchable-button% [parent p] [label label] [bitmap bitmap] [callback void])) + (define b2 (new switchable-button% [parent p] [label label] [bitmap bitmap] [callback void])) + (new button% [parent p] [stretchable-width #t] [label "b"]) + (define swap-button + (new button% + [parent f] + [label "swap"] + [callback + (let ([state #t]) + (λ (a b) + (set! state (not state)) + (send b1 set-orientation state) + (send b2 set-orientation state) + '(send p set-orientation state)))])) + (send f show #t)) \ No newline at end of file diff --git a/collects/scribblings/drscheme/example.png b/collects/scribblings/drscheme/example.png new file mode 100644 index 0000000000..4ffe4d2c23 Binary files /dev/null and b/collects/scribblings/drscheme/example.png differ diff --git a/collects/scribblings/drscheme/example.ss b/collects/scribblings/drscheme/example.ss new file mode 100644 index 0000000000..05e15e2427 --- /dev/null +++ b/collects/scribblings/drscheme/example.ss @@ -0,0 +1,7 @@ +#lang scheme + +;; square : number -> number +;; to produce the square of x +(define (square x) + (* x x)) + diff --git a/collects/scribblings/drscheme/interface-essentials.scrbl b/collects/scribblings/drscheme/interface-essentials.scrbl index 3b256d93ca..9873c21f7d 100644 --- a/collects/scribblings/drscheme/interface-essentials.scrbl +++ b/collects/scribblings/drscheme/interface-essentials.scrbl @@ -16,7 +16,7 @@ The DrScheme window has three parts: a row of buttons at the top, two editing panels in the middle, and a status line at the bottom. -@image["screen-shot.png"] +@image["example.png"] The top editing panel, called the @deftech{definitions window}, is for defining programs. The above figure shows a program that defines the diff --git a/collects/scribblings/drscheme/io.png b/collects/scribblings/drscheme/io.png index 0bf2eec58a..0efc145f13 100644 Binary files a/collects/scribblings/drscheme/io.png and b/collects/scribblings/drscheme/io.png differ diff --git a/collects/scribblings/drscheme/screen-shot.png b/collects/scribblings/drscheme/screen-shot.png deleted file mode 100644 index 45aaf95a2c..0000000000 Binary files a/collects/scribblings/drscheme/screen-shot.png and /dev/null differ diff --git a/collects/scribblings/gui/canvas-class.scrbl b/collects/scribblings/gui/canvas-class.scrbl index 92bd895acb..505aac33b6 100644 --- a/collects/scribblings/gui/canvas-class.scrbl +++ b/collects/scribblings/gui/canvas-class.scrbl @@ -45,7 +45,7 @@ The @scheme[style] argument indicates one or more of the following styles: @item{@scheme['resize-corner] --- leaves room for a resize control at the canvas's bottom right when only one scrollbar is visible} - @item{@scheme['gl] --- {\em obsolete} (every canvas is an OpenGL context where supported)} + @item{@scheme['gl] --- @italic{obsolete} (every canvas is an OpenGL context where supported)} @item{@scheme['no-autoclear] --- prevents automatic erasing of the canvas before calls to diff --git a/collects/scribblings/gui/editor-overview.scrbl b/collects/scribblings/gui/editor-overview.scrbl index b65ac8c2df..ddcfeb7cdb 100644 --- a/collects/scribblings/gui/editor-overview.scrbl +++ b/collects/scribblings/gui/editor-overview.scrbl @@ -310,7 +310,7 @@ Each new style is defined in one of two ways: @item{A @deftech{join style} is defined in terms of two other styles: a base style and a @deftech{shift style}. The meaning of a join style is determined by reinterpreting the shift style; in the - reinterpretation, the base style is used as the {\em root\/} style + reinterpretation, the base style is used as the @italic{root} style for the shift style. (This is analogous to multi-level styles, like the paragraph and character styles in FrameMaker. In this analogy, the paragraph style is the base style, and the @@ -698,7 +698,7 @@ Instances of @scheme[editor<%>] have three levels of internal } -The internal lock for an editor is {\em not\/} affected by calls to +The internal lock for an editor is @italic{not} affected by calls to @method[editor<%> lock]. Methods that report @techlink{location}-independent information about an diff --git a/collects/scribblings/gui/editor-snip-class.scrbl b/collects/scribblings/gui/editor-snip-class.scrbl index d517d0a365..e21d7fb45e 100644 --- a/collects/scribblings/gui/editor-snip-class.scrbl +++ b/collects/scribblings/gui/editor-snip-class.scrbl @@ -231,7 +231,7 @@ See also @method[editor-snip% get-align-top-line]. Sets the editor contained by the snip, releasing the old editor in the snip (if any). If the new editor already has an administrator, then - the new editor is {\em not} installed into the snip. + the new editor is @italic{not} installed into the snip. When an @scheme[editor-snip%] object is not inserted in an editor, it does not have an administrator. During this time, it does not give diff --git a/collects/scribblings/gui/horizontal-panel-class.scrbl b/collects/scribblings/gui/horizontal-panel-class.scrbl index 2ef4e7d39e..19cfdaf9b9 100644 --- a/collects/scribblings/gui/horizontal-panel-class.scrbl +++ b/collects/scribblings/gui/horizontal-panel-class.scrbl @@ -27,8 +27,18 @@ If the @scheme['border] style is specified, the window is created with less than its total size). @DeletedStyleNote{panel} @WindowKWs[] @SubareaKWs[] @AreaContKWs[] @AreaKWs[] +} +@defmethod[(set-orientation [horizontal? boolean?]) void?]{ + Sets the orientation of the panel, switching it between + the behavior of the @scheme[vertical-panel%] and that of + the @scheme[horizontal-panel%]. +} - -}} +@defmethod[(get-orientation) boolean?]{ + Initially returns @scheme[#t], but if + @method[horizontal-panel% set-orientation] is called, + this method returns whatever the last value passed to it was. +} +} diff --git a/collects/scribblings/gui/radio-box-class.scrbl b/collects/scribblings/gui/radio-box-class.scrbl index 11c5964376..fbea90c5d4 100644 --- a/collects/scribblings/gui/radio-box-class.scrbl +++ b/collects/scribblings/gui/radio-box-class.scrbl @@ -143,7 +143,7 @@ box, @|MismatchExn|. void?]{ Sets the selected radio button by position. (The control's callback - procedure is {\em not} invoked.) Radio buttons are numbered from + procedure is @italic{not} invoked.) Radio buttons are numbered from @scheme[0]. If @scheme[n] is equal to or larger than the number of radio buttons in the radio box, @|MismatchExn|. diff --git a/collects/scribblings/gui/snip-class.scrbl b/collects/scribblings/gui/snip-class.scrbl index d049ac8864..ad01b41785 100644 --- a/collects/scribblings/gui/snip-class.scrbl +++ b/collects/scribblings/gui/snip-class.scrbl @@ -283,7 +283,7 @@ A drawing context is provided for the purpose of finding font sizes, sizing that overrides that device context's current font. The snip's left and top @techlink{location}s are provided in editor - coordinates. In a text editor, the y-coordinate is the {\em line's} + coordinates. In a text editor, the y-coordinate is the @italic{line's} top @techlink{location}; the snip's actual top @techlink{location} is potentially undetermined until its height is known. diff --git a/collects/scribblings/gui/timer-class.scrbl b/collects/scribblings/gui/timer-class.scrbl index a5f0ef61c9..d29ca13dbf 100644 --- a/collects/scribblings/gui/timer-class.scrbl +++ b/collects/scribblings/gui/timer-class.scrbl @@ -70,7 +70,7 @@ Starts (or restarts) the timer. If the timer is already running, its The timer's alarm expires after @scheme[msec] milliseconds, at which point @method[timer% notify] is called (on an event boundary). If -@scheme[just-once?]\ is @scheme[#f], the timer expires {\em every} +@scheme[just-once?]\ is @scheme[#f], the timer expires @italic{every} @scheme[msec] milliseconds until the timer is explicitly stopped;\footnote{More precisely, the timer expires @scheme[msec] milliseconds after @method[timer% notify] returns each time} diff --git a/collects/scribblings/gui/vertical-panel-class.scrbl b/collects/scribblings/gui/vertical-panel-class.scrbl index 61dab5263c..9397854f7d 100644 --- a/collects/scribblings/gui/vertical-panel-class.scrbl +++ b/collects/scribblings/gui/vertical-panel-class.scrbl @@ -30,8 +30,18 @@ If the @scheme['border] style is specified, the window is created with less than its total size). @DeletedStyleNote{panel} @WindowKWs[] @SubareaKWs[] @AreaContKWs[] @AreaKWs[] +} +@defmethod[(set-orientation [horizontal? boolean?]) void?]{ + Sets the orientation of the panel, switching it between + the behavior of the @scheme[vertical-panel%] and that of + the @scheme[horizontal-panel%]. +} - -}} +@defmethod[(get-orientation) boolean?]{ + Initially returns @scheme[#f], but if + @method[vertical-panel% set-orientation] is called, + this method returns whatever the last value passed to it was. +} +} diff --git a/collects/tests/mred/windowing.ss b/collects/tests/mred/windowing.ss index 056c752e5c..8d20269411 100644 --- a/collects/tests/mred/windowing.ss +++ b/collects/tests/mred/windowing.ss @@ -992,7 +992,7 @@ (define (panel-tests frame% show?) (define (panel-test % win?) (let* ([frame (make-object frame% "Panel Test" #f 100 100)] - [panel (if % + [panel (if % (make-object % frame) frame)]) (let ([go @@ -1001,6 +1001,8 @@ (if win? ((if % containee-window-tests window-tests) panel #t #t (and % frame) frame 0) (area-tests panel #t #t #f)) + (when (is-a? panel panel%) + (st #t panel get-orientation (is-a? panel horizontal-panel%))) (container-tests panel win?) (send frame show #f))]) (when (eq? show? 'dialog)