gui/trace-grid.ss
(module trace-grid mzscheme

  (require (lib "contract.ss")
           (lib "class.ss")
           (lib "mred.ss" "mred")
           "interfaces.ss"
           "util-mixins.ss"
           "editor-canvas-mixins.ss"
           "pasteboard-mixins.ss"
           "snip-mixins.ss"
           "draw.ss")

  (provide/contract
   [trace-grid% (class/c editor-canvas% updatee<%>)])

  (define trace-grid%
    (class*
      (ensure-iface editor-canvas-util<%>
                    editor-canvas-util-mixin
                    (pullable-editor-canvas-mixin editor-canvas%))
      (updatee<%>)

      (super-new [style '(hide-hscroll hide-vscroll)]
                 [horizontal-inset 0]
                 [vertical-inset 0])
      (inherit set-editor get-client-size)

      (init-field view trace-display)
      (public on-update)
      (override on-pull)

      (define editor
        (new trace-grid-editor% [view view]))
      (set-editor editor)

      (define (on-pull editor-x editor-y dc-x dc-y)
        (send trace-display scroll-trace/xy
              (- editor-x dc-x) (- editor-y dc-y)))

      (define (on-update)
        (send editor on-update))))

  (define trace-grid-editor%
    (class*
      (ensure-iface pasteboard-util<%>
                    pasteboard-util-mixin
                    (inert-pasteboard-mixin pasteboard%))
      (updatee<%>)

      (super-new)
      (inherit insert)

      (init-field view)
      (public on-update)

      (define snip
        (new trace-grid-snip% [view view]))
      (insert snip 0 0)

      (define (on-update)
        (send snip on-update))))

  (define trace-grid-snip%
    (class*
      (updatable-snip-mixin
       (custom-snip-mixin snip%))
      (updatee<%>)

      (super-new)

      (init-field view)
      (override paint extent)

      (define (extent dc x y)
        (values (view-width view)
                (view-height view)
                0 0 0 0))

      (define (paint easel)
        (draw-view easel view))

      ))

  )