gui/gui-lib/mred/private/wx/cocoa/message.rkt
Matthew Flatt 60611bc081 cocoa: fix focus method
Don't confuse "should the Tab key advance the focus to this window?"
with "can this window have the focus?".
2015-01-11 11:05:36 -07:00

128 lines
4.5 KiB
Racket

#lang racket/base
(require racket/class
ffi/unsafe
ffi/unsafe/objc
racket/draw/private/bitmap
"../../syntax.rkt"
"../../lock.rkt"
"window.rkt"
"item.rkt"
"utils.rkt"
"types.rkt"
"image.rkt")
(provide
(protect-out message%))
;; ----------------------------------------
(import-class NSTextField NSImageView NSWorkspace NSRunningApplication)
(define _OSType _uint32)
(define-cocoa NSFileTypeForHFSTypeCode (_fun _OSType -> _id))
(define (get-app-icon)
(tell (tell NSRunningApplication currentApplication) icon))
(define (make-icon label)
(let ([icon
(if (eq? label 'app)
(get-app-icon)
(let ([id (integer-bytes->integer
(case label
[(caution) #"caut"]
[(stop) #"stop"])
#f
#t)])
(tell (tell NSWorkspace sharedWorkspace)
iconForFileType:
(NSFileTypeForHFSTypeCode id))))])
(tellv icon retain)
(tellv icon setSize: #:type _NSSize (make-NSSize 64 64))
(unless (eq? label 'app)
;; Add badge:
(let ([app-icon (get-icon 'app)])
(tellv icon lockFocus)
(tellv app-icon drawInRect: #:type _NSRect (make-NSRect (make-NSPoint 32 0)
(make-NSSize 32 32))
fromRect: #:type _NSRect (make-NSRect (make-NSPoint 0 0)
(make-NSSize 64 64))
operation: #:type _int 2 ; NSCompositeSourceOver
fraction: #:type _CGFloat 1.0)
(tellv icon unlockFocus)))
icon))
(define icons (make-hash))
(define (get-icon label)
(or (hash-ref icons label #f)
(let ([icon (atomically (make-icon label))])
(hash-set! icons label icon)
icon)))
;; ----------------------------------------
(define-objc-class RacketTextField NSTextField
#:mixins (KeyMouseResponder CursorDisplayer)
[wxb])
(define-objc-class RacketImageView NSImageView
#:mixins (KeyMouseResponder CursorDisplayer)
[wxb])
(defclass message% item%
(init parent label
x y
style font)
(inherit get-cocoa init-font)
(super-new [parent parent]
[cocoa (let* ([label (cond
[(string? label) label]
[(symbol? label) (get-icon label)]
[else label])]
[cocoa
(if (string? label)
(as-objc-allocation
(tell (tell RacketTextField alloc) init))
(as-objc-allocation
(tell (tell RacketImageView alloc) init)))])
(cond
[(string? label)
(init-font cocoa font)
(tellv cocoa setSelectable: #:type _BOOL #f)
(tellv cocoa setEditable: #:type _BOOL #f)
(tellv cocoa setBordered: #:type _BOOL #f)
(tellv cocoa setDrawsBackground: #:type _BOOL #f)
(tellv cocoa setStringValue: #:type _NSString (strip-mnemonic label))
(tellv cocoa sizeToFit)]
[else
(tellv cocoa setImage: (if (label . is-a? . bitmap%)
(bitmap->image label)
label))
(tellv cocoa setFrame: #:type _NSRect
(make-NSRect (make-NSPoint 0 0)
(if (label . is-a? . bitmap%)
(make-NSSize (send label get-width)
(send label get-height))
(tell #:type _NSSize label size))))])
cocoa)]
[callback void]
[no-show? (memq 'deleted style)])
(define/override (set-label label)
(cond
[(string? label)
(tellv (get-cocoa) setStringValue: #:type _NSString (strip-mnemonic label))]
[else
(tellv (get-cocoa) setImage: (bitmap->image label))]))
(define/override (can-accept-focus?) #f)
(define/public (set-preferred-size)
(tellv (get-cocoa) sizeToFit)
#t)
(def/public-unimplemented get-font))