comparison lisp/dialog.el @ 2730:7031e143e4ee

[xemacs-hg @ 2005-04-14 05:58:45 by michaels] 2005-04-12 Mike Sperber <mike@xemacs.org> * minibuf.el (get-user-response): Move here from dialog.el so it works even when dialogs are not available. * dialog.el: See above.
author michaels
date Thu, 14 Apr 2005 05:58:46 +0000
parents bcb5d65d0d94
children fbafdc1bb4d2 308d34e9f07d
comparison
equal deleted inserted replaced
2729:d3c4655e9c06 2730:7031e143e4ee
89 ;;this will never get selected 89 ;;this will never get selected
90 `[,x 'ignore nil]) 90 `[,x 'ignore nil])
91 (t 91 (t
92 `[,(car x) (dialog-box-finish ',(cdr x)) t]))) 92 `[,(car x) (dialog-box-finish ',(cdr x)) t])))
93 (cdr contents)))) 93 (cdr contents))))
94
95 (defun get-user-response (position question answers)
96 "Ask a question and get a response from the user, in minibuffer or dialog box.
97 POSITION specifies which frame to use.
98 This is normally an event or a window or frame.
99 If POSITION is t or nil, it means to use the frame the mouse is on.
100 The dialog box appears in the middle of the specified frame.
101
102 QUESTION is the question to ask (it should end with a question mark followed
103 by a space).
104
105 ANSWERS are the possible answers. It is a list; each item looks like
106
107 (KEY BUTTON-TEXT RESPONSE)
108
109 where KEY is the key to be pressed in the minibuffer, BUTTON-TEXT is the
110 text to be displayed in a dialog box button (you should put %_ in it to
111 indicate the accelerator), and RESPONSE is a value (typically a symbol)
112 to be returned if the user selects this response. KEY should be either a
113 single character or a string; which one you use needs to be consistent for
114 all responses and determines whether the user responds by hitting a single
115 key or typing in a string and hitting ENTER.
116
117 An item may also be just a string--that makes a nonselectable item in the
118 dialog box and is ignored in the minibuffer.
119
120 An item may also be nil -- that means to put all preceding items
121 on the left of the dialog box and all following items on the right; ignored
122 in the minibuffer."
123 (if (should-use-dialog-box-p)
124 (get-dialog-box-response
125 position
126 (cons question
127 (mapcar #'(lambda (x)
128 (cond
129 ((null x) nil)
130 ((stringp x) x)
131 (t (cons (second x) (third x)))))
132 answers)))
133 (save-excursion
134 (let* ((answers (remove-if-not #'consp answers))
135 (possible
136 (gettext
137 (flet ((car-to-string-if (x)
138 (setq x (car x))
139 (if (stringp x) x (char-to-string x))))
140 (concat (mapconcat #'car-to-string-if
141 (butlast answers) ", ") " or "
142 (car-to-string-if (car (last answers)))))))
143 (question (gettext question))
144 (p (format "%s(%s) " question possible)))
145 (block nil
146 (if (stringp (caar answers))
147 ;; based on yes-or-no-p.
148 (while t
149 (let* ((ans (downcase (read-string p nil t))) ;no history
150 (res (member* ans answers :test #'equal :key #'car)))
151 (if res (return (third (car res)))
152 (ding nil 'yes-or-no-p)
153 (discard-input)
154 (message "Please answer %s." possible)
155 (sleep-for 2))))
156 ;; based on y-or-n-p.
157 (save-excursion
158 (let* ((pre "") event)
159 (while t
160 (if (let ((cursor-in-echo-area t)
161 (inhibit-quit t))
162 (message "%s%s(%s) " pre question possible)
163 (setq event (next-command-event event))
164 (condition-case nil
165 (prog1
166 (or quit-flag (eq 'keyboard-quit
167 (key-binding event)))
168 (setq quit-flag nil))
169 (wrong-type-argument t)))
170 (progn
171 (message "%s%s(%s) %s" pre question possible
172 (single-key-description event))
173 (setq quit-flag nil)
174 (signal 'quit '())))
175 (let* ((keys (events-to-keys (vector event)))
176 (def (lookup-key query-replace-map keys)))
177 (cond
178 ; ((eq def 'skip)
179 ; (message "%s%sNo" question possible)
180 ; (return nil))
181 ; ((eq def 'act)
182 ; (message "%s%sYes" question possible)
183 ; (return t))
184 ((eq def 'recenter)
185 (recenter))
186 ((or (eq def 'quit) (eq def 'exit-prefix))
187 (signal 'quit '()))
188 ((button-release-event-p event) ; ignore them
189 nil)
190 (t
191 (let ((res (member* (event-to-character event) answers
192 :key #'car)))
193 (if res (return (third (car res)))
194 (message "%s%s(%s) %s" pre question possible
195 (single-key-description event))
196 (ding nil 'y-or-n-p)
197 (discard-input)
198 (if (= (length pre) 0)
199 (setq pre (format "Please answer %s. "
200 ;; 17 parens! a record in
201 ;; our lisp code.
202 possible)))))))))))))))))
203
204 94
205 (defun message-box (fmt &rest args) 95 (defun message-box (fmt &rest args)
206 "Display a message, in a dialog box if possible. 96 "Display a message, in a dialog box if possible.
207 If the selected device has no dialog-box support, use the echo area. 97 If the selected device has no dialog-box support, use the echo area.
208 The arguments are the same as to `format'. 98 The arguments are the same as to `format'.