;;; -*- Mode:LISP; Package:USER; Readtable:ZL; Base:10 -*-

(defvar *basic-box-flavor* 'box-network-frame)

;Alist of menu item alists; CAR of each alist element is a mode

(setq *box-mode-item-alist*
	'((:main ("Add" :eval (box-add))
		 ("Delete" :eval (box-delete))
		 ("Display" :eval (box-display))
		 ("Modify" :eval (box-modify))
		 ("Quit" :eval (box-quit))
		 ("Redraw" :eval (box-redraw)))
	  (:add ("Copy" :eval (box-add :copy))
		("New" :eval (box-add :new))
		("Return" :eval (box-return))
		("Redraw" :eval (box-redraw)))
	  (:delete ("Select" :eval (box-delete :select))
		   ("Return" :eval (box-return))
		   ("Redraw" :eval (box-redraw)))
	  (:display ("Select" :eval (box-display :select))
		   ("Return" :eval (box-return))
		   ("Redraw" :eval (box-redraw)))
	  (:modify ("Select" :eval (box-modify :select))
		   ("Return" :eval (box-return))
		   ("Redraw" :eval (box-redraw)))
	  ))

(defvar d-window)
(defvar d-comms)
(defvar d-io)
(defvar d-banner)
(defvar box-debug t)

(defun box-top()
  (box-start (make-instance *basic-box-flavor*)))

(defun box-start (window)
  (declare(special window))
  (send window :activate)
  (let* ((comms (send window :get-pane 'box-commands))
	 (query-io (send window :get-pane 'box-text-area))
	 (standard-output query-io)
	 (error-output query-io)
	 (banner (send window :get-pane 'box-banner)))
    (declare(special query-io standard-output error-output))
    (when box-debug
      (setq d-window window)
      (setq d-comms comms)
      (setq d-io query-io)
      (setq d-banner banner))
    (send window :select)
    (send window :expose)
    (send window :big-message "Initialized.")
;;; Listen to for input from the command menu.
    (loop for input = (send query-io ':any-tyi) do
	  (cond ((atom input) (print input))
		((listp input)
		 (selectq (car input)
		   (:menu (send (fourth input)  ':execute (second input)))
		   (t (beep))))
		(t (pprint input query-io)
		   (beep))))))

(defun box-add(&optional new-mode)
  (declare(special window))
  (with-network-panes window
    (print 'adding)
    (case new-mode
      (nil (send window :set-mode :add))
      (:copy (print 'copying))
      (:new (print 'new-one)))))

(defun box-delete(&optional new-mode)
  (declare(special window))
  (with-network-panes window
    (print 'deleting)
    (case new-mode
      (nil (send window :set-mode :delete))
      (:select (print 'selecting)))))

(defun box-display(&optional new-mode)
  (declare(special window))
  (with-network-panes window
    (print 'displaying)
    (case new-mode
      (nil (send window :set-mode :display))
      (:select (print 'selecting)))))

(defun box-modify(&optional new-mode)
  (declare(special window))
  (with-network-panes window
    (print 'modifying)
    (case new-mode
      (nil (send window :set-mode :modify))
      (:select (print 'selecting)))))

(defun box-quit()
  (declare(special window))
  (print 'quit query-io)
  (send window :kill))

(defun box-return()
  (declare(special window))
  (send window :set-mode :main))

(defun box-redraw()
  (declare(special window))
  (dolist (pane (send window :inferiors))
    (send pane :redraw)))

(tv:add-system-key #\N *basic-box-flavor* "Find//Make a Box Network")

(setq *box-window-list* nil)
