(define standard-menus<%>
  (interface
   (basic<%>)
   get-menu%
   get-menu-item%
   get-checkable-menu-item%
   get-file-menu
   get-edit-menu
   get-help-menu
   file-menu:new-callback
   file-menu:get-new-item
   file-menu:new-string
   file-menu:new-help-string
   file-menu:new-on-demand
   file-menu:create-new?
   file-menu:between-new-and-open
   file-menu:open-callback
   file-menu:get-open-item
   file-menu:open-string
   file-menu:open-help-string
   file-menu:open-on-demand
   file-menu:create-open?
   file-menu:open-recent-callback
   file-menu:get-open-recent-item
   file-menu:open-recent-string
   file-menu:open-recent-help-string
   file-menu:open-recent-on-demand
   file-menu:create-open-recent?
   file-menu:between-open-and-revert
   file-menu:revert-callback
   file-menu:get-revert-item
   file-menu:revert-string
   file-menu:revert-help-string
   file-menu:revert-on-demand
   file-menu:create-revert?
   file-menu:between-revert-and-save
   file-menu:save-callback
   file-menu:get-save-item
   file-menu:save-string
   file-menu:save-help-string
   file-menu:save-on-demand
   file-menu:create-save?
   file-menu:save-as-callback
   file-menu:get-save-as-item
   file-menu:save-as-string
   file-menu:save-as-help-string
   file-menu:save-as-on-demand
   file-menu:create-save-as?
   file-menu:between-save-as-and-print
   file-menu:print-callback
   file-menu:get-print-item
   file-menu:print-string
   file-menu:print-help-string
   file-menu:print-on-demand
   file-menu:create-print?
   file-menu:between-print-and-close
   file-menu:close-callback
   file-menu:get-close-item
   file-menu:close-string
   file-menu:close-help-string
   file-menu:close-on-demand
   file-menu:create-close?
   file-menu:between-close-and-quit
   file-menu:quit-callback
   file-menu:get-quit-item
   file-menu:quit-string
   file-menu:quit-help-string
   file-menu:quit-on-demand
   file-menu:create-quit?
   file-menu:after-quit
   edit-menu:undo-callback
   edit-menu:get-undo-item
   edit-menu:undo-string
   edit-menu:undo-help-string
   edit-menu:undo-on-demand
   edit-menu:create-undo?
   edit-menu:redo-callback
   edit-menu:get-redo-item
   edit-menu:redo-string
   edit-menu:redo-help-string
   edit-menu:redo-on-demand
   edit-menu:create-redo?
   edit-menu:between-redo-and-cut
   edit-menu:cut-callback
   edit-menu:get-cut-item
   edit-menu:cut-string
   edit-menu:cut-help-string
   edit-menu:cut-on-demand
   edit-menu:create-cut?
   edit-menu:between-cut-and-copy
   edit-menu:copy-callback
   edit-menu:get-copy-item
   edit-menu:copy-string
   edit-menu:copy-help-string
   edit-menu:copy-on-demand
   edit-menu:create-copy?
   edit-menu:between-copy-and-paste
   edit-menu:paste-callback
   edit-menu:get-paste-item
   edit-menu:paste-string
   edit-menu:paste-help-string
   edit-menu:paste-on-demand
   edit-menu:create-paste?
   edit-menu:between-paste-and-clear
   edit-menu:clear-callback
   edit-menu:get-clear-item
   edit-menu:clear-string
   edit-menu:clear-help-string
   edit-menu:clear-on-demand
   edit-menu:create-clear?
   edit-menu:between-clear-and-select-all
   edit-menu:select-all-callback
   edit-menu:get-select-all-item
   edit-menu:select-all-string
   edit-menu:select-all-help-string
   edit-menu:select-all-on-demand
   edit-menu:create-select-all?
   edit-menu:between-select-all-and-find
   edit-menu:find-callback
   edit-menu:get-find-item
   edit-menu:find-string
   edit-menu:find-help-string
   edit-menu:find-on-demand
   edit-menu:create-find?
   edit-menu:find-next-callback
   edit-menu:get-find-next-item
   edit-menu:find-next-string
   edit-menu:find-next-help-string
   edit-menu:find-next-on-demand
   edit-menu:create-find-next?
   edit-menu:find-previous-callback
   edit-menu:get-find-previous-item
   edit-menu:find-previous-string
   edit-menu:find-previous-help-string
   edit-menu:find-previous-on-demand
   edit-menu:create-find-previous?
   edit-menu:show/hide-replace-callback
   edit-menu:get-show/hide-replace-item
   edit-menu:show/hide-replace-string
   edit-menu:show/hide-replace-help-string
   edit-menu:show/hide-replace-on-demand
   edit-menu:create-show/hide-replace?
   edit-menu:replace-callback
   edit-menu:get-replace-item
   edit-menu:replace-string
   edit-menu:replace-help-string
   edit-menu:replace-on-demand
   edit-menu:create-replace?
   edit-menu:replace-all-callback
   edit-menu:get-replace-all-item
   edit-menu:replace-all-string
   edit-menu:replace-all-help-string
   edit-menu:replace-all-on-demand
   edit-menu:create-replace-all?
   edit-menu:find-case-sensitive-callback
   edit-menu:get-find-case-sensitive-item
   edit-menu:find-case-sensitive-string
   edit-menu:find-case-sensitive-help-string
   edit-menu:find-case-sensitive-on-demand
   edit-menu:create-find-case-sensitive?
   edit-menu:between-find-and-preferences
   edit-menu:preferences-callback
   edit-menu:get-preferences-item
   edit-menu:preferences-string
   edit-menu:preferences-help-string
   edit-menu:preferences-on-demand
   edit-menu:create-preferences?
   edit-menu:after-preferences
   help-menu:before-about
   help-menu:about-callback
   help-menu:get-about-item
   help-menu:about-string
   help-menu:about-help-string
   help-menu:about-on-demand
   help-menu:create-about?
   help-menu:after-about))

