(module icon mzscheme
  (require (lib "unitsig.ss")
	   (lib "class.ss")
           (lib "include-bitmap.ss" "mrlib")
	   "bday.ss"
           "sig.ss"
	   (lib "mred-sig.ss" "mred"))
  
  (provide icon@)
  
  (define icon@
    (unit/sig framework:icon^
      (import mred^)

      (define eof-bitmap (delay (include-bitmap (lib "eof.gif" "icons"))))
      (define (get-eof-bitmap) (force eof-bitmap))
      
      (define anchor-bitmap (delay (include-bitmap (lib "anchor.gif" "icons"))))
      (define (get-anchor-bitmap) (force anchor-bitmap))
      
      (define lock-bitmap (delay (include-bitmap (lib "lock.gif" "icons"))))
      (define (get-lock-bitmap) (force lock-bitmap))
      (define unlock-bitmap (delay (include-bitmap (lib "unlock.gif" "icons"))))
      (define (get-unlock-bitmap) (force unlock-bitmap))
      
      (define autowrap-bitmap (delay (include-bitmap (lib "return.xbm" "icons"))))
      (define (get-autowrap-bitmap) (force autowrap-bitmap))
      (define paren-highlight-bitmap (delay (include-bitmap (lib "paren.xbm" "icons"))))
      (define (get-paren-highlight-bitmap) (force paren-highlight-bitmap))
      
      (define-syntax (make-get-cursor stx)
        (syntax-case stx ()
          [(_ name mask fallback)
           (syntax
            (let ([ans (delay 
                         (let* ([msk-b (include-bitmap (lib mask "icons"))]
                                [csr-b (include-bitmap (lib name "icons"))])
                           (if (and (send msk-b ok?)
                                    (send csr-b ok?))
                               (let ([csr (make-object cursor% msk-b csr-b 7 7)])
                                 (if (send csr ok?)
                                     csr
                                     (make-object cursor% fallback)))
                               (make-object cursor% fallback))))])
              (λ ()
                (force ans))))]))
      
      (define get-up/down-cursor (make-get-cursor "up-down-cursor.xbm" "up-down-mask.xbm" 'size-n/s))
      (define get-left/right-cursor (make-get-cursor "left-right-cursor.xbm" "left-right-mask.xbm" 'size-e/w))
      
      (define mrf-on-bitmap (delay (include-bitmap (lib "mrf.jpg" "icons"))))
      (define gc-on-bitmap (delay (include-bitmap (lib "recycle.gif" "icons"))))
      
      (define (make-off-bitmap onb)
        (let* ([bitmap (make-object bitmap%
                         (send onb get-width)
                         (send onb get-height))]
               [bdc (make-object bitmap-dc% bitmap)])
          (send bdc clear)
          (send bdc set-bitmap #f)
          bitmap))
      
      (define mrf-off-bitmap (delay (make-off-bitmap (force mrf-on-bitmap))))
      (define gc-off-bitmap (delay (make-off-bitmap (force gc-on-bitmap))))
      
      (define (get-gc-on-bitmap)
        (force
         (if (mrf-bday?)
             mrf-on-bitmap
             gc-on-bitmap)))
      
      (define (get-gc-off-bitmap)
        (force
         (if (mrf-bday?)
             mrf-off-bitmap
             gc-off-bitmap))))))
