#lang racket/gui (require racket/class framework racket/unit racket/path drracket/tool) (preferences:set-default 'ProjectManager:tabs "/Users/spdegabrielle/tabs.sp" ; (path->string (build-path (find-system-path 'home-dir) "tabs.sp")) string?) (provide tool@) (define tool@ (unit (import drracket:tool^) (export drracket:tool-exports^) (define (phase1) (void)) (define (phase2) (void)) ; ; (define tab-mixin ; (mixin ()() ; (super-new) ; )) (define (save/load-tabs-mixin super%) (class super% (inherit open-in-new-tab get-tabs) ; ;; 'ProjectManager:tabs ; path to tabs file (field (saved-tabs-file (string->path "/Users/spdegabrielle/tabs.sp"))) ;(preferences:get 'ProjectManager:tabs)))) ; ;; save-tabs : out-file tabs -> void (define/private (save-tabs-file out-file tabs) (call-with-output-file out-file; saved-tabs-file-path (lambda (i) (write tabs i)) #:exists 'replace)) ; ;; each-tab -> list of files ;; return the paths for all tabs that have one (define/private (get-tab-files) (map path->string (filter (lambda (filename) filename) (map (λ (t) (send (send t get-defs) get-filename)) (get-tabs))))) ; (define (save-tabs-to-file-on-exit-callback) (save-tabs-file saved-tabs-file (get-tab-files))) ; (super-new) ; ;; reload-tab-from-file : in-file -> void (define/private (reload-my-tabs-from-file tabs-file) (let ((list-of-files (call-with-input-file tabs-file read))) (for-each (λ (f) (open-in-new-tab f)) list-of-files))) ;; get-tab-filename a-drscheme:unit:tab? -> (or/c path-string? false/c) ;; return #f if tab has no filename (define (get-tab-filename tab) (send (send tab get-defs) get-filename)) (reload-my-tabs-from-file saved-tabs-file) (exit:insert-on-callback save-tabs-to-file-on-exit-callback) )) ; (drracket:get/extend:extend-tab tab-mixin) (drracket:get/extend:extend-unit-frame save/load-tabs-mixin) ))