Index: main/simple-table.lisp
===================================================================
--- main/simple-table.lisp	(revision main,70)
+++ main/simple-table.lisp	(revision main,70)
@@ -0,0 +1,119 @@
+(defpackage #:tui-simple-table
+  (:use #:cl #:dso-util #:grid #:tui-input #:tui-widget #:tui-window))
+
+(in-package #:tui-simple-table)
+
+
+
+(defclass model
+    (nice-header
+     row-selectable
+     column-padding
+     column-formats
+     data-wrapper)
+  ())
+
+(defclass simple-table ()
+  ((window :initarg :window :reader window)
+   (keys :type sequence :initarg :keys :reader keys)
+   (data :type sequence :accessor data)
+   (model :type model :initarg :model :reader model)
+   (grid :initarg :grid :reader grid)))
+
+(defmethod (setf data) :after (d (tbl simple-table))
+  (let ((wrapper (make-instance 'hash-per-row-grid-data
+                                :row-tables d :keys (keys tbl))))
+    (setf (wrapped-data (model tbl)) wrapper)))
+
+(defmethod selected-row ((tbl simple-table))
+  (elt (data tbl) (selected-row (model tbl))))
+
+(defmethod scroll-percent ((tbl simple-table))
+  (row-scroll-percent (grid tbl)))
+
+
+
+(defun make-simple-table (window keys formats heads)
+  (let* ((formats (coerce (apply 'parse-format-specs formats) 'vector))
+         (heads (map 'vector (lambda (s)
+                               (concatenate 'string " " s))
+                     heads))
+         (model (make-instance 'model :format-specs formats
+                                      :column-heads heads))
+         (grid (make-grid window model)))
+    (make-instance 'simple-table
+                   :window window :keys keys :model model :grid grid)))
+
+(defun page-size (tbl)
+  (max 1 (- (size (window tbl)) 2)))
+
+(defmethod activate ((tbl simple-table) &key (key-callback 'nothing)
+                     (select-callback 'nothing) (scroll-callback 'nothing))
+  (with-slots (window data model grid) tbl
+    (flet ((notify ()
+             (funcall select-callback)
+             (when (ensure-row-visible grid (1+ (selected-row model)))
+               (funcall scroll-callback))))
+      (notify)
+      (loop
+         (draw grid)
+         (let ((key (read-key window)))
+           (case key
+             (:key-down
+              (incf (selected-row model))
+              (notify))
+             (:key-up
+              (decf (selected-row model))
+              (notify))
+             (:key-npage
+              (incf (selected-row model) (page-size tbl))
+              (notify))
+             (:key-ppage
+              (decf (selected-row model) (page-size tbl))
+              (notify))
+             (:key-end
+              (setf (selected-row model) (1- (length data)))
+              (notify))
+             (:key-home
+              (setf (selected-row model) 0)
+              (notify))
+             (t
+              (let ((r (funcall key-callback key)))
+                (when r
+                  (return-from activate r))))))))))
+
+
+#|
+(defun put-pair (table key value)
+  (setf (gethash key table) value))
+
+(defun table (pairs)
+  (let ((table (make-hash-table)))
+    (dolist (p pairs table)
+      (destructuring-bind (key value) p
+        (put-pair table key value)))))
+
+(defun make-data (n)
+  (let ((data (make-hash-table)))
+    (flet ((put (key value)
+             (put-pair data key value)))
+      (put :a n)
+      (put :b (format nil "~@R" n))
+      (put :c (random 1000)))
+    data))
+
+(defun test ()
+  (with-screen (screen)
+    (cdk::c-cbreak)
+    (cdk::c-noecho)
+    (with-subwindow (w screen 8 20 4 4)
+      (cdk::c-keypad (window-pointer w) t)
+      (let ((tbl (make-simple-table w '(:a :b :c) '((:number 2) (:string 7) (:number 6 2)) '("A" "B" "C")))
+            data)
+        (dotimes (i 100)
+          (push (make-data (1+ i)) data))
+        (setf data (nreverse data))
+        (setf (data tbl) data)
+        (activate tbl :key-callback (lambda (key)
+                                      (eq key :key-f12)))))))
+|#