(define standard-menus-mixin
  (mixin
   (basic<%>)
   (standard-menus<%>)
   (inherit on-menu-char on-traverse-char)
   (define remove-prefs-callback
     (preferences:add-callback
      'framework:menu-bindings
      (λ (p v)
        (let loop ((menu (get-menu-bar)))
          (when (is-a? menu menu:can-restore<%>)
            (if v (send menu restore-keybinding) (send menu set-shortcut #f)))
          (when (is-a? menu menu:can-restore-underscore<%>)
            (if v
              (send menu restore-underscores)
              (send menu erase-underscores)))
          (when (is-a? menu menu-item-container<%>)
            (for-each loop (send menu get-items)))))))
   (inherit get-menu-bar show can-close? get-edit-target-object)
   (define/augment
    on-close
    (λ () (remove-prefs-callback) (inner (void) on-close)))
   (define/public get-menu% (λ () menu:can-restore-underscore-menu%))
   (define/public get-menu-item% (λ () menu:can-restore-menu-item%))
   (define/public
    get-checkable-menu-item%
    (λ () menu:can-restore-checkable-menu-item%))
   (define/public get-file-menu (λ () file-menu))
   (define/public get-edit-menu (λ () edit-menu))
   (define/public get-help-menu (λ () help-menu))
   (define/public
    file-menu:new-callback
    (λ (item control) (handler:edit-file #f) #t))
   (define/public (file-menu:get-new-item) file-menu:new-item)
   (define/public (file-menu:new-string) (string-constant new-menu-item))
   (define/public (file-menu:new-help-string) (string-constant new-info))
   (define/public file-menu:new-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-new?) #t)
   (define/public file-menu:between-new-and-open (λ (menu) (void)))
   (define/public
    file-menu:open-callback
    (λ (item control) (handler:open-file) #t))
   (define/public (file-menu:get-open-item) file-menu:open-item)
   (define/public (file-menu:open-string) (string-constant open-menu-item))
   (define/public (file-menu:open-help-string) (string-constant open-info))
   (define/public file-menu:open-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-open?) #t)
   (define/public file-menu:open-recent-callback (λ (x y) (void)))
   (define/public (file-menu:get-open-recent-item) file-menu:open-recent-item)
   (define/public
    (file-menu:open-recent-string)
    (string-constant open-recent-menu-item))
   (define/public
    (file-menu:open-recent-help-string)
    (string-constant open-recent-info))
   (define/public
    file-menu:open-recent-on-demand
    (λ (menu) (handler:install-recent-items menu)))
   (define/public (file-menu:create-open-recent?) #t)
   (define/public file-menu:between-open-and-revert (λ (menu) (void)))
   (define/public file-menu:revert-callback (λ (item control) (void)))
   (define/public (file-menu:get-revert-item) file-menu:revert-item)
   (define/public (file-menu:revert-string) (string-constant revert-menu-item))
   (define/public (file-menu:revert-help-string) (string-constant revert-info))
   (define/public file-menu:revert-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-revert?) #f)
   (define/public file-menu:between-revert-and-save (λ (menu) (void)))
   (define/public file-menu:save-callback (λ (item control) (void)))
   (define/public (file-menu:get-save-item) file-menu:save-item)
   (define/public (file-menu:save-string) (string-constant save-menu-item))
   (define/public (file-menu:save-help-string) (string-constant save-info))
   (define/public file-menu:save-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-save?) #f)
   (define/public file-menu:save-as-callback (λ (item control) (void)))
   (define/public (file-menu:get-save-as-item) file-menu:save-as-item)
   (define/public
    (file-menu:save-as-string)
    (string-constant save-as-menu-item))
   (define/public
    (file-menu:save-as-help-string)
    (string-constant save-as-info))
   (define/public file-menu:save-as-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-save-as?) #f)
   (define/public file-menu:between-save-as-and-print (λ (menu) (void)))
   (define/public file-menu:print-callback (λ (item control) (void)))
   (define/public (file-menu:get-print-item) file-menu:print-item)
   (define/public (file-menu:print-string) (string-constant print-menu-item))
   (define/public (file-menu:print-help-string) (string-constant print-info))
   (define/public file-menu:print-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-print?) #f)
   (define/public
    file-menu:between-print-and-close
    (λ (menu) (make-object separator-menu-item% menu)))
   (define/public
    file-menu:close-callback
    (λ (item control) (when (can-close?) (on-close) (show #f)) #t))
   (define/public (file-menu:get-close-item) file-menu:close-item)
   (define/public (file-menu:close-string) (string-constant close-menu-item))
   (define/public (file-menu:close-help-string) (string-constant close-info))
   (define/public file-menu:close-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-close?) #t)
   (define/public file-menu:between-close-and-quit (λ (menu) (void)))
   (define/public
    file-menu:quit-callback
    (λ (item control) (when (exit:user-oks-exit) (exit:exit))))
   (define/public (file-menu:get-quit-item) file-menu:quit-item)
   (define/public
    (file-menu:quit-string)
    (if (eq? (system-type) 'windows)
      (string-constant quit-menu-item-windows)
      (string-constant quit-menu-item-others)))
   (define/public (file-menu:quit-help-string) (string-constant quit-info))
   (define/public file-menu:quit-on-demand (λ (menu-item) (void)))
   (define/public (file-menu:create-quit?) (not (eq? (system-type) 'macosx)))
   (define/public file-menu:after-quit (λ (menu) (void)))
   (define/public
    edit-menu:undo-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'undo)))
      #t))
   (define/public (edit-menu:get-undo-item) edit-menu:undo-item)
   (define/public (edit-menu:undo-string) (string-constant undo-menu-item))
   (define/public (edit-menu:undo-help-string) (string-constant undo-info))
   (define/public
    edit-menu:undo-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'undo))))
        (send item enable enable?))))
   (define/public (edit-menu:create-undo?) #t)
   (define/public
    edit-menu:redo-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'redo)))
      #t))
   (define/public (edit-menu:get-redo-item) edit-menu:redo-item)
   (define/public (edit-menu:redo-string) (string-constant redo-menu-item))
   (define/public (edit-menu:redo-help-string) (string-constant redo-info))
   (define/public
    edit-menu:redo-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'redo))))
        (send item enable enable?))))
   (define/public (edit-menu:create-redo?) #t)
   (define/public
    edit-menu:between-redo-and-cut
    (λ (menu) (make-object separator-menu-item% menu)))
   (define/public
    edit-menu:cut-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'cut)))
      #t))
   (define/public (edit-menu:get-cut-item) edit-menu:cut-item)
   (define/public (edit-menu:cut-string) (string-constant cut-menu-item))
   (define/public (edit-menu:cut-help-string) (string-constant cut-info))
   (define/public
    edit-menu:cut-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'cut))))
        (send item enable enable?))))
   (define/public (edit-menu:create-cut?) #t)
   (define/public edit-menu:between-cut-and-copy (λ (menu) (void)))
   (define/public
    edit-menu:copy-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'copy)))
      #t))
   (define/public (edit-menu:get-copy-item) edit-menu:copy-item)
   (define/public (edit-menu:copy-string) (string-constant copy-menu-item))
   (define/public (edit-menu:copy-help-string) (string-constant copy-info))
   (define/public
    edit-menu:copy-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'copy))))
        (send item enable enable?))))
   (define/public (edit-menu:create-copy?) #t)
   (define/public edit-menu:between-copy-and-paste (λ (menu) (void)))
   (define/public
    edit-menu:paste-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'paste)))
      #t))
   (define/public (edit-menu:get-paste-item) edit-menu:paste-item)
   (define/public (edit-menu:paste-string) (string-constant paste-menu-item))
   (define/public (edit-menu:paste-help-string) (string-constant paste-info))
   (define/public
    edit-menu:paste-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'paste))))
        (send item enable enable?))))
   (define/public (edit-menu:create-paste?) #t)
   (define/public edit-menu:between-paste-and-clear (λ (menu) (void)))
   (define/public
    edit-menu:clear-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'clear)))
      #t))
   (define/public (edit-menu:get-clear-item) edit-menu:clear-item)
   (define/public
    (edit-menu:clear-string)
    (if (eq? (system-type) 'windows)
      (string-constant clear-menu-item-windows)
      (string-constant clear-menu-item-windows)))
   (define/public (edit-menu:clear-help-string) (string-constant clear-info))
   (define/public
    edit-menu:clear-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'clear))))
        (send item enable enable?))))
   (define/public (edit-menu:create-clear?) #t)
   (define/public edit-menu:between-clear-and-select-all (λ (menu) (void)))
   (define/public
    edit-menu:select-all-callback
    (λ (menu evt)
      (let ((edit (get-edit-target-object)))
        (when (and edit (is-a? edit editor<%>))
          (send edit do-edit-operation 'select-all)))
      #t))
   (define/public (edit-menu:get-select-all-item) edit-menu:select-all-item)
   (define/public
    (edit-menu:select-all-string)
    (string-constant select-all-menu-item))
   (define/public
    (edit-menu:select-all-help-string)
    (string-constant select-all-info))
   (define/public
    edit-menu:select-all-on-demand
    (λ (item)
      (let* ((editor (get-edit-target-object))
             (enable?
              (and editor
                   (is-a? editor editor<%>)
                   (send editor can-do-edit-operation? 'select-all))))
        (send item enable enable?))))
   (define/public (edit-menu:create-select-all?) #t)
   (define/public
    edit-menu:between-select-all-and-find
    (λ (menu) (make-object separator-menu-item% menu)))
   (define/public edit-menu:find-callback (λ (item control) (void)))
   (define/public (edit-menu:get-find-item) edit-menu:find-item)
   (define/public (edit-menu:find-string) (string-constant find-menu-item))
   (define/public (edit-menu:find-help-string) (string-constant find-info))
   (define/public
    edit-menu:find-on-demand
    (λ (item)
      (send item enable
        (let
         ((target (get-edit-target-object)))
         (and target (is-a? target editor<%>))))))
   (define/public (edit-menu:create-find?) #f)
   (define/public edit-menu:find-next-callback (λ (item control) (void)))
   (define/public (edit-menu:get-find-next-item) edit-menu:find-next-item)
   (define/public
    (edit-menu:find-next-string)
    (string-constant find-next-menu-item))
   (define/public
    (edit-menu:find-next-help-string)
    (string-constant find-next-info))
   (define/public
    edit-menu:find-next-on-demand
    (λ (item)
      (send item enable
        (let
         ((target (get-edit-target-object)))
         (and target (is-a? target editor<%>))))))
   (define/public (edit-menu:create-find-next?) #f)
   (define/public edit-menu:find-previous-callback (λ (item control) (void)))
   (define/public
    (edit-menu:get-find-previous-item)
    edit-menu:find-previous-item)
   (define/public
    (edit-menu:find-previous-string)
    (string-constant find-previous-menu-item))
   (define/public
    (edit-menu:find-previous-help-string)
    (string-constant find-previous-info))
   (define/public
    edit-menu:find-previous-on-demand
    (λ (item)
      (send item enable
        (let
         ((target (get-edit-target-object)))
         (and target (is-a? target editor<%>))))))
   (define/public (edit-menu:create-find-previous?) #f)
   (define/public
    edit-menu:show/hide-replace-callback
    (λ (item control) (void)))
   (define/public
    (edit-menu:get-show/hide-replace-item)
    edit-menu:show/hide-replace-item)
   (define/public
    (edit-menu:show/hide-replace-string)
    (string-constant show-replace-menu-item))
   (define/public
    (edit-menu:show/hide-replace-help-string)
    (string-constant show/hide-replace-info))
   (define/public edit-menu:show/hide-replace-on-demand (λ (menu-item) (void)))
   (define/public (edit-menu:create-show/hide-replace?) #f)
   (define/public edit-menu:replace-callback (λ (item control) (void)))
   (define/public (edit-menu:get-replace-item) edit-menu:replace-item)
   (define/public
    (edit-menu:replace-string)
    (string-constant replace-menu-item))
   (define/public
    (edit-menu:replace-help-string)
    (string-constant replace-info))
   (define/public edit-menu:replace-on-demand (λ (menu-item) (void)))
   (define/public (edit-menu:create-replace?) #f)
   (define/public edit-menu:replace-all-callback (λ (item control) (void)))
   (define/public (edit-menu:get-replace-all-item) edit-menu:replace-all-item)
   (define/public
    (edit-menu:replace-all-string)
    (string-constant replace-all-menu-item))
   (define/public
    (edit-menu:replace-all-help-string)
    (string-constant replace-all-info))
   (define/public edit-menu:replace-all-on-demand (λ (menu-item) (void)))
   (define/public (edit-menu:create-replace-all?) #f)
   (define/public
    edit-menu:find-case-sensitive-callback
    (λ (item control) (void)))
   (define/public
    (edit-menu:get-find-case-sensitive-item)
    edit-menu:find-case-sensitive-item)
   (define/public
    (edit-menu:find-case-sensitive-string)
    (string-constant find-case-sensitive-menu-item))
   (define/public
    (edit-menu:find-case-sensitive-help-string)
    (string-constant find-case-sensitive-info))
   (define/public
    edit-menu:find-case-sensitive-on-demand
    (λ (item)
      (send item enable
        (let
         ((target (get-edit-target-object)))
         (and target (is-a? target editor<%>))))))
   (define/public (edit-menu:create-find-case-sensitive?) #f)
   (define/public
    edit-menu:between-find-and-preferences
    (λ (menu)
      (unless (current-eventspace-has-standard-menus?)
        (make-object separator-menu-item% menu))))
   (define/public
    edit-menu:preferences-callback
    (λ (item control) (preferences:show-dialog) #t))
   (define/public (edit-menu:get-preferences-item) edit-menu:preferences-item)
   (define/public
    (edit-menu:preferences-string)
    (string-constant preferences-menu-item))
   (define/public
    (edit-menu:preferences-help-string)
    (string-constant preferences-info))
   (define/public edit-menu:preferences-on-demand (λ (menu-item) (void)))
   (define/public
    (edit-menu:create-preferences?)
    (not (current-eventspace-has-standard-menus?)))
   (define/public edit-menu:after-preferences (λ (menu) (void)))
   (define/public help-menu:before-about (λ (menu) (void)))
   (define/public help-menu:about-callback (λ (item control) (void)))
   (define/public (help-menu:get-about-item) help-menu:about-item)
   (define/public (help-menu:about-string) (string-constant about-menu-item))
   (define/public (help-menu:about-help-string) (string-constant about-info))
   (define/public help-menu:about-on-demand (λ (menu-item) (void)))
   (define/public (help-menu:create-about?) #f)
   (define/public help-menu:after-about (λ (menu) (void)))
   (super-instantiate ())
   (define file-menu
     (make-object (get-menu%)
       (string-constant file-menu-label)
       (get-menu-bar)))
   (define edit-menu
     (make-object (get-menu%)
       (string-constant edit-menu-label)
       (get-menu-bar)))
   (define help-menu
     (make-object (get-menu%)
       (string-constant help-menu-label)
       (get-menu-bar)))
   (define file-menu:new-item
     (and (file-menu:create-new?)
          (new
           (get-menu-item%)
           (label (file-menu:new-string))
           (parent file-menu)
           (callback
            (let ((file-menu:new-callback
                   (λ (item evt) (file-menu:new-callback item evt))))
              file-menu:new-callback))
           (shortcut #\n)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:new-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:new-on-demand menu-item))))))
   (file-menu:between-new-and-open (get-file-menu))
   (define file-menu:open-item
     (and (file-menu:create-open?)
          (new
           (get-menu-item%)
           (label (file-menu:open-string))
           (parent file-menu)
           (callback
            (let ((file-menu:open-callback
                   (λ (item evt) (file-menu:open-callback item evt))))
              file-menu:open-callback))
           (shortcut #\o)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:open-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:open-on-demand menu-item))))))
   (define file-menu:open-recent-item
     (and (file-menu:create-open-recent?)
          (new
           (get-menu%)
           (label (file-menu:open-recent-string))
           (parent file-menu)
           (help-string (file-menu:open-recent-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:open-recent-on-demand menu-item))))))
   (file-menu:between-open-and-revert (get-file-menu))
   (define file-menu:revert-item
     (and (file-menu:create-revert?)
          (new
           (get-menu-item%)
           (label (file-menu:revert-string))
           (parent file-menu)
           (callback
            (let ((file-menu:revert-callback
                   (λ (item evt) (file-menu:revert-callback item evt))))
              file-menu:revert-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:revert-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:revert-on-demand menu-item))))))
   (file-menu:between-revert-and-save (get-file-menu))
   (define file-menu:save-item
     (and (file-menu:create-save?)
          (new
           (get-menu-item%)
           (label (file-menu:save-string))
           (parent file-menu)
           (callback
            (let ((file-menu:save-callback
                   (λ (item evt) (file-menu:save-callback item evt))))
              file-menu:save-callback))
           (shortcut #\s)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:save-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:save-on-demand menu-item))))))
   (define file-menu:save-as-item
     (and (file-menu:create-save-as?)
          (new
           (get-menu-item%)
           (label (file-menu:save-as-string))
           (parent file-menu)
           (callback
            (let ((file-menu:save-as-callback
                   (λ (item evt) (file-menu:save-as-callback item evt))))
              file-menu:save-as-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:save-as-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:save-as-on-demand menu-item))))))
   (file-menu:between-save-as-and-print (get-file-menu))
   (define file-menu:print-item
     (and (file-menu:create-print?)
          (new
           (get-menu-item%)
           (label (file-menu:print-string))
           (parent file-menu)
           (callback
            (let ((file-menu:print-callback
                   (λ (item evt) (file-menu:print-callback item evt))))
              file-menu:print-callback))
           (shortcut #\p)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:print-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:print-on-demand menu-item))))))
   (file-menu:between-print-and-close (get-file-menu))
   (define file-menu:close-item
     (and (file-menu:create-close?)
          (new
           (get-menu-item%)
           (label (file-menu:close-string))
           (parent file-menu)
           (callback
            (let ((file-menu:close-callback
                   (λ (item evt) (file-menu:close-callback item evt))))
              file-menu:close-callback))
           (shortcut #\w)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:close-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:close-on-demand menu-item))))))
   (file-menu:between-close-and-quit (get-file-menu))
   (define file-menu:quit-item
     (and (file-menu:create-quit?)
          (new
           (get-menu-item%)
           (label (file-menu:quit-string))
           (parent file-menu)
           (callback
            (let ((file-menu:quit-callback
                   (λ (item evt) (file-menu:quit-callback item evt))))
              file-menu:quit-callback))
           (shortcut #\q)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (file-menu:quit-help-string))
           (demand-callback
            (λ (menu-item) (file-menu:quit-on-demand menu-item))))))
   (file-menu:after-quit (get-file-menu))
   (define edit-menu:undo-item
     (and (edit-menu:create-undo?)
          (new
           (get-menu-item%)
           (label (edit-menu:undo-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:undo-callback
                   (λ (item evt) (edit-menu:undo-callback item evt))))
              edit-menu:undo-callback))
           (shortcut #\z)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:undo-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:undo-on-demand menu-item))))))
   (define edit-menu:redo-item
     (and (edit-menu:create-redo?)
          (new
           (get-menu-item%)
           (label (edit-menu:redo-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:redo-callback
                   (λ (item evt) (edit-menu:redo-callback item evt))))
              edit-menu:redo-callback))
           (shortcut (if (eq? (system-type) 'windows) #\y #\z))
           (shortcut-prefix
            (if (eq? (system-type) 'windows)
              (get-default-shortcut-prefix)
              (cons 'shift (get-default-shortcut-prefix))))
           (help-string (edit-menu:redo-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:redo-on-demand menu-item))))))
   (edit-menu:between-redo-and-cut (get-edit-menu))
   (define edit-menu:cut-item
     (and (edit-menu:create-cut?)
          (new
           (get-menu-item%)
           (label (edit-menu:cut-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:cut-callback
                   (λ (item evt) (edit-menu:cut-callback item evt))))
              edit-menu:cut-callback))
           (shortcut #\x)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:cut-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:cut-on-demand menu-item))))))
   (edit-menu:between-cut-and-copy (get-edit-menu))
   (define edit-menu:copy-item
     (and (edit-menu:create-copy?)
          (new
           (get-menu-item%)
           (label (edit-menu:copy-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:copy-callback
                   (λ (item evt) (edit-menu:copy-callback item evt))))
              edit-menu:copy-callback))
           (shortcut #\c)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:copy-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:copy-on-demand menu-item))))))
   (edit-menu:between-copy-and-paste (get-edit-menu))
   (define edit-menu:paste-item
     (and (edit-menu:create-paste?)
          (new
           (get-menu-item%)
           (label (edit-menu:paste-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:paste-callback
                   (λ (item evt) (edit-menu:paste-callback item evt))))
              edit-menu:paste-callback))
           (shortcut #\v)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:paste-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:paste-on-demand menu-item))))))
   (edit-menu:between-paste-and-clear (get-edit-menu))
   (define edit-menu:clear-item
     (and (edit-menu:create-clear?)
          (new
           (get-menu-item%)
           (label (edit-menu:clear-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:clear-callback
                   (λ (item evt) (edit-menu:clear-callback item evt))))
              edit-menu:clear-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:clear-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:clear-on-demand menu-item))))))
   (edit-menu:between-clear-and-select-all (get-edit-menu))
   (define edit-menu:select-all-item
     (and (edit-menu:create-select-all?)
          (new
           (get-menu-item%)
           (label (edit-menu:select-all-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:select-all-callback
                   (λ (item evt) (edit-menu:select-all-callback item evt))))
              edit-menu:select-all-callback))
           (shortcut #\a)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:select-all-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:select-all-on-demand menu-item))))))
   (edit-menu:between-select-all-and-find (get-edit-menu))
   (define edit-menu:find-item
     (and (edit-menu:create-find?)
          (new
           (get-menu-item%)
           (label (edit-menu:find-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:find-callback
                   (λ (item evt) (edit-menu:find-callback item evt))))
              edit-menu:find-callback))
           (shortcut #\f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:find-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:find-on-demand menu-item))))))
   (define edit-menu:find-next-item
     (and (edit-menu:create-find-next?)
          (new
           (get-menu-item%)
           (label (edit-menu:find-next-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:find-next-callback
                   (λ (item evt) (edit-menu:find-next-callback item evt))))
              edit-menu:find-next-callback))
           (shortcut #\g)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:find-next-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:find-next-on-demand menu-item))))))
   (define edit-menu:find-previous-item
     (and (edit-menu:create-find-previous?)
          (new
           (get-menu-item%)
           (label (edit-menu:find-previous-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:find-previous-callback
                   (λ (item evt) (edit-menu:find-previous-callback item evt))))
              edit-menu:find-previous-callback))
           (shortcut #\g)
           (shortcut-prefix (cons 'shift (get-default-shortcut-prefix)))
           (help-string (edit-menu:find-previous-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:find-previous-on-demand menu-item))))))
   (define edit-menu:show/hide-replace-item
     (and (edit-menu:create-show/hide-replace?)
          (new
           (get-menu-item%)
           (label (edit-menu:show/hide-replace-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:show/hide-replace-callback
                   (λ (item evt)
                     (edit-menu:show/hide-replace-callback item evt))))
              edit-menu:show/hide-replace-callback))
           (shortcut #\r)
           (shortcut-prefix (cons 'shift (get-default-shortcut-prefix)))
           (help-string (edit-menu:show/hide-replace-help-string))
           (demand-callback
            (λ (menu-item)
              (edit-menu:show/hide-replace-on-demand menu-item))))))
   (define edit-menu:replace-item
     (and (edit-menu:create-replace?)
          (new
           (get-menu-item%)
           (label (edit-menu:replace-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:replace-callback
                   (λ (item evt) (edit-menu:replace-callback item evt))))
              edit-menu:replace-callback))
           (shortcut #\r)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:replace-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:replace-on-demand menu-item))))))
   (define edit-menu:replace-all-item
     (and (edit-menu:create-replace-all?)
          (new
           (get-menu-item%)
           (label (edit-menu:replace-all-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:replace-all-callback
                   (λ (item evt) (edit-menu:replace-all-callback item evt))))
              edit-menu:replace-all-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:replace-all-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:replace-all-on-demand menu-item))))))
   (define edit-menu:find-case-sensitive-item
     (and (edit-menu:create-find-case-sensitive?)
          (new
           (get-checkable-menu-item%)
           (label (edit-menu:find-case-sensitive-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:find-case-sensitive-callback
                   (λ (item evt)
                     (edit-menu:find-case-sensitive-callback item evt))))
              edit-menu:find-case-sensitive-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:find-case-sensitive-help-string))
           (demand-callback
            (λ (menu-item)
              (edit-menu:find-case-sensitive-on-demand menu-item))))))
   (edit-menu:between-find-and-preferences (get-edit-menu))
   (define edit-menu:preferences-item
     (and (edit-menu:create-preferences?)
          (new
           (get-menu-item%)
           (label (edit-menu:preferences-string))
           (parent edit-menu)
           (callback
            (let ((edit-menu:preferences-callback
                   (λ (item evt) (edit-menu:preferences-callback item evt))))
              edit-menu:preferences-callback))
           (shortcut (case (system-type) ((macosx) #\,) (else #\;)))
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (edit-menu:preferences-help-string))
           (demand-callback
            (λ (menu-item) (edit-menu:preferences-on-demand menu-item))))))
   (edit-menu:after-preferences (get-edit-menu))
   (help-menu:before-about (get-help-menu))
   (define help-menu:about-item
     (and (help-menu:create-about?)
          (new
           (get-menu-item%)
           (label (help-menu:about-string))
           (parent help-menu)
           (callback
            (let ((help-menu:about-callback
                   (λ (item evt) (help-menu:about-callback item evt))))
              help-menu:about-callback))
           (shortcut #f)
           (shortcut-prefix (get-default-shortcut-prefix))
           (help-string (help-menu:about-help-string))
           (demand-callback
            (λ (menu-item) (help-menu:about-on-demand menu-item))))))
   (help-menu:after-about (get-help-menu))
   (reorder-menus this)))
