comparison lisp/w3/widget-edit.el @ 16:0293115a14e9 r19-15b91

Import from CVS: tag r19-15b91
author cvs
date Mon, 13 Aug 2007 08:49:20 +0200
parents 9ee227acff29
children
comparison
equal deleted inserted replaced
15:ad457d5f7d04 16:0293115a14e9
2 ;; 2 ;;
3 ;; Copyright (C) 1996 Free Software Foundation, Inc. 3 ;; Copyright (C) 1996 Free Software Foundation, Inc.
4 ;; 4 ;;
5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> 5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
6 ;; Keywords: extensions 6 ;; Keywords: extensions
7 ;; Version: 1.13 7 ;; Version: 1.22
8 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ 8 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/
9 9
10 ;;; Commentary: 10 ;;; Commentary:
11 ;; 11 ;;
12 ;; See `widget.el'. 12 ;; See `widget.el'.
56 (defvar widget-mouse-face 'highlight) 56 (defvar widget-mouse-face 'highlight)
57 (defvar widget-menu-max-size 40))) 57 (defvar widget-menu-max-size 40)))
58 58
59 ;;; Compatibility. 59 ;;; Compatibility.
60 60
61 (or (fboundp 'event-point) 61 (unless (fboundp 'event-point)
62 ;; XEmacs function missing in Emacs. 62 ;; XEmacs function missing in Emacs.
63 (defun event-point (event) 63 (defun event-point (event)
64 "Return the character position of the given mouse-motion, button-press, 64 "Return the character position of the given mouse-motion, button-press,
65 or button-release event. If the event did not occur over a window, or did 65 or button-release event. If the event did not occur over a window, or did
66 not occur over text, then this returns nil. Otherwise, it returns an index 66 not occur over text, then this returns nil. Otherwise, it returns an index
67 into the buffer visible in the event's window." 67 into the buffer visible in the event's window."
68 (posn-point (event-start event)))) 68 (posn-point (event-start event))))
69
70 (unless (fboundp 'error-message-string)
71 ;; Emacs function missing in XEmacs.
72 (defun error-message-string (obj)
73 "Convert an error value to an error message."
74 (let ((buf (get-buffer-create " *error-message*")))
75 (erase-buffer buf)
76 (display-error obj buf)
77 (buffer-string buf))))
69 78
70 ;;; Customization. 79 ;;; Customization.
71 80
72 (defgroup widgets nil 81 (defgroup widgets nil
73 "Customization support for the Widget Library." 82 "Customization support for the Widget Library."
75 :link '(url-link :tag "Development Page" 84 :link '(url-link :tag "Development Page"
76 "http://www.dina.kvl.dk/~abraham/custom/") 85 "http://www.dina.kvl.dk/~abraham/custom/")
77 :prefix "widget-" 86 :prefix "widget-"
78 :group 'emacs) 87 :group 'emacs)
79 88
80 (defface widget-documentation-face '((t ())) 89 (defface widget-documentation-face '((((class color)
90 (background dark))
91 (:foreground "lime green"))
92 (((class color)
93 (background light))
94 (:foreground "dark green"))
95 (t nil))
81 "Face used for documentation text." 96 "Face used for documentation text."
82 :group 'widgets) 97 :group 'widgets)
83 98
84 (defface widget-button-face '((t (:bold t))) 99 (defface widget-button-face '((t (:bold t)))
85 "Face used for widget buttons." 100 "Face used for widget buttons."
88 (defcustom widget-mouse-face 'highlight 103 (defcustom widget-mouse-face 'highlight
89 "Face used for widget buttons when the mouse is above them." 104 "Face used for widget buttons when the mouse is above them."
90 :type 'face 105 :type 'face
91 :group 'widgets) 106 :group 'widgets)
92 107
93 (defface widget-field-face '((((type x) 108 (defface widget-field-face '((((class grayscale color)
94 (class grayscale color)
95 (background light)) 109 (background light))
96 (:background "light gray")) 110 (:background "light gray"))
97 (((type x) 111 (((class grayscale color)
98 (class grayscale color)
99 (background dark)) 112 (background dark))
100 (:background "dark gray")) 113 (:background "dark gray"))
101 (t 114 (t
102 (:italic t))) 115 (:italic t)))
103 "Face used for editable fields." 116 "Face used for editable fields."
104 :group 'widgets) 117 :group 'widgets)
105 118
106 (defcustom widget-menu-max-size 40 119 (defcustom widget-menu-max-size 40
107 "Largest number of items allowed in a popup-menu. 120 "Largest number of items allowed in a popup-menu.
108 Larger menus are read through the minibuffer." 121 Larger menus are read through the minibuffer."
122 :group 'widgets
109 :type 'integer) 123 :type 'integer)
110 124
111 ;;; Utility functions. 125 ;;; Utility functions.
112 ;; 126 ;;
113 ;; These are not really widget specific. 127 ;; These are not really widget specific.
234 (put-text-property to (1+ to) 'read-only nil)))) 248 (put-text-property to (1+ to) 'read-only nil))))
235 249
236 (defun widget-specify-field-update (widget from to) 250 (defun widget-specify-field-update (widget from to)
237 ;; Specify editable button for WIDGET between FROM and TO. 251 ;; Specify editable button for WIDGET between FROM and TO.
238 (let ((map (widget-get widget :keymap)) 252 (let ((map (widget-get widget :keymap))
253 (secret (widget-get widget :secret))
254 (secret-to to)
255 (size (widget-get widget :size))
239 (face (or (widget-get widget :value-face) 256 (face (or (widget-get widget :value-face)
240 'widget-field-face))) 257 'widget-field-face)))
258
259 (when secret
260 (while (and size
261 (not (zerop size))
262 (> secret-to from)
263 (eq (char-after (1- secret-to)) ?\ ))
264 (setq secret-to (1- secret-to)))
265
266 (save-excursion
267 (goto-char from)
268 (while (< (point) secret-to)
269 (let ((old (get-text-property (point) 'secret)))
270 (when old
271 (subst-char-in-region (point) (1+ (point)) secret old)))
272 (forward-char))))
273
241 (set-text-properties from to (list 'field widget 274 (set-text-properties from to (list 'field widget
242 'read-only nil 275 'read-only nil
243 'keymap map 276 'keymap map
244 'local-map map 277 'local-map map
245 'face face)) 278 'face face))
279
280 (when secret
281 (save-excursion
282 (goto-char from)
283 (while (< (point) secret-to)
284 (let ((old (following-char)))
285 (subst-char-in-region (point) (1+ (point)) old secret)
286 (put-text-property (point) (1+ (point)) 'secret old))
287 (forward-char))))
288
246 (unless (widget-get widget :size) 289 (unless (widget-get widget :size)
247 (put-text-property to (1+ to) 'face face)))) 290 (add-text-properties to (1+ to) (list 'field widget
291 'face face
292 'local-map map
293 'keymap map)))))
248 294
249 (defun widget-specify-button (widget from to) 295 (defun widget-specify-button (widget from to)
250 ;; Specify button for WIDGET between FROM and TO. 296 ;; Specify button for WIDGET between FROM and TO.
251 (let ((face (widget-apply widget :button-face-get))) 297 (let ((face (widget-apply widget :button-face-get)))
252 (add-text-properties from to (list 'button widget 298 (add-text-properties from to (list 'button widget
253 'mouse-face widget-mouse-face 299 'mouse-face widget-mouse-face
254 'start-open t 300 'start-open t
255 'end-open t 301 'end-open t
256 'face face)))) 302 'face face))))
303
304 (defun widget-specify-sample (widget from to)
305 ;; Specify sample for WIDGET between FROM and TO.
306 (let ((face (widget-apply widget :sample-face-get)))
307 (when face
308 (add-text-properties from to (list 'start-open t
309 'end-open t
310 'face face)))))
257 311
258 (defun widget-specify-doc (widget from to) 312 (defun widget-specify-doc (widget from to)
259 ;; Specify documentation for WIDGET between FROM and TO. 313 ;; Specify documentation for WIDGET between FROM and TO.
260 (add-text-properties from to (list 'widget-doc widget 314 (add-text-properties from to (list 'widget-doc widget
261 'face 'widget-documentation-face))) 315 'face 'widget-documentation-face)))
433 487
434 (defvar widget-keymap nil 488 (defvar widget-keymap nil
435 "Keymap containing useful binding for buffers containing widgets. 489 "Keymap containing useful binding for buffers containing widgets.
436 Recommended as a parent keymap for modes using widgets.") 490 Recommended as a parent keymap for modes using widgets.")
437 491
438 (if widget-keymap 492 (unless widget-keymap
439 ()
440 (setq widget-keymap (make-sparse-keymap)) 493 (setq widget-keymap (make-sparse-keymap))
441 (set-keymap-parent widget-keymap global-map)
442 (define-key widget-keymap "\t" 'widget-forward) 494 (define-key widget-keymap "\t" 'widget-forward)
443 (define-key widget-keymap "\M-\t" 'widget-backward) 495 (define-key widget-keymap "\M-\t" 'widget-backward)
444 (define-key widget-keymap [(shift tab)] 'widget-backward) 496 (define-key widget-keymap [(shift tab)] 'widget-backward)
445 (define-key widget-keymap [(shift tab)] 'widget-backward) 497 (define-key widget-keymap [(shift tab)] 'widget-backward)
446 (define-key widget-keymap [backtab] 'widget-backward) 498 (define-key widget-keymap [backtab] 'widget-backward)
452 504
453 (defvar widget-global-map global-map 505 (defvar widget-global-map global-map
454 "Keymap used for events the widget does not handle themselves.") 506 "Keymap used for events the widget does not handle themselves.")
455 (make-variable-buffer-local 'widget-global-map) 507 (make-variable-buffer-local 'widget-global-map)
456 508
509 (defvar widget-field-keymap nil
510 "Keymap used inside an editable field.")
511
512 (unless widget-field-keymap
513 (setq widget-field-keymap (copy-keymap widget-keymap))
514 (define-key widget-field-keymap "\C-m" 'widget-field-activate)
515 (set-keymap-parent widget-field-keymap global-map))
516
517 (defvar widget-text-keymap nil
518 "Keymap used inside a text field.")
519
520 (unless widget-text-keymap
521 (setq widget-text-keymap (copy-keymap widget-keymap))
522 (set-keymap-parent widget-text-keymap global-map))
523
524 (defun widget-field-activate (pos &optional event)
525 "Activate the ediable field at point."
526 (interactive "@d")
527 (let* ((field (get-text-property pos 'field)))
528 (if field
529 (widget-apply field :action event)
530 (call-interactively
531 (lookup-key widget-global-map (this-command-keys))))))
532
457 (defun widget-button-click (event) 533 (defun widget-button-click (event)
458 "Activate button below mouse pointer." 534 "Activate button below mouse pointer."
459 (interactive "@e") 535 (interactive "@e")
460 (widget-button-press (event-point event) event)) 536 (widget-button-press (event-point event) event))
461 537
466 (if button 542 (if button
467 (widget-apply button :action event) 543 (widget-apply button :action event)
468 (call-interactively 544 (call-interactively
469 (lookup-key widget-global-map (this-command-keys)))))) 545 (lookup-key widget-global-map (this-command-keys))))))
470 546
471 (defun widget-forward (arg) 547 (defun widget-move (arg)
472 "Move point to the next field or button. 548 "Move point to the ARG next field or button.
473 With optional ARG, move across that many fields." 549 ARG may be negative to move backward."
474 (interactive "p")
475 (while (> arg 0) 550 (while (> arg 0)
476 (setq arg (1- arg)) 551 (setq arg (1- arg))
477 (let ((next (cond ((get-text-property (point) 'button) 552 (let ((next (cond ((get-text-property (point) 'button)
478 (next-single-property-change (point) 'button)) 553 (next-single-property-change (point) 'button))
479 ((get-text-property (point) 'field) 554 ((get-text-property (point) 'field)
531 (field (previous-single-property-change (point) 'field))) 606 (field (previous-single-property-change (point) 'field)))
532 (cond ((and button field) 607 (cond ((and button field)
533 (goto-char (max button field))) 608 (goto-char (max button field)))
534 (button (goto-char button)) 609 (button (goto-char button))
535 (field (goto-char field))))) 610 (field (goto-char field)))))
536 (widget-echo-help (point))) 611 (widget-echo-help (point))
612 (run-hooks 'widget-move-hook))
613
614 (defun widget-forward (arg)
615 "Move point to the next field or button.
616 With optional ARG, move across that many fields."
617 (interactive "p")
618 (run-hooks 'widget-forward-hook)
619 (widget-move arg))
537 620
538 (defun widget-backward (arg) 621 (defun widget-backward (arg)
539 "Move point to the previous field or button. 622 "Move point to the previous field or button.
540 With optional ARG, move across that many fields." 623 With optional ARG, move across that many fields."
541 (interactive "p") 624 (interactive "p")
542 (widget-forward (- arg))) 625 (run-hooks 'widget-backward-hook)
626 (widget-move (- arg)))
543 627
544 ;;; Setting up the buffer. 628 ;;; Setting up the buffer.
545 629
546 (defvar widget-field-new nil) 630 (defvar widget-field-new nil)
547 ;; List of all newly created editable fields in the buffer. 631 ;; List of all newly created editable fields in the buffer.
663 :create 'widget-default-create 747 :create 'widget-default-create
664 :indent nil 748 :indent nil
665 :offset 0 749 :offset 0
666 :format-handler 'widget-default-format-handler 750 :format-handler 'widget-default-format-handler
667 :button-face-get 'widget-default-button-face-get 751 :button-face-get 'widget-default-button-face-get
752 :sample-face-get 'widget-default-sample-face-get
668 :delete 'widget-default-delete 753 :delete 'widget-default-delete
669 :value-set 'widget-default-value-set 754 :value-set 'widget-default-value-set
670 :value-inline 'widget-default-value-inline 755 :value-inline 'widget-default-value-inline
671 :menu-tag-get 'widget-default-menu-tag-get 756 :menu-tag-get 'widget-default-menu-tag-get
672 :validate (lambda (widget) nil) 757 :validate (lambda (widget) nil)
678 (widget-specify-insert 763 (widget-specify-insert
679 (let ((from (point)) 764 (let ((from (point))
680 (tag (widget-get widget :tag)) 765 (tag (widget-get widget :tag))
681 (doc (widget-get widget :doc)) 766 (doc (widget-get widget :doc))
682 button-begin button-end 767 button-begin button-end
768 sample-begin sample-end
683 doc-begin doc-end 769 doc-begin doc-end
684 value-pos) 770 value-pos)
685 (insert (widget-get widget :format)) 771 (insert (widget-get widget :format))
686 (goto-char from) 772 (goto-char from)
687 ;; Parse % escapes in format. 773 ;; Parse % escapes in format.
692 (insert "%")) 778 (insert "%"))
693 ((eq escape ?\[) 779 ((eq escape ?\[)
694 (setq button-begin (point))) 780 (setq button-begin (point)))
695 ((eq escape ?\]) 781 ((eq escape ?\])
696 (setq button-end (point))) 782 (setq button-end (point)))
783 ((eq escape ?\{)
784 (setq sample-begin (point)))
785 ((eq escape ?\})
786 (setq sample-end (point)))
697 ((eq escape ?n) 787 ((eq escape ?n)
698 (when (widget-get widget :indent) 788 (when (widget-get widget :indent)
699 (insert "\n") 789 (insert "\n")
700 (insert-char ? (widget-get widget :indent)))) 790 (insert-char ? (widget-get widget :indent))))
701 ((eq escape ?t) 791 ((eq escape ?t)
715 (if (and button-begin (not button-end)) 805 (if (and button-begin (not button-end))
716 (widget-apply widget :value-create) 806 (widget-apply widget :value-create)
717 (setq value-pos (point)))) 807 (setq value-pos (point))))
718 (t 808 (t
719 (widget-apply widget :format-handler escape))))) 809 (widget-apply widget :format-handler escape)))))
720 ;; Specify button and doc, and insert value. 810 ;; Specify button, sample, and doc, and insert value.
721 (and button-begin button-end 811 (and button-begin button-end
722 (widget-specify-button widget button-begin button-end)) 812 (widget-specify-button widget button-begin button-end))
813 (and sample-begin sample-end
814 (widget-specify-sample widget sample-begin sample-end))
723 (and doc-begin doc-end 815 (and doc-begin doc-end
724 (widget-specify-doc widget doc-begin doc-end)) 816 (widget-specify-doc widget doc-begin doc-end))
725 (when value-pos 817 (when value-pos
726 (goto-char value-pos) 818 (goto-char value-pos)
727 (widget-apply widget :value-create))) 819 (widget-apply widget :value-create)))
776 868
777 (defun widget-default-button-face-get (widget) 869 (defun widget-default-button-face-get (widget)
778 ;; Use :button-face or widget-button-face 870 ;; Use :button-face or widget-button-face
779 (or (widget-get widget :button-face) 'widget-button-face)) 871 (or (widget-get widget :button-face) 'widget-button-face))
780 872
873 (defun widget-default-sample-face-get (widget)
874 ;; Use :sample-face.
875 (widget-get widget :sample-face))
876
781 (defun widget-default-delete (widget) 877 (defun widget-default-delete (widget)
782 ;; Remove widget from the buffer. 878 ;; Remove widget from the buffer.
783 (let ((from (widget-get widget :from)) 879 (let ((from (widget-get widget :from))
784 (to (widget-get widget :to)) 880 (to (widget-get widget :to))
785 (inhibit-read-only t) 881 (inhibit-read-only t)
875 971
876 ;;; The `link' Widget. 972 ;;; The `link' Widget.
877 973
878 (define-widget 'link 'item 974 (define-widget 'link 'item
879 "An embedded link." 975 "An embedded link."
976 :help-echo "Push me to follow the link."
880 :format "%[_%t_%]") 977 :format "%[_%t_%]")
881 978
882 ;;; The `info-link' Widget. 979 ;;; The `info-link' Widget.
883 980
884 (define-widget 'info-link 'link 981 (define-widget 'info-link 'link
903 ;;; The `editable-field' Widget. 1000 ;;; The `editable-field' Widget.
904 1001
905 (define-widget 'editable-field 'default 1002 (define-widget 'editable-field 'default
906 "An editable text field." 1003 "An editable text field."
907 :convert-widget 'widget-item-convert-widget 1004 :convert-widget 'widget-item-convert-widget
1005 :keymap widget-field-keymap
908 :format "%v" 1006 :format "%v"
909 :value "" 1007 :value ""
910 :action 'widget-field-action 1008 :action 'widget-field-action
911 :value-create 'widget-field-value-create 1009 :value-create 'widget-field-value-create
912 :value-delete 'widget-field-value-delete 1010 :value-delete 'widget-field-value-delete
963 (defun widget-field-value-get (widget) 1061 (defun widget-field-value-get (widget)
964 ;; Return current text in editing field. 1062 ;; Return current text in editing field.
965 (let ((from (widget-get widget :value-from)) 1063 (let ((from (widget-get widget :value-from))
966 (to (widget-get widget :value-to)) 1064 (to (widget-get widget :value-to))
967 (size (widget-get widget :size)) 1065 (size (widget-get widget :size))
1066 (secret (widget-get widget :secret))
968 (old (current-buffer))) 1067 (old (current-buffer)))
969 (if (and from to) 1068 (if (and from to)
970 (progn 1069 (progn
971 (set-buffer (marker-buffer from)) 1070 (set-buffer (marker-buffer from))
972 (setq from (1+ from) 1071 (setq from (1+ from)
974 (while (and size 1073 (while (and size
975 (not (zerop size)) 1074 (not (zerop size))
976 (> to from) 1075 (> to from)
977 (eq (char-after (1- to)) ?\ )) 1076 (eq (char-after (1- to)) ?\ ))
978 (setq to (1- to))) 1077 (setq to (1- to)))
979 (prog1 (buffer-substring-no-properties from to) 1078 (let ((result (buffer-substring-no-properties from to)))
980 (set-buffer old))) 1079 (when secret
1080 (let ((index 0))
1081 (while (< (+ from index) to)
1082 (aset result index
1083 (get-text-property (+ from index) 'secret))
1084 (setq index (1+ index)))))
1085 (set-buffer old)
1086 result))
981 (widget-get widget :value)))) 1087 (widget-get widget :value))))
982 1088
983 (defun widget-field-match (widget value) 1089 (defun widget-field-match (widget value)
984 ;; Match any string. 1090 ;; Match any string.
985 (stringp value)) 1091 (stringp value))
986 1092
987 ;;; The `text' Widget. 1093 ;;; The `text' Widget.
988 1094
989 (define-widget 'text 'editable-field 1095 (define-widget 'text 'editable-field
1096 :keymap widget-text-keymap
990 "A multiline text area.") 1097 "A multiline text area.")
991 1098
992 ;;; The `menu-choice' Widget. 1099 ;;; The `menu-choice' Widget.
993 1100
994 (define-widget 'menu-choice 'default 1101 (define-widget 'menu-choice 'default
1871 (define-widget 'character 'string 1978 (define-widget 'character 'string
1872 "An character." 1979 "An character."
1873 :tag "Character" 1980 :tag "Character"
1874 :value 0 1981 :value 0
1875 :size 1 1982 :size 1
1876 :format "%t: %v\n" 1983 :format "%{%t%}: %v\n"
1877 :type-error "This field should contain a character" 1984 :type-error "This field should contain a character"
1878 :value-to-internal (lambda (widget value) 1985 :value-to-internal (lambda (widget value)
1879 (if (integerp value) 1986 (if (integerp value)
1880 (char-to-string value) 1987 (char-to-string value)
1881 value)) 1988 value))
1897 :match (lambda (widget value) (numberp value))) 2004 :match (lambda (widget value) (numberp value)))
1898 2005
1899 (define-widget 'list 'group 2006 (define-widget 'list 'group
1900 "A lisp list." 2007 "A lisp list."
1901 :tag "List" 2008 :tag "List"
1902 :format "%t:\n%v") 2009 :format "%{%t%}:\n%v")
1903 2010
1904 (define-widget 'vector 'group 2011 (define-widget 'vector 'group
1905 "A lisp vector." 2012 "A lisp vector."
1906 :tag "Vector" 2013 :tag "Vector"
1907 :format "%t:\n%v" 2014 :format "%{%t%}:\n%v"
1908 :match 'widget-vector-match 2015 :match 'widget-vector-match
1909 :value-to-internal (lambda (widget value) (append value nil)) 2016 :value-to-internal (lambda (widget value) (append value nil))
1910 :value-to-external (lambda (widget value) (apply 'vector value))) 2017 :value-to-external (lambda (widget value) (apply 'vector value)))
1911 2018
1912 (defun widget-vector-match (widget value) 2019 (defun widget-vector-match (widget value)
1915 (widget-apply :value-to-internal widget value)))) 2022 (widget-apply :value-to-internal widget value))))
1916 2023
1917 (define-widget 'cons 'group 2024 (define-widget 'cons 'group
1918 "A cons-cell." 2025 "A cons-cell."
1919 :tag "Cons-cell" 2026 :tag "Cons-cell"
1920 :format "%t:\n%v" 2027 :format "%{%t%}:\n%v"
1921 :match 'widget-cons-match 2028 :match 'widget-cons-match
1922 :value-to-internal (lambda (widget value) 2029 :value-to-internal (lambda (widget value)
1923 (list (car value) (cdr value))) 2030 (list (car value) (cdr value)))
1924 :value-to-external (lambda (widget value) 2031 :value-to-external (lambda (widget value)
1925 (cons (nth 0 value) (nth 1 value)))) 2032 (cons (nth 0 value) (nth 1 value))))
1935 :format "%[%t%]: %v") 2042 :format "%[%t%]: %v")
1936 2043
1937 (define-widget 'radio 'radio-button-choice 2044 (define-widget 'radio 'radio-button-choice
1938 "A union of several sexp types." 2045 "A union of several sexp types."
1939 :tag "Choice" 2046 :tag "Choice"
1940 :format "%t:\n%v") 2047 :format "%{%t%}:\n%v")
1941 2048
1942 (define-widget 'repeat 'editable-list 2049 (define-widget 'repeat 'editable-list
1943 "A variable length homogeneous list." 2050 "A variable length homogeneous list."
1944 :tag "Repeat" 2051 :tag "Repeat"
1945 :format "%t:\n%v%i\n") 2052 :format "%{%t%}:\n%v%i\n")
1946 2053
1947 (define-widget 'set 'checklist 2054 (define-widget 'set 'checklist
1948 "A list of members from a fixed set." 2055 "A list of members from a fixed set."
1949 :tag "Set" 2056 :tag "Set"
1950 :format "%t:\n%v") 2057 :format "%{%t%}:\n%v")
1951 2058
1952 (define-widget 'boolean 'toggle 2059 (define-widget 'boolean 'toggle
1953 "To be nil or non-nil, that is the question." 2060 "To be nil or non-nil, that is the question."
1954 :tag "Boolean" 2061 :tag "Boolean"
1955 :format "%t: %v") 2062 :format "%{%t%}: %v")
1956 2063
1957 ;;; The `color' Widget. 2064 ;;; The `color' Widget.
1958 2065
1959 (define-widget 'color-item 'choice-item 2066 (define-widget 'color-item 'choice-item
1960 "A color name (with sample)." 2067 "A color name (with sample)."