#lang racket/unit
#|

This file has names with partial prefixes built into them
because the interfaces here used to be in other files, but
that was causing circular dependencies; the interfaces
were moved here to break the cycle, but the names should
remain the same for tools that use them.

|#

(require "drsig.rkt"
         "local-member-names.rkt"
         racket/class 
         framework)
(import)
(export drracket:interface^)

(define frame:basics<%> (interface (frame:standard-menus<%>)))
(define frame:<%>
  (interface (frame:editor<%> frame:basics<%> frame:text-info<%>)
    get-show-menu
    update-shown
    add-show-menu-items))

(define unit:frame<%>
  (interface (frame:<%>
              frame:searchable-text<%>
              frame:delegate<%>)
    get-insert-menu
    get-special-menu
    get-interactions-text
    get-definitions-text
    get-interactions-canvas
    get-definitions-canvas
    get-button-panel
    execute-callback
    get-current-tab
    open-in-new-tab
    create-new-tab
    close-current-tab
    on-tab-change
    enable-evaluation
    disable-evaluation
    get-definitions/interactions-panel-parent
    register-capability-menu-item
    
    ensure-rep-shown
    ensure-rep-hidden
    ensure-defs-shown
    
    
    get-language-menu
    register-toolbar-button
    register-toolbar-buttons
    unregister-toolbar-button
    get-tabs))

(define unit:definitions-text<%> 
  (interface ()
    begin-metadata-changes
    end-metadata-changes
    get-tab
    get-next-settings
    after-set-next-settings
    set-needs-execution-message))

(define rep:context<%>
  (interface ()
    ensure-rep-shown   ;; (interactions-text -> void)
    ;; make the rep visible in the frame
    
    repl-submit-happened ;; (-> boolean)
    ;; notify the context that an evaluation is about to
    ;; happen in the REPL (so it can show a warning about
    ;; the language/etc is out of sync if neccessary).
    
    enable-evaluation  ;; (-> void)
    ;; make the context enable all methods of evaluation
    ;; (disable buttons, menus, etc)
    
    disable-evaluation ;; (-> void)
    ;; make the context disable all methods of evaluation
    ;; (disable buttons, menus, etc)
    
    set-breakables ;; (union thread #f) (union custodian #f) -> void
    ;; the context might initiate breaks or kills to
    ;; the thread passed to this function
    
    get-breakables ;; -> (values (union thread #f) (union custodian #f))
    ;; returns the last values passed to set-breakables.
    
    reset-offer-kill ;; (-> void)
    ;; the next time the break button is pushed, it will only
    ;; break. (if the break button is clicked twice without
    ;; this method being called in between, it will offer to
    ;; kill the user's program)
    
    update-running        ;; (boolean -> void)
    ;; a callback to indicate that the repl may have changed its running state
    ;; use the repls' get-in-evaluation? method to find out what the current state is.
    
    clear-annotations  ;; (-> void)
    ;; clear any error highlighting context
    
    get-directory      ;; (-> (union #f string[existing directory]))
    ;; returns the directory that should be the default for
    ;; the `current-directory' and `current-load-relative-directory'
    ;; parameters in the repl.
    ))

(define unit:tab<%>
  (interface (rep:context<%>)
    get-frame
    get-defs
    get-ints
    get-visible-defs
    set-visible-defs
    set-visible-ints
    set-focus-d/i
    get-i
    set-i
    break-callback
    is-current-tab?
    get-enabled
    on-close
    can-close?
    toggle-log))

(define module-language-tools:definitions-text<%> (interface () move-to-new-language))
(define module-language-tools:tab<%> (interface ()))
(define module-language-tools:frame<%> (interface ()))

