annotate lisp/w3/w3-forms.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children ac2d302a0011
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 ;;; w3-forms.el,v --- Emacs-w3 forms parsing code for new display engine
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 ;; Author: wmperry
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 ;; Created: 1996/06/06 14:14:34
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4 ;; Version: 1.51
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 ;; Keywords: faces, help, comm, data, languages
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 ;;; Copyright (c) 1993, 1994, 1995 by William M. Perry (wmperry@spry.com)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 ;;; This file is not part of GNU Emacs, but the same permissions apply.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 ;;; GNU Emacs is free software; you can redistribute it and/or modify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ;;; it under the terms of the GNU General Public License as published by
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 ;;; the Free Software Foundation; either version 2, or (at your option)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 ;;; any later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 ;;; GNU Emacs is distributed in the hope that it will be useful,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 ;;; GNU General Public License for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21 ;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 ;;; You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23 ;;; along with GNU Emacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
24 ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
25 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28 ;;; FORMS processing for html 2.0/3.0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
29 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
30 (eval-and-compile
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
31 (require 'w3-draw))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33 (require 'widget)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 (if (featurep 'mule) (fset 'string-width 'length))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37 ;; These are things in later versions of the widget package that I don't
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 ;; have yet.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 (defun widget-at (pt)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 (or (get-text-property pt 'button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 (get-text-property pt 'field)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 ;; A form entry area is a vector
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 ;; [ type name default-value value maxlength options widget]
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 ;; Where:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46 ;; type = symbol defining what type of form entry area it is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 ;; (ie: file, radio)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 ;; name = the name of the form element
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49 ;; default-value = the value this started out with
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 (defsubst w3-form-element-type (obj) (aref obj 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 (defsubst w3-form-element-name (obj) (aref obj 1))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 (defsubst w3-form-element-default-value (obj) (aref obj 2))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 (defsubst w3-form-element-value (obj) (aref obj 3))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 (defsubst w3-form-element-size (obj) (aref obj 4))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56 (defsubst w3-form-element-maxlength (obj) (aref obj 5))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 (defsubst w3-form-element-options (obj) (aref obj 6))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58 (defsubst w3-form-element-action (obj) (aref obj 7))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 (defsubst w3-form-element-widget (obj) (aref obj 8))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61 (defsubst w3-form-element-set-type (obj val) (aset obj 0 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 (defsubst w3-form-element-set-name (obj val) (aset obj 1 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63 (defsubst w3-form-element-set-default-value (obj val) (aset obj 2 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 (defsubst w3-form-element-set-value (obj val) (aset obj 3 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 (defsubst w3-form-element-set-size (obj val) (aset obj 4 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 (defsubst w3-form-element-set-maxlength (obj val) (aset obj 5 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 (defsubst w3-form-element-set-options (obj val) (aset obj 6 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 (defsubst w3-form-element-set-action (obj val) (aset obj 7 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69 (defsubst w3-form-element-set-widget (obj val) (aset obj 8 val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 ;; The main function - this adds a single widget to the form
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72 (defun w3-form-add-element (&rest args)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 (let* ((widget nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 (buffer-read-only nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 (inhibit-read-only t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 (widget-creation-function nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 (action (nth 6 args))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 (node (assoc action w3-form-elements))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 (name (or (nth 1 args)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 (if (memq (nth 0 args) '(submit reset))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 (symbol-name (nth 0 args)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 (val (vector (nth 0 args) ; type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 name ; name
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 (nth 5 args) ; default
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 (nth 2 args) ; value
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 (nth 3 args) ; size
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 (nth 4 args) ; maxlength
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 (nth 7 args) ; options
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90 action
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 nil)) ; widget
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 (setq widget-creation-function (or (get (car args)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 'w3-widget-creation-function)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 'w3-form-default-widget-creator)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 widget (funcall widget-creation-function val
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 (cdr (nth 10 args))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 (if node
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99 (setcdr node (cons val (cdr node)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 (setq w3-form-elements (cons (cons action (list val)) w3-form-elements)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 (if (not widget)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103 (w3-form-element-set-widget val widget)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 (widget-put widget 'w3-form-data val))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 ;; These properties tell the add-element function how to actually create
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 ;; each type of widget.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 (put 'checkbox 'w3-widget-creation-function 'w3-form-create-checkbox)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109 (put 'multiline 'w3-widget-creation-function 'w3-form-create-multiline)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 (put 'radio 'w3-widget-creation-function 'w3-form-create-radio-button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 (put 'reset 'w3-widget-creation-function 'w3-form-create-submit-button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 (put 'submit 'w3-widget-creation-function 'w3-form-create-submit-button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 (put 'hidden 'w3-widget-creation-function 'ignore)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114 (put 'file 'w3-widget-creation-function 'w3-form-create-file-browser)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 (put 'option 'w3-widget-creation-function 'w3-form-create-option-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116 (put 'keygen 'w3-widget-creation-function 'w3-form-create-keygen-list)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
117 (put 'button 'w3-widget-creation-function 'w3-form-create-button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 (put 'image 'w3-widget-creation-function 'w3-form-create-image)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 (defun w3-form-create-checkbox (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 (widget-create 'checkbox :value-face face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 (and (w3-form-element-default-value el) t)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 (defun w3-form-create-radio-button (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 (let* ((name (w3-form-element-name el))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126 (formobj (cdr (assoc name w3-form-radio-elements)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 (widget nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
128 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 (if formobj
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 (progn
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 (setq widget (w3-form-element-widget formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 (widget-radio-add-item widget (list 'item :format "%t" :tag ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 (setq widget (widget-create 'radio (list 'item :format "%t" :tag ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 w3-form-radio-elements (cons (cons name el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 w3-form-radio-elements))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137 widget)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 (defun w3-form-create-button (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 ;; This handles dealing with the bogus Netscape 'button' input type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 ;; that lots of places have been using to slap javascript shit onto
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142 (let ((val (w3-form-element-value el)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 (if (or (not val) (string= val ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 (setq val "Push Me"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 (widget-create 'push :notify 'ignore :button-face face val)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 (defun w3-form-create-image (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148 (let ((widget (widget-create 'push
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 :notify 'w3-form-submit/reset-callback
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 :value "Form-Image")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 widget))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 (defun w3-form-create-submit-button (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 (let ((val (w3-form-element-value el)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 (if (or (not val) (string= val ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156 (setq val (if (eq (w3-form-element-type el) 'submit)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 "Submit"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 "Reset")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 (widget-create 'push :notify 'w3-form-submit/reset-callback
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 :button-face face val)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162 (defun w3-form-create-file-browser (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 (widget-create 'file :value-face face :value (w3-form-element-value el)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166 (defvar w3-form-valid-key-sizes
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 '(
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 ("1024 (Premium)" . 1024)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169 ("896 (Regular)" . 896)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 ("768 (Unleaded)" . 768)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 ("512 (Low Grade)" . 512)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 ("508 (Woos)" . 508)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 ("256 (Test Grade)" . 256)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 "An assoc list of available key sizes and meaningful descriptions.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 (defun w3-form-create-keygen-list (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 (let ((tmp w3-form-valid-key-sizes)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 (longest 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 (options nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 (while tmp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 (if (> (length (caar tmp)) longest)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 (setq longest (length (caar tmp))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 (setq options (cons (list 'choice-item :tag (caar tmp)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185 :value (cdar tmp)) options)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 tmp (cdr tmp)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 (apply 'widget-create 'choice :value 1024
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 :tag "Key Length"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 :size (1+ longest)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 :value-face face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 options)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 (defun w3-form-create-option-list (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 (let ((widget (apply 'widget-create 'choice :value (w3-form-element-value el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 :tag "Choose"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 :size (w3-form-element-size el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 :value-face face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 (mapcar
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200 (lambda (x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 (list 'choice-item :format "%[%t%]"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 :tag (car x) :value (cdr x))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 (reverse (w3-form-element-options el))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204 (widget-value-set widget (cdr-safe (assoc (w3-form-element-value el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 (w3-form-element-options el))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 (goto-char (point-max))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 (skip-chars-backward "\r\n")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 (delete-region (point) (point-max))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 widget))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 ;(defun w3-form-create-multiline (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212 ; ;; FIX THIS! - need to padd out with newlines or something...
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 ; (widget-create 'field :value-face face (w3-form-element-value el)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 (defun w3-form-create-multiline (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 (widget-create 'push :notify 'w3-do-text-entry "Multiline text area"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
218 (defun w3-form-default-widget-creator (el face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 (widget-create 'link
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 :notify 'w3-form-default-button-callback
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 :size (w3-form-element-size el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 :tag (w3-truncate-string (w3-form-element-value el)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 (w3-form-element-size el) ?_)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224 :value-face face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
225 (w3-form-element-value el)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
226
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 (defun w3-form-default-button-callback (widget &rest ignore)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 (let* ((obj (widget-get widget 'w3-form-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
229 (typ (w3-form-element-type obj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 (def (widget-value widget))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231 (val nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 (case typ
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 (password
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 (setq val (funcall url-passwd-entry-func "Password: " def))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 (widget-put widget :tag (w3-truncate-string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 (make-string (length val) ?*)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 (w3-form-element-size obj) ?_)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 (otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 (setq val (read-string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 (concat (capitalize (symbol-name typ)) ": ") def))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 (widget-put widget :tag (w3-truncate-string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 val (w3-form-element-size obj) ?_))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
244 (widget-value-set widget val))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
245 (apply 'w3-form-possibly-submit widget ignore))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 (defun w3-truncate-string (str len &optional pad)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 "Truncate string STR so that string-width of STR is not greater than LEN.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 If width of the truncated string is less than LEN, and if a character PAD is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 defined, add padding end of it."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 (if (featurep 'mule)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 (let ((cl (string-to-char-list str)) (n 0) (sw 0))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 (if (<= (string-width str) len) str
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 (while (<= (setq sw (+ (char-width (nth n cl)) sw)) len)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 (setq n (1+ n)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256 (string-match (make-string n ?.) str)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
257 (setq str (substring str 0 (match-end 0))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
258 (if pad (concat str (make-string (- len (string-width str)) pad)) str))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
259 (concat (if (> (length str) len) (substring str 0 len) str)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
260 (if (or (null pad) (> (length str) len))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
261 ""
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
262 (make-string (- len (length str)) pad)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
263
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
264 (defun w3-form-possibly-submit (widget &rest ignore)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
265 (let* ((formobj (widget-get widget 'w3-form-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 (ident (w3-form-element-action formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 (widgets (w3-all-widgets ident))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 (text-fields 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 (text-p nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 ;; Gack. Netscape auto-submits forms of one text field
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 ;; here we go through the list of widgets in this form and
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 ;; determine which are not submit/reset/button inputs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 ;; If the # == 1, then submit the form.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 ;;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 (while widgets
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 (setq text-fields (+
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 text-fields
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 (case (w3-form-element-type (car widgets))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
280 ((submit reset image button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
281 0)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282 (text
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 (setq text-p t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 1)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285 (otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 widgets (cdr widgets)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288 (if (and (= text-fields 1) text-p)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 (w3-submit-form ident))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 (defun w3-form-submit/reset-callback (widget &rest ignore)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 (let* ((formobj (widget-get widget 'w3-form-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293 (w3-submit-button formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 (case (w3-form-element-type formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 (submit (w3-submit-form (w3-form-element-action formobj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 (reset (w3-revert-form (w3-form-element-action formobj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 (image (w3-submit-form (w3-form-element-action formobj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 (otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 (error
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 "Impossible widget type %s triggered w3-form-submit/reset-callback"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 (w3-form-element-type formobj))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 (defun w3-do-text-entry (widget &rest ignore)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 (let* ((data (list widget (current-buffer)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 (formobj (widget-get widget 'w3-form-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 (buff (get-buffer-create (format "Form Entry: %s"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 (w3-form-element-name formobj)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 (switch-to-buffer-other-window buff)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 (indented-text-mode)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 (erase-buffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 (if (w3-form-element-value formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 (insert (w3-form-element-value formobj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 (setq w3-current-last-buffer data)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 (message "Press C-c C-c when finished with text entry.")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 (local-set-key "\C-c\C-c" 'w3-finish-text-entry)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 (defun w3-finish-text-entry ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 (interactive)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 (if w3-current-last-buffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 (let* ((widget (nth 0 w3-current-last-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 (formobj (widget-get widget 'w3-form-data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 (buff (nth 1 w3-current-last-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 (valu (buffer-string))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324 (inhibit-read-only t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326 (local-set-key "\C-c\C-c" 'undefined)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 (kill-buffer (current-buffer))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 (condition-case ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 (delete-window)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330 (error nil))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 (if (not (and buff (bufferp buff) (buffer-name buff)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 (message "Could not find the form buffer for this text!")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333 (switch-to-buffer buff)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334 (w3-form-element-set-value formobj valu)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 (defsubst w3-all-widgets (actn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 ;; Return a list of data entry widgets in form number ACTN
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 (cdr-safe (assoc actn w3-form-elements)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 (defun w3-revert-form (actn)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342 (let* ((formobjs (w3-all-widgets actn))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 (inhibit-read-only t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 deft type widget formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 (while formobjs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 (setq formobj (car formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 widget (w3-form-element-widget formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 formobjs (cdr formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349 deft (w3-form-element-default-value formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 type (w3-form-element-type formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 (case type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 ((submit reset image) nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 (radio
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 ;; Ack - how!?
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 (checkbox
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 (if deft
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 (widget-value-set widget t)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 (widget-value-set widget nil)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 (file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 (widget-value-set widget deft))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 (otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 (widget-value-set widget deft)))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 (defun w3-form-encode-helper (formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 (let (
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 (submit-button-data w3-submit-button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 formobj result widget temp type)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 (while formobjs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 (setq formobj (car formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371 type (w3-form-element-type formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
372 widget (w3-form-element-widget formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
373 formobjs (cdr formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
374 temp (case type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
375 (reset nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
376 (image
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
377 (if (and (eq submit-button-data formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
378 (w3-form-element-name formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
379 (setq result (append
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
380 (list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
381 (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
382 (concat (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
383 ".x") "0")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
384 (cons
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
385 (concat (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
386 ".y") "0"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
387 result)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
388 nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
389 (submit
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
390 (if (and (eq submit-button-data formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
391 (w3-form-element-name formobj))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
392 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
393 (w3-form-element-value formobj))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
394 (radio
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
395 ;; this is probably broken
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
396 (let ((x (widget-radio-chosen widget)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
397 (if (or (not x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
398 (not (eq x (w3-form-element-widget formobj))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
399 nil
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
400 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
401 (w3-form-element-value formobj)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
402 (checkbox
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
403 (if (widget-value widget)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
404 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
405 (w3-form-element-value formobj))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
406 (file
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
407 (let ((dat nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
408 (fname (widget-value widget)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
409 (save-excursion
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
410 (set-buffer (get-buffer-create " *w3-temp*"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
411 (erase-buffer)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
412 (setq dat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
413 (condition-case ()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
414 (insert-file-contents-literally fname)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
415 (error (concat "Error accessing " fname))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
416 (cons (w3-form-element-name formobj) dat))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
417 (option
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
418 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
419 (widget-value widget)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
420 (keygen
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
421 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
422 (format "Should create a %d bit RSA key"
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
423 (widget-value widget))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
424 ((multiline hidden)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
425 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
426 (w3-form-element-value formobj)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
427 (otherwise
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
428 (cons (w3-form-element-name formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
429 (widget-value widget)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
430 (if temp
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
431 (setq result (cons temp result))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
432 result))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
433
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
434 (defun w3-form-encode-make-mime-part (id data separator)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
435 (concat separator "\nContent-id: " id
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
436 "\nContent-length: " (length data)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
437 "\n\n" data))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
438
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
439 (defun w3-form-encode-multipart/x-www-form-data (formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
440 ;; Create a multipart form submission.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
441 ;; Returns a cons of two strings. Car is the separator used.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
442 ;; cdr is the body of the MIME message."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
443 (let ((separator "---some-separator-for-www-form-data"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
444 (cons separator
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
445 (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
446 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
447 (lambda (formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
448 (w3-form-encode-make-mime-part (car formobj) (cdr formobj)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
449 separator)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
450 (w3-form-encode-helper formobjs)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
451 "\n"))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
452
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
453 (fset 'w3-form-encode-multipart/form-data
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
454 'w3-form-encode-multipart/x-www-form-data)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
455 (fset 'w3-form-encode- 'w3-form-encode-application/x-www-form-urlencoded)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
456
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
457 (defun w3-next-widget (pos)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
458 (let* ((next (cond ((get-text-property pos 'button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
459 (next-single-property-change pos 'button))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
460 ((get-text-property pos 'field)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
461 (next-single-property-change pos 'field))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
462 (t pos)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
463 (button (next-single-property-change next 'button))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
464 (field (next-single-property-change next 'field)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
465 (setq next
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
466 (cond
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
467 ((and button field) (min button field))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
468 (button button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
469 (field field)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
470 (t nil)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
471 (and next
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
472 (or (get-text-property next 'button)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
473 (get-text-property next 'field)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
474
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
475 (defun w3-form-encode (result &optional enctype)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
476 "Create a string suitably encoded for a URL request."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
477 (let ((func (intern (concat "w3-form-encode-" enctype))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
478 (if (fboundp func) (funcall func result))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
479
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
480 (defun w3-form-encode-text/plain (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
481 (let ((query ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
482 (setq query
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
483 (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
484 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
485 (lambda (widget)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
486 (let ((nam (car widget))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
487 (val (cdr widget)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
488 (if (string-match "\n" nam)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
489 (setq nam (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
490 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
491 (lambda (x)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
492 (if (= x ?\n) "," (char-to-string x))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
493 nam "")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
494 (concat nam " " val))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
495 (w3-form-encode-helper result) "\n"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
496 query))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
497
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
498 (defun w3-form-encode-application/x-gopher-query (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
499 (concat "\t" (nth 5 (car result))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
500
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
501 (defconst w3-xwfu-acceptable-chars
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
502 (list
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
503 ?a ?b ?c ?d ?e ?f ?g ?h ?i ?j ?k ?l ?m ?n ?o ?p ?q ?r ?s ?t ?u ?v ?w ?x ?y ?z
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
504 ?A ?B ?C ?D ?E ?F ?G ?H ?I ?J ?K ?L ?M ?N ?O ?P ?Q ?R ?S ?T ?U ?V ?W ?X ?Y ?Z
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
505 ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
506 ?_;; BOGUS! This is for #!%#@!ing netscape compatibility
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
507 )
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
508 "A list of characters that we do not have to escape in the media type
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
509 application/x-www/form-urlencoded")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
510
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
511 (defun w3-form-encode-xwfu (chunk)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
512 "Escape characters in a string for application/x-www-form-urlencoded.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
513 Blasphemous crap because someone didn't think %20 was good enough for encoding
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
514 spaces. Die Die Die."
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
515 (if (and (featurep 'mule) chunk)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
516 (setq chunk (code-convert-string
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
517 chunk *internal* url-mule-retrieval-coding-system)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
518 (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
519 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
520 (lambda (char)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
521 (cond
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
522 ((= char ? ) "+")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
523 ((memq char w3-xwfu-acceptable-chars) (char-to-string char))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
524 (t (format "%%%02x" char)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
525 chunk ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
526
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
527 (defun w3-form-encode-application/x-www-form-urlencoded (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
528 (mapconcat
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
529 (function
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
530 (lambda (data)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
531 (concat (w3-form-encode-xwfu (car data)) "="
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
532 (w3-form-encode-xwfu (cdr data)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
533 (w3-form-encode-helper result) "&"))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
534
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
535 (defun w3-form-encode-application/x-w3-isindex (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
536 (let* ((info (w3-form-encode-helper result))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
537 (query (cdr-safe (assoc "isindex" info))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
538 (if query
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
539 (url-hexify-string query)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
540 "")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
541
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
542 (defun w3-form-encode-application/gopher-ask-block (result)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
543 (let ((query ""))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
544 ;;; gopher+ will expect all the checkboxes/etc, even if they are
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
545 ;;; not turned on. Should still ignore RADIO boxes that are not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
546 ;;; active though.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
547 (while result
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
548 (if (and (not (and (string= (nth 2 (car result)) "RADIO")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
549 (not (nth 6 (car result)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
550 (not (member (nth 2 (car result)) '("SUBMIT" "RESET"))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
551 (setq query (format "%s\r\n%s" query (nth 5 (car result)))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
552 (setq result (cdr result)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
553 (concat query "\r\n.\r\n")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
554
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
555 (defun w3-submit-form (ident)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
556 ;; Submit form entry fields matching ACTN as their action identifier.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
557 (let* ((result (w3-all-widgets ident))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
558 (enctype (cdr (assq 'enctype ident)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
559 (query (w3-form-encode result enctype))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
560 (themeth (upcase (or (cdr (assq 'method ident)) "get")))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
561 (theurl (cdr (assq 'action ident))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
562 (if (and (string= "GET" themeth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
563 (string-match "\\([^\\?]*\\)\\?" theurl))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
564 (setq theurl (url-match theurl 1)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
565 (cond
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
566 ((or (string= "POST" themeth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
567 (string= "PUT" themeth))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
568 (if (consp query)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
569 (setq enctype (concat enctype "; separator=\""
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
570 (substring (car query) 3 nil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
571 "\"")
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
572 query (cdr query)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
573 (let ((url-request-method themeth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
574 (url-request-data query)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
575 (url-request-extra-headers
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
576 (cons (cons "Content-type" enctype) url-request-extra-headers)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
577 (w3-fetch theurl)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
578 ((string= "GET" themeth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
579 (let ((theurl (concat theurl "?" query)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
580 (w3-fetch theurl)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
581 (t
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
582 (w3-warn 'html (format "Unknown submit method: %s" themeth))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
583 (let ((theurl (concat theurl "?" query)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
584 (w3-fetch theurl))))))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
585
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
586 (provide 'w3-forms)