#lang racket/base
(require racket/class
         framework
         "interfaces.rkt"
         "../syntax-browser/prefs.rkt"
         unstable/gui/notify
         unstable/gui/prefs)
(provide pref:macro-step-limit
         macro-stepper-config-base%
         macro-stepper-config/prefs%
         macro-stepper-config/prefs/readonly%)

(preferences:set-default 'MacroStepper:Frame:Width 700 number?)
(preferences:set-default 'MacroStepper:Frame:Height 600 number?)
(preferences:set-default 'MacroStepper:PropertiesShown? #f boolean?)
(preferences:set-default 'MacroStepper:PropertiesPanelPercentage 1/3 number?)
(preferences:set-default 'MacroStepper:DrawArrows? #t boolean?)

(preferences:set-default 'MacroStepper:MacroHidingMode "Standard" string?)
(preferences:set-default 'MacroStepper:ShowHidingPanel? #t boolean?)
(preferences:set-default 'MacroStepper:IdentifierComparison "bound-identifier=?" string?)
(preferences:set-default 'MacroStepper:HighlightFoci? #t boolean?)
(preferences:set-default 'MacroStepper:HighlightFrontier? #t boolean?)
(preferences:set-default 'MacroStepper:ShowRenameSteps? #f boolean?)
(preferences:set-default 'MacroStepper:SuppressWarnings? #f boolean?)
(preferences:set-default 'MacroStepper:OneByOne? #f boolean?)
(preferences:set-default 'MacroStepper:ExtraNavigation? #f boolean?)
(preferences:set-default 'MacroStepper:DebugCatchErrors? #t boolean?)
(preferences:set-default 'MacroStepper:SplitContext? #f boolean?)
(preferences:set-default 'MacroStepper:MacroStepLimit 40000
                         (lambda (x) (or (eq? x #f) (exact-positive-integer? x))))
(preferences:set-default 'MacroStepper:RefreshOnResize? #t boolean?)

(define pref:width (pref:get/set 'MacroStepper:Frame:Width))
(define pref:height (pref:get/set 'MacroStepper:Frame:Height))
(define pref:props-shown? (pref:get/set 'MacroStepper:PropertiesShown?))
(define pref:props-percentage (pref:get/set 'MacroStepper:PropertiesPanelPercentage))
(define pref:draw-arrows? (pref:get/set 'MacroStepper:DrawArrows?))

(define pref:macro-hiding-mode (pref:get/set 'MacroStepper:MacroHidingMode))
(define pref:show-hiding-panel? (pref:get/set 'MacroStepper:ShowHidingPanel?))
(define pref:identifier=? (pref:get/set 'MacroStepper:IdentifierComparison))
(define pref:highlight-foci? (pref:get/set 'MacroStepper:HighlightFoci?))
(define pref:highlight-frontier? (pref:get/set 'MacroStepper:HighlightFrontier?))
(define pref:show-rename-steps? (pref:get/set 'MacroStepper:ShowRenameSteps?))
(define pref:suppress-warnings? (pref:get/set 'MacroStepper:SuppressWarnings?))
(define pref:one-by-one? (pref:get/set 'MacroStepper:OneByOne?))
(define pref:extra-navigation? (pref:get/set 'MacroStepper:ExtraNavigation?))
(define pref:debug-catch-errors? (pref:get/set 'MacroStepper:DebugCatchErrors?))
(define pref:split-context? (pref:get/set 'MacroStepper:SplitContext?))
(define pref:macro-step-limit (pref:get/set 'MacroStepper:MacroStepLimit))
(define pref:refresh-on-resize? (pref:get/set 'MacroStepper:RefreshOnResize?))

(define macro-stepper-config-base%
  (class* prefs-base% (config<%>)
    (init-field readonly?)

    (define-syntax-rule (define-pref-notify* (name pref) ...)
      (begin (define-notify name (notify-box/pref pref #:readonly? readonly?)) ...))

    (define-pref-notify*
      (width pref:width)
      (height pref:height)
      (props-percentage pref:props-percentage)
      (props-shown? pref:props-shown?)
      (draw-arrows? pref:draw-arrows?)
      (macro-hiding-mode pref:macro-hiding-mode)
      (show-hiding-panel? pref:show-hiding-panel?)
      (identifier=? pref:identifier=?)
      (highlight-foci? pref:highlight-foci?)
      (highlight-frontier? pref:highlight-frontier?)
      (show-rename-steps? pref:show-rename-steps?)
      (suppress-warnings? pref:suppress-warnings?)
      (one-by-one? pref:one-by-one?)
      (extra-navigation? pref:extra-navigation?)
      (debug-catch-errors? pref:debug-catch-errors?)
      (split-context? pref:split-context?)
      (refresh-on-resize? pref:refresh-on-resize?))
    (super-new)))

(define macro-stepper-config/prefs%
  (class macro-stepper-config-base%
    (super-new (readonly? #f))))

(define macro-stepper-config/prefs/readonly%
  (class macro-stepper-config-base%
    (super-new (readonly? #t))))
