expr: 100%

#lang racket/gui
;;; Follow the color scheme DrRacket is using (Preferences | Colors | Color Schemes),
;;; so Sauron's panels don't stay white under a dark scheme.
(provide themed-hierarchical-list%
         themed-editor-canvas%
         themed-item-style-list)

(require framework
         mrlib/hierlist)

; hierlist hands every item's editor a fresh style list, so items never pick up
; `editor:set-default-font-color`. Pointing them all at one shared list means a single
; delta recolors every item, including the ones already on screen.
(define themed-item-style-list (new style-list%))
; a fresh style-list% only holds "Basic"; editors would create "Standard" on demand, but we
; need it to exist up front so the first color callback has something to recolor
(define themed-item-style
  (send themed-item-style-list new-named-style
        "Standard"
        (send themed-item-style-list basic-style)))

(define (set-text-color! c)
  (define d (make-object style-delta%))
  (send d set-delta-foreground c)
  (send themed-item-style set-delta d))

(set-text-color! (color-prefs:lookup-in-color-scheme 'framework:default-text-color))
(color-prefs:register-color-scheme-entry-change-callback
 'framework:default-text-color
 set-text-color!)

; canvas:color-mixin tracks 'framework:basic-canvas-background for us
(define themed-hierarchical-list%
  (canvas:color-mixin (canvas:basic-mixin hierarchical-list%)))
(define themed-editor-canvas%
  (canvas:color-mixin (canvas:basic-mixin editor-canvas%)))