Index: main/numberbox-test.lisp
===================================================================
--- main/numberbox-test.lisp	(revision main,38)
+++ main/numberbox-test.lisp	(revision main,38)
@@ -0,0 +1,36 @@
+(defpackage #:numberbox-test
+  (:use #:cl #:numberbox #:tui-window)
+  (:export #:test))
+
+(in-package #:numberbox-test)
+
+
+
+(defclass data ()
+  ((text :initform "5000.00" :accessor text)))
+
+
+
+(defun test ()
+  (with-screen (s)
+    (let* ((data1 (make-instance 'data))
+           (data2 (make-instance 'data))
+           (data3 (make-instance 'data))
+           (nbs (list (create-numberbox data1 10 s 10 10)
+                      (create-numberbox data2 10 s 11 10)
+                      (create-numberbox data3 10 s 12 10))))
+      (setf (cdddr nbs) nbs)
+      (refresh s)
+      (unwind-protect
+           (flet ((cb (key)
+                    (when (member key '(:key-f12 #\Tab))
+                      key)))
+             (loop
+                (refresh s)
+                (let ((key (activate-numberbox (first nbs) #'cb)))
+                  (ecase key
+                    (:key-f12 (return))
+                    (#\Tab (setf nbs (cdr nbs)))))))
+        (destroy-numberbox (first nbs))
+        (destroy-numberbox (second nbs))
+        (destroy-numberbox (third nbs))))))
Index: main/numberbox.lisp
===================================================================
--- main/numberbox.lisp	(revision main,38)
+++ main/numberbox.lisp	(revision main,38)
@@ -0,0 +1,56 @@
+(defpackage #:numberbox
+  (:use #:cl #:textbox)
+  (:import-from #:textbox #:data)
+  (:export #:text #:numberbox #:insertion-point #:scroll #:create-numberbox
+           #:destroy-numberbox #:activate-numberbox))
+
+(in-package #:numberbox)
+
+
+
+(defclass numberbox-data ()
+  ((data :initarg :data)
+   (width :type (integer 1) :initarg :width)
+   (edit :type boolean :initform nil)))
+
+(defclass numberbox (textbox)
+  ())
+
+
+
+(defun pad (str len)
+  (format nil (format nil "~~~A@A" len) str))
+
+(defmethod text ((nbd numberbox-data))
+  (with-slots (data width edit) nbd
+    (let ((text (text data)))
+      (if edit
+          text
+          (pad text width)))))
+
+(defmethod (setf text) (s (ndb numberbox-data))
+  (with-slots (data) ndb
+    (setf (text data) s)))
+
+(defun create-numberbox (data width parent-window y x)
+  (let* ((data-wrapper (make-instance 'numberbox-data :data data :width width))
+         (textbox (create-textbox data-wrapper width parent-window y x)))
+    (change-class textbox 'numberbox)))
+
+(defun destroy-numberbox (numberbox)
+  (destroy-textbox numberbox))
+
+
+
+(defun nothing (&rest args)
+  (declare (ignore args)))
+
+(defun activate-numberbox (numberbox &optional (callback 'nothing))
+  (with-slots (data) numberbox
+    (with-slots (edit) data
+      (setf edit t)
+      (setf (insertion-point numberbox) :end)
+      (let ((r (activate-textbox numberbox callback)))
+        (setf edit nil)
+        (setf (insertion-point numberbox) 0)
+        r))))
