Mercurial > hg > xemacs-beta
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)." |