Revision: 6131
Author: iratqq
Date: Thu Dec 31 15:51:15 2009
Log: * scm/uim-pref-http.scm:
- New file.
- This module has not work yet (get only).
http://code.google.com/p/uim/source/detail?r=6131
Added:
/trunk/scm/uim-pref-http.scm
=======================================
--- /dev/null
+++ /trunk/scm/uim-pref-http.scm Thu Dec 31 15:51:15 2009
@@ -0,0 +1,238 @@
+;;;
+;;; Copyright (c) 2010 uim Project http://code.google.com/p/uim/
+;;;
+;;; All rights reserved.
+;;;
+;;; Redistribution and use in source and binary forms, with or without
+;;; modification, are permitted provided that the following conditions
+;;; are met:
+;;; 1. Redistributions of source code must retain the above copyright
+;;; notice, this list of conditions and the following disclaimer.
+;;; 2. Redistributions in binary form must reproduce the above copyright
+;;; notice, this list of conditions and the following disclaimer in the
+;;; documentation and/or other materials provided with the distribution.
+;;; 3. Neither the name of authors nor the names of its contributors
+;;; may be used to endorse or promote products derived from this
software
+;;; without specific prior written permission.
+;;;
+;;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND
+;;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+;;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE
+;;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
CONTRIBUTORS BE LIABLE
+;;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL
+;;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+;;; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+;;; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT
+;;; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
WAY
+;;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+;;; SUCH DAMAGE.
+;;;;
+
+(module-load "custom-enabler")
+
+(define (write-tree tree out)
+ (let loop ((tree tree))
+ (cond ((null? tree))
+ ((pair? tree) (write-tree (car tree) out) (loop (cdr tree)))
+ (else (display tree out)))))
+
+(define (tree->string tree)
+ (call-with-output-string
+ (lambda (port)
+ (write-tree tree port))))
+
+(define (uim-pref-http:make-primary-group-sxml)
+ `(div (% (id "menu"))
+ (ul
+ ,@(map (lambda (g)
+ `(li
+ (a (% (href ,(format "/~a" (symbol->string g))))
+ ,(ugettext (custom-group-label g)))))
+ (custom-list-primary-groups)))))
+
+
+(define uim-pref-http:menu
+ (uim-pref-http:make-primary-group-sxml))
+
+(define (uim-pref-http:top-page resource req-header req-body)
+ (tree->string
+ (sxml:sxml->xml
+ `(html
+ (title "uim setup")
+ (body
+ (h1 "uim setup")
+ ,uim-pref-http:menu)))))
+
+(define (uim-pref-http:make-item-boolean group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "checkbox")
+ (name ,(symbol->string csym))
+ (value ,(symbol->string csym))
+ ,(if (custom-value csym)
+ '(checked "checked")
+ '(id "nochecked")))))
+ `(input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))
+ ,(ugettext (custom-rec-label rec)))))
+
+(define (uim-pref-http:integer-length num)
+ (+ (string-length (number->string num)) 1))
+(define (uim-pref-http:make-item-integer group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "text")
+ (name ,(symbol->string csym))
+ (value ,(number->string (custom-value csym)))
+ (size ,(number->string
+ (uim-pref-http:integer-length
(list-ref types 2)))))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))))))
+
+(define (uim-pref-http:make-item-string group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "text")
+ (name ,(symbol->string csym))
+ (value ,(custom-value csym)))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))))))
+
+(define (uim-pref-http:make-item-pathname group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "text")
+ (name ,(symbol->string csym))
+ (value ,(custom-value csym)))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))))))
+
+(define (uim-pref-http:make-item-choice group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (choiced (custom-value csym))
+ (active? (custom-active? csym))
+ (select-attribute `(% (name ,(symbol->string csym)))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (select ,(if active?
+ select-attribute
+ (append select-attribute '((disabled "disabled"))))
+ ,(map (lambda (opt)
+ `(option ,(if (eq? choiced (list-ref opt 0))
+ '(% (selected "selected"))
+ "")
+ ,(ugettext (list-ref opt 1))))
+ (cdr types))))))
+
+(define (uim-pref-http:make-item-ordered-list group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (text (apply string-append
+ (map (lambda (x)
+ (string-append (write-to-string
(symbol->string x)) " "))
+ (custom-value csym))))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "text")
+ (name ,(symbol->string csym))
+ (value ,text))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))))))
+
+(define (uim-pref-http:make-item-key group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types))
+ (text (apply string-append
+ (map (lambda (x)
+ (string-append (write-to-string x) " "))
+ (custom-value csym))))
+ (active? (custom-active? csym))
+ (input-attribute `(% (type "text")
+ (name ,(symbol->string csym))
+ (value ,text))))
+ `(,(ugettext (custom-rec-label rec)) ": "
+ (input ,(if active?
+ input-attribute
+ (append input-attribute '((disabled "disabled"))))))))
+
+(define (uim-pref-http:make-item group sub csym)
+ (let* ((rec (custom-rec csym))
+ (types (custom-rec-type rec))
+ (type (car types)))
+ `(li
+ ,(cond ((eq? type 'boolean)
+ (uim-pref-http:make-item-boolean group sub csym))
+ ((eq? type 'integer)
+ (uim-pref-http:make-item-integer group sub csym))
+ ((eq? type 'string)
+ (uim-pref-http:make-item-string group sub csym))
+ ((eq? type 'pathname)
+ (uim-pref-http:make-item-pathname group sub csym))
+ ((eq? type 'choice)
+ (uim-pref-http:make-item-choice group sub csym))
+ ((eq? type 'ordered-list)
+ (uim-pref-http:make-item-ordered-list group sub csym))
+ ((eq? type 'key)
+ (uim-pref-http:make-item-key group sub csym))
+ (else
+ (format "~a: not supported widget"
+ (ugettext (custom-rec-label rec))))))))
+
+
+(define (uim-pref-http:make-contents-page group sub)
+ `(div (% (id "entry"))
+ (h2 ,(ugettext (custom-group-label sub)))
+ (form (% (method "post") (action ,(symbol->string group)))
+ (ul
+ ,(map (lambda (csym)
+ (uim-pref-http:make-item group sub csym))
+ (custom-collect-by-group group sub)))
+ (input (% (type "submit") (value "set"))))))
+
+(define (uim-pref-http:regist-pages server)
+ (for-each (lambda (group)
+ (http-server-regist-resource!
+ server
+ (format "/~a" (symbol->string group))
+ (lambda (resource req-header req-body)
+ ;; (print (format "resource:~a header:~a body:~a"
resource req-header req-body))
+ (tree->string
+ (sxml:sxml->xml
+ `(html
+ (title ,(format "uim setup: ~a" (ugettext
(custom-group-label group))))
+ (body
+ (h1 (format "uim setup: " ,(ugettext
(custom-group-label group))))
+ ,uim-pref-http:menu
+ (div (% (id "contents"))
+ ,(map (lambda (sub)
+ (uim-pref-http:make-contents-page group
sub))
+ (custom-group-subgroups group))))))))))
+ (custom-list-primary-groups)))
+
+
+(define (uim-http-server:start args)
+ (let ((server (make-http-server)))
+ (http-server-regist-resource! server "/" uim-pref-http:top-page)
+ (uim-pref-http:regist-pages server)
+ (http-server-resource server)
+ (http-server-start server "localhost" 8569)
+ 1))