diff --git a/LEARN.md b/LEARN.md
index 1ade438..51b8b88 100644
--- a/LEARN.md
+++ b/LEARN.md
@@ -76,7 +76,7 @@ CLOG "The Framework" (Code Tutorials)
- [04-tutorial.lisp](tutorial/04-tutorial.lisp) - The event target, reusing event handlers
- [05-tutorial.lisp](tutorial/05-tutorial.lisp) - Using connection-data-item
- [06-tutorial.lisp](tutorial/06-tutorial.lisp) - Tasking and events
-- [07-tutorial.lisp](tutorial/07-tutorial.lisp) - My first CLOG video game (and handling disconnects)
+- [07-tutorial.lisp](tutorial/07-tutorial.lisp) - My first CLOG video game
- [08-tutorial.lisp](tutorial/08-tutorial.lisp) - Mice Love Containers
- [09-tutorial.lisp](tutorial/09-tutorial.lisp) - Tabs, panels, and forms
- [10-tutorial.lisp](tutorial/10-tutorial.lisp) - Canvas
diff --git a/tutorial/09-tutorial.lisp b/tutorial/09-tutorial.lisp
index 3f4d1f6..619d885 100644
--- a/tutorial/09-tutorial.lisp
+++ b/tutorial/09-tutorial.lisp
@@ -4,162 +4,172 @@
(in-package :clog-tut-9)
+;; In this tutorial we demonstrate using forms and form controls
+;; this is not traditonal HTML use, as we never leave the original
+;; page. It is an interactive live application.
+
(defun on-new-window (body)
(setf (title (html-document body)) "Tutorial 09")
- ;; When doing extensive setup of a page using connection cache
- ;; reduces rountrip traffic and speeds setup.
- (with-connection-cache (body)
- (let* (last-tab
- ;; Note: Since the there is no need to use the tmp objects
- ;; we reuse the same symbol name (tmp) even though the
- ;; compiler can mark those for garbage collection early
- ;; this not an issue as the element is created already
- ;; in the browser window.
- ;;
- ;; See tutorial 33 for a far more elegant approach
- ;; that uses with-clog-create for this type of code
- ;; based layout.
- ;;
- ;; Create tabs and panels
- (t1 (create-button body :content "Tab1"))
- (t2 (create-button body :content "Tab2"))
- (t3 (create-button body :content "Tab3"))
- (tmp (create-br body))
- (p1 (create-div body))
- (p2 (create-div body))
- (p3 (create-div body :content "Panel3 - Type here"))
- ;; Create form for panel 1
- (f1 (create-form p1))
- (fe1 (create-form-element f1 :text
- :label (create-label f1 :content "Fill in blank:")))
- (tmp (create-br f1))
- (fe2 (create-form-element f1 :color :value "#ffffff"
- :label (create-label f1 :content "Pick a color:")))
- (tmp (create-br f1))
- (tmp (create-form-element f1 :submit :value "OK"))
- (tmp (create-form-element f1 :reset :value "Start Again"))
- ;; Create for for panel 2
- (f2 (create-form p2))
- (fs2 (create-fieldset f2 :legend "Stuff"))
- (tmp (create-label fs2 :content "Please type here:"))
- (ta1 (create-text-area fs2 :columns 60 :rows 8 :label tmp))
- (tmp (create-br fs2))
- (rd1 (create-form-element fs2 :radio :name "rd"))
- (tmp (create-label fs2 :content "To Be" :label-for rd1))
- (rd2 (create-form-element fs2 :radio :name "rd"))
- (tmp (create-label fs2 :content "No to Be" :label-for rd2))
- (tmp (create-br fs2))
- (ck1 (create-form-element fs2 :checkbox :name "ck"))
- (tmp (create-label fs2 :content "Here" :label-for ck1))
- (ck2 (create-form-element fs2 :checkbox :name "ck"))
- (tmp (create-label fs2 :content "There" :label-for ck2))
- (tmp (create-br fs2))
- (sl1 (create-select fs2 :label (create-label fs2 :content "Pick one:")))
- (sl2 (create-select fs2 :label (create-label fs2 :content "Pick one:")))
- (sl3 (create-select fs2 :multiple t
- :label (create-label fs2 :content "Pick some:")))
- (o1 (create-option sl3 :content "one"))
- (o2 (create-option sl3 :content "two"))
- (o3 (create-option sl3 :content "three"))
- (og1 (create-optgroup sl3 :content "These are a group"))
- (o4 (create-option og1 :content "four"))
- (o5 (create-option og1 :content "five"))
- (tmp (create-form-element f2 :submit :value "OK"))
- (tmp (create-form-element f2 :reset :value "Start Again")))
- (declare (ignore tmp))
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ ;; Create tabs and panels - a simple file card interface
+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+ (let* ((tab1 (create-button body :content "Tab1"))
+ (tab2 (create-button body :content "Tab2"))
+ (tab3 (create-button body :content "Tab3"))
+ (tmp (create-br body))
+ (panel1 (create-div body))
+ (panel2 (create-div body))
+ ; styling can be done here also
+ (panel3 (create-div body :content "Panel3 - Type here"
+ :style "width:100%;height:400px;border:thin solid black"))
+ (tab-to-panel (list
+ (list tab1 panel1)
+ (list tab2 panel2)
+ (list tab3 panel3)))) ; an a-list of tabs to panels
+ (declare (ignore tmp)) ; ignore warnings tmp never used
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Panel 1 contents
+ ;; Style the panels - you can program your styles
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (setf (place-holder fe1) "type here..")
- (setf (requiredp fe1) t)
- (setf (size fe1) 60)
- (make-data-list fe1 '("Cool Title"
- "Not So Cool Title"
- "Why Not, Another Title"))
- (make-data-list fe2 '("#ffffff"
- "#ff0000"
- "#00ff00"
- "#0000ff"
- "#ff00ff"))
- (set-on-submit f1
- (lambda (obj)
- (declare (ignore obj))
- (setf (title (html-document body)) (value fe1))
- (setf (background-color p1) (value fe2))
- (setf (hiddenp f1) t)
- (create-span p1 :content
- "
Your form has been submitted")))
- (setf (width p1) "100%")
- (setf (width p2) "100%")
- (setf (width p3) "100%")
- (setf (height p1) 400)
- (setf (height p2) 400)
- (setf (height p3) 400)
- (set-border p1 :thin :solid :black)
- (set-border p2 :thin :solid :black)
- (set-border p3 :thin :solid :black)
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;; Panel 2 contents
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- (setf (vertical-align ta1) :top)
- (disable-resize ta1)
- (setf (vertical-align sl1) :top)
- (setf (vertical-align sl2) :top)
- (setf (vertical-align sl3) :top)
- (setf (size sl1) 3)
- (add-select-options sl1 '("one"
- "two"
- "three"
- "four"
- "five"))
- (add-select-options sl2 '("one"
- "two"
- "three"
- "four"
- "five"))
- (set-on-change sl3 (lambda (obj)
- (declare (ignore obj))
- (when (selectedp o5)
- (alert (window body) "Selected 5"))))
- (set-on-submit f2
- (lambda (obj)
- (declare (ignore obj))
- (setf (hiddenp f2) t)
- (create-span p2 :content
- (format nil "
Your form has been submitted:
-
~A