;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:ZL -*- (defvar *box-window-list* nil "List of created box networks.") (defconst *box-mode-item-alist* :unbound) (defconst *box-frame-configuration-alist* '((box-test-window (tblack control-panes mblack display-panes) ((tblack :blank :black 0.02)) ((control-panes :horizontal (0.08s0) (hblack1 box-banner hblack2 box-commands hblack3) ((hblack1 :blank :black 0.05s0)) ((box-banner 0.1s0)) ((hblack2 :blank :black 0.05)) ((box-commands 0.8s0)) ((hblack3 :blank :black :even))) ) ((mblack :blank :black 0.02s0)) ((display-panes :horizontal (:even) (aux-displays box-network-display) ((aux-displays :vertical (:even) (box-text-area box-scroll-area) ((box-text-area 0.5s0)) ((box-scroll-area :even))) (box-network-display :even))) )))) (defconstant *box-default-mode* :main) ;;; Main window definition ;;; ;;; (defflavor box-network-frame (commands banner text-area) (tv:process-mixin tv:alias-for-inferiors-mixin tv:inferiors-not-in-select-menu-mixin tv:bordered-constraint-frame-with-shared-io-buffer tv:top-box-label-mixin) (:default-init-plist :process '(box-start) :borders 1 :label '(:string "Setting up Box Network..." :font fonts:metsi :centered) :panes '( ;;; Main command menu (box-commands simple-menu-pane :label (:string "Box Commands" :font fonts:hl12i :centered :top) :save-bits t :mode-item :main) ;;; Program Banner (box-banner simple-banner-pane :label (:string "Box Mode" :centered)) ;;; Box drawing area (box-network-display simple-text-area :label "Box Network Display") ;;; Box global view (box-scroll-area simple-scroll-area :label (:string "Box Items")) ;;; Accompanying text (box-text-area simple-text-area :label (:string "Messages and Queries"))) :constraints *box-frame-configuration-alist*) :gettable-instance-variables :settable-instance-variables :inittable-instance-variables) (defmethod (box-network-frame :after :init) (&rest ignore) (send self :set-selection-substitute (send self :get-pane 'box-text-area)) (send self :set-label '(:string "Experimental Box Network" :font fonts:metsi :centered)) (setq commands (send self :get-pane 'box-commands)) (setq banner (send self :get-pane 'box-banner)) (send banner :draw-banner (send commands :mode-item)) (setq text-area (send self :get-pane 'box-text-area)) (push self *box-window-list*)) (defmethod (box-network-frame :before :expose) (&rest ignore) (send commands :update-mode-item-alist *box-mode-item-alist*) (send commands :update-item-list)) ;(defmethod (box-network-frame :after :expose) (&rest ignore) ; (let((banner (send self :get-pane 'box-banner)) ; (comms (send self :get-pane 'box-commands))) ; (send banner :string-out-centered-explicit (send comms :mode-item)))) (defmethod (box-network-frame :after :kill) (&rest ignore) (setq *box-window-list* (loop for wind in *box-window-list* when (not (equal wind self)) collect wind))) (defmethod (box-network-frame :set-mode) (&optional new-mode) (setq new-mode (or new-mode *box-default-mode*)) (send commands :set-mode new-mode) (send banner :draw-banner new-mode)) (defmethod (box-network-frame :big-message) (message) (let*((fontmap (send text-area :font-map))) (send text-area :set-font-map '(medfnb)) (format text-area "~&~a~2&" message) (send text-area :set-font-map fontmap))) (compile-flavor-methods box-network-frame) ;;; (defmacro with-network-panes(box-window &body body) `(let*((window ,box-window) (banner (send window :get-pane 'box-banner)) (commands (send window :get-pane 'box-commands)) (text-area (send window :get-pane 'box-text-area))) (declare(special window banner commands text-area)) (list window banner commands text-area) . ,body))