annotate lisp/wid-edit.el @ 72550:666bd542be19

(get_window_cursor_type): Replace BOX cursor on images with a hollow box cursor if image is larger than 32x32 (or the default frame font if that is bigger). Replace any other cursor on images with hollow box cursor, as redisplay doesn't support bar and hbar cursors on images.
author Kim F. Storm <storm@cua.dk>
date Sun, 27 Aug 2006 22:23:07 +0000
parents bb4dc0e56e88
children 1a9df4096f4e 9e490faa9f6b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1 ;;; wid-edit.el --- Functions for creating and using widgets -*-byte-compile-dynamic: t;-*-
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2 ;;
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64565
diff changeset
3 ;; Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003,
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 68405
diff changeset
4 ;; 2004, 2005, 2006 Free Software Foundation, Inc.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
5 ;;
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
6 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk>
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
7 ;; Maintainer: FSF
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
8 ;; Keywords: extensions
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
9
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
10 ;; This file is part of GNU Emacs.
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
11
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
15 ;; any later version.
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
16
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
20 ;; GNU General Public License for more details.
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
21
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
22 ;; You should have received a copy of the GNU General Public License
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63757
diff changeset
24 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 63757
diff changeset
25 ;; Boston, MA 02110-1301, USA.
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
26
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
27 ;;; Wishlist items (from widget.texi):
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
28
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
29 ;; * The `menu-choice' tag should be prettier, something like the
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
30 ;; abbreviated menus in Open Look.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
31
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
32 ;; * Finish `:tab-order'.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
33
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
34 ;; * Make indentation work with glyphs and proportional fonts.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
35
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
36 ;; * Add commands to show overview of object and class hierarchies to
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
37 ;; the browser.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
38
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
39 ;; * Find a way to disable mouse highlight for inactive widgets.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
40
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
41 ;; * Find a way to make glyphs look inactive.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
42
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
43 ;; * Add `key-binding' widget.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
44
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
45 ;; * Add `widget' widget for editing widget specifications.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
46
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
47 ;; * Find clean way to implement variable length list. See
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
48 ;; `TeX-printer-list' for an explanation.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
49
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
50 ;; * `C-h' in `widget-prompt-value' should give type specific help.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
51
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
52 ;; * A mailto widget. [This should work OK as a url-link if with
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
53 ;; browse-url-browser-function' set up appropriately.]
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
54
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
55 ;;; Commentary:
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
56 ;;
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
57 ;; See `widget.el'.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
58
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
59 ;;; Code:
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
60
65868
fb90b962c3cb (widget): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 65837
diff changeset
61 (defvar widget)
fb90b962c3cb (widget): Add defvar.
Juanma Barranquero <lekktu@gmail.com>
parents: 65837
diff changeset
62
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
63 ;;; Compatibility.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
64
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
65 (defun widget-event-point (event)
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
66 "Character position of the end of event if that exists, or nil."
21338
f94e2fdb6617 (widget-beginning-of-line): Don't set zmacs-region-stays.
Richard M. Stallman <rms@gnu.org>
parents: 21337
diff changeset
67 (posn-point (event-end event)))
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
68
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
69 (defun widget-button-release-event-p (event)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
70 "Non-nil if EVENT is a mouse-button-release event object."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
71 (and (eventp event)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
72 (memq (event-basic-type event) '(mouse-1 mouse-2 mouse-3))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
73 (or (memq 'click (event-modifiers event))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
74 (memq 'drag (event-modifiers event)))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
75
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
76 ;;; Customization.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
77
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
78 (defgroup widgets nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
79 "Customization support for the Widget Library."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
80 :link '(custom-manual "(widget)Top")
18598
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
81 :link '(emacs-library-link :tag "Lisp File" "widget.el")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
82 :prefix "widget-"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
83 :group 'extensions
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
84 :group 'hypermedia)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
85
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
86 (defgroup widget-documentation nil
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
87 "Options controling the display of documentation strings."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
88 :group 'widgets)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
89
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
90 (defgroup widget-faces nil
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
91 "Faces used by the widget library."
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
92 :group 'widgets
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
93 :group 'faces)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
94
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
95 (defvar widget-documentation-face 'widget-documentation
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
96 "Face used for documentation strings in widgets.
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
97 This exists as a variable so it can be set locally in certain buffers.")
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
98
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
99 (defface widget-documentation '((((class color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
100 (background dark))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
101 (:foreground "lime green"))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
102 (((class color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
103 (background light))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
104 (:foreground "dark green"))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
105 (t nil))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
106 "Face used for documentation text."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
107 :group 'widget-documentation
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
108 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
109 ;; backward compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
110 (put 'widget-documentation-face 'face-alias 'widget-documentation)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
111
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
112 (defvar widget-button-face 'widget-button
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
113 "Face used for buttons in widgets.
18572
f0c2a091d91f (color-sample, editable-color): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 18562
diff changeset
114 This exists as a variable so it can be set locally in certain buffers.")
f0c2a091d91f (color-sample, editable-color): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 18562
diff changeset
115
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
116 (defface widget-button '((t (:weight bold)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
117 "Face used for widget buttons."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
118 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
119 ;; backward compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
120 (put 'widget-button-face 'face-alias 'widget-button)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
121
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
122 (defcustom widget-mouse-face 'highlight
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
123 "Face used for widget buttons when the mouse is above them."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
124 :type 'face
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
125 :group 'widget-faces)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
126
40016
75158749d067 (widget-field-face, widget-single-line-field-face):
Eli Zaretskii <eliz@gnu.org>
parents: 38907
diff changeset
127 ;; TTY gets special definitions here and in the next defface, because
75158749d067 (widget-field-face, widget-single-line-field-face):
Eli Zaretskii <eliz@gnu.org>
parents: 38907
diff changeset
128 ;; the gray colors defined for other displays cause black text on a black
75158749d067 (widget-field-face, widget-single-line-field-face):
Eli Zaretskii <eliz@gnu.org>
parents: 38907
diff changeset
129 ;; background, at least on light-background TTYs.
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
130 (defface widget-field '((((type tty))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
131 :background "yellow3"
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
132 :foreground "black")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
133 (((class grayscale color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
134 (background light))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
135 :background "gray85")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
136 (((class grayscale color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
137 (background dark))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
138 :background "dim gray")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
139 (t
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
140 :slant italic))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
141 "Face used for editable fields."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
142 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
143 ;; backward-compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
144 (put 'widget-field-face 'face-alias 'widget-field)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
145
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
146 (defface widget-single-line-field '((((type tty))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
147 :background "green3"
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
148 :foreground "black")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
149 (((class grayscale color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
150 (background light))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
151 :background "gray85")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
152 (((class grayscale color)
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
153 (background dark))
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
154 :background "dim gray")
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
155 (t
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
156 :slant italic))
18562
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
157 "Face used for editable fields spanning only a single line."
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
158 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
159 ;; backward-compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
160 (put 'widget-single-line-field-face 'face-alias 'widget-single-line-field)
18562
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
161
19256
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
162 ;;; This causes display-table to be loaded, and not usefully.
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
163 ;;;(defvar widget-single-line-display-table
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
164 ;;; (let ((table (make-display-table)))
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
165 ;;; (aset table 9 "^I")
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
166 ;;; (aset table 10 "^J")
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
167 ;;; table)
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
168 ;;; "Display table used for single-line editable fields.")
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
169
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
170 ;;;(when (fboundp 'set-face-display-table)
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
171 ;;; (set-face-display-table 'widget-single-line-field-face
e4b14e6fd28f (widget-single-line-display-table): Variable
Richard M. Stallman <rms@gnu.org>
parents: 19022
diff changeset
172 ;;; widget-single-line-display-table))
18562
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
173
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
174 ;;; Utility functions.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
175 ;;
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
176 ;; These are not really widget specific.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
177
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
178 (defun widget-princ-to-string (object)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
179 "Return string representation of OBJECT, any Lisp object.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
180 No quoting characters are used; no delimiters are printed around
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
181 the contents of strings."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
182 (with-output-to-string
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
183 (princ object)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
184
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
185 (defun widget-clear-undo ()
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
186 "Clear all undo information."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
187 (buffer-disable-undo (current-buffer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
188 (buffer-enable-undo))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
189
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
190 (defcustom widget-menu-max-size 40
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
191 "Largest number of items allowed in a popup-menu.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
192 Larger menus are read through the minibuffer."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
193 :group 'widgets
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
194 :type 'integer)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
195
23243
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
196 (defcustom widget-menu-max-shortcuts 40
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
197 "Largest number of items for which it works to choose one with a character.
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
198 For a larger number of items, the minibuffer is used."
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
199 :group 'widgets
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
200 :type 'integer)
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
201
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
202 (defcustom widget-menu-minibuffer-flag nil
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
203 "*Control how to ask for a choice from the keyboard.
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
204 Non-nil means use the minibuffer;
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
205 nil means read a single character."
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
206 :group 'widgets
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
207 :type 'boolean)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
208
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
209 (defun widget-choose (title items &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
210 "Choose an item from a list.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
211
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
212 First argument TITLE is the name of the list.
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
213 Second argument ITEMS is a list whose members are either
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
214 (NAME . VALUE), to indicate selectable items, or just strings to
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
215 indicate unselectable items.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
216 Optional third argument EVENT is an input event.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
217
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
218 The user is asked to choose between each NAME from the items alist,
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
219 and the VALUE of the chosen element will be returned. If EVENT is a
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
220 mouse event, and the number of elements in items is less than
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
221 `widget-menu-max-size', a popup menu will be used, otherwise the
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
222 minibuffer."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
223 (cond ((and (< (length items) widget-menu-max-size)
35155
9e39c86c678b (widget-choose): Call display-popup-menus-p instead
Eli Zaretskii <eliz@gnu.org>
parents: 34294
diff changeset
224 event (display-popup-menus-p))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
225 ;; Mouse click.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
226 (x-popup-menu event
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
227 (list title (cons "" items))))
23243
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
228 ((or widget-menu-minibuffer-flag
b6c86c56e760 (widget-menu-max-shortcuts): New variable.
Karl Heuer <kwzh@gnu.org>
parents: 22941
diff changeset
229 (> (length items) widget-menu-max-shortcuts))
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
230 ;; Read the choice of name from the minibuffer.
18056
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
231 (setq items (widget-remove-if 'stringp items))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
232 (let ((val (completing-read (concat title ": ") items nil t)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
233 (if (stringp val)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
234 (let ((try (try-completion val items)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
235 (when (stringp try)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
236 (setq val try))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
237 (cdr (assoc val items))))))
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
238 (t
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
239 ;; Construct a menu of the choices
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
240 ;; and then use it for prompting for a single character.
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
241 (let* ((overriding-terminal-local-map (make-sparse-keymap))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
242 (next-digit ?0)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
243 map choice some-choice-enabled value)
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
244 ;; Define SPC as a prefix char to get to this menu.
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
245 (define-key overriding-terminal-local-map " "
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
246 (setq map (make-sparse-keymap title)))
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
247 (with-current-buffer (get-buffer-create " widget-choose")
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
248 (erase-buffer)
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
249 (insert "Available choices:\n\n")
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
250 (while items
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
251 (setq choice (car items) items (cdr items))
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
252 (if (consp choice)
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
253 (let* ((name (car choice))
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
254 (function (cdr choice)))
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
255 (insert (format "%c = %s\n" next-digit name))
18638
ac27714a02cf (widget-field-use-before-change): Reenable for Emacs 20.
Richard M. Stallman <rms@gnu.org>
parents: 18600
diff changeset
256 (define-key map (vector next-digit) function)
ac27714a02cf (widget-field-use-before-change): Reenable for Emacs 20.
Richard M. Stallman <rms@gnu.org>
parents: 18600
diff changeset
257 (setq some-choice-enabled t)))
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
258 ;; Allocate digits to disabled alternatives
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
259 ;; so that the digit of a given alternative never varies.
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
260 (setq next-digit (1+ next-digit)))
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
261 (insert "\nC-g = Quit"))
18638
ac27714a02cf (widget-field-use-before-change): Reenable for Emacs 20.
Richard M. Stallman <rms@gnu.org>
parents: 18600
diff changeset
262 (or some-choice-enabled
ac27714a02cf (widget-field-use-before-change): Reenable for Emacs 20.
Richard M. Stallman <rms@gnu.org>
parents: 18600
diff changeset
263 (error "None of the choices is currently meaningful"))
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
264 (define-key map [?\C-g] 'keyboard-quit)
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
265 (define-key map [t] 'keyboard-quit)
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
266 (define-key map [?\M-\C-v] 'scroll-other-window)
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
267 (define-key map [?\M--] 'negative-argument)
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
268 (setcdr map (nreverse (cdr map)))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
269 ;; Read a char with the menu, and return the result
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
270 ;; that corresponds to it.
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
271 (save-window-excursion
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
272 (let ((buf (get-buffer " widget-choose")))
33934
dd855bc086f3 (widget-choose): Make sure pop-up window is large enough to display all
Miles Bader <miles@gnu.org>
parents: 33893
diff changeset
273 (fit-window-to-buffer (display-buffer buf))
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
274 (let ((cursor-in-echo-area t)
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
275 keys
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
276 (char 0)
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
277 (arg 1))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
278 (while (not (or (and (>= char ?0) (< char next-digit))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
279 (eq value 'keyboard-quit)))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
280 ;; Unread a SPC to lead to our new menu.
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
281 (setq unread-command-events (cons ?\s unread-command-events))
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
282 (setq keys (read-key-sequence title))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
283 (setq value
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
284 (lookup-key overriding-terminal-local-map keys t)
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
285 char (string-to-char (substring keys 1)))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
286 (cond ((eq value 'scroll-other-window)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
287 (let ((minibuffer-scroll-window
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
288 (get-buffer-window buf)))
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
289 (if (> 0 arg)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
290 (scroll-other-window-down
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
291 (window-height minibuffer-scroll-window))
20466
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
292 (scroll-other-window))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
293 (setq arg 1)))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
294 ((eq value 'negative-argument)
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
295 (setq arg -1))
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
296 (t
38cee46393d4 (widget-choose): Allow scrolling of large lists.
Karl Heuer <kwzh@gnu.org>
parents: 20073
diff changeset
297 (setq arg 1)))))))
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
298 (when (eq value 'keyboard-quit)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
299 (error "Canceled"))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
300 value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
301
18056
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
302 (defun widget-remove-if (predictate list)
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
303 (let (result (tail list))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
304 (while tail
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
305 (or (funcall predictate (car tail))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
306 (setq result (cons (car tail) result)))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
307 (setq tail (cdr tail)))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
308 (nreverse result)))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
309
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
310 ;;; Widget text specifications.
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
311 ;;
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
312 ;; These functions are for specifying text properties.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
313
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
314 ;; We can set it to nil now that get_local_map uses get_pos_property.
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
315 (defconst widget-field-add-space nil
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
316 "Non-nil means add extra space at the end of editable text fields.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
317 If you don't add the space, it will become impossible to edit a zero
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
318 size field.")
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
319
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
320 (defvar widget-field-use-before-change t
18451
8eb08560287b Synched with 1.9936.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18438
diff changeset
321 "Non-nil means use `before-change-functions' to track editable fields.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
322 This enables the use of undo, but doesn't work on Emacs 19.34 and earlier.
18451
8eb08560287b Synched with 1.9936.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18438
diff changeset
323 Using before hooks also means that the :notify function can't know the
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
324 new value.")
18451
8eb08560287b Synched with 1.9936.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18438
diff changeset
325
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
326 (defun widget-specify-field (widget from to)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
327 "Specify editable button for WIDGET between FROM and TO."
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
328 ;; Terminating space is not part of the field, but necessary in
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
329 ;; order for local-map to work. Remove next sexp if local-map works
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
330 ;; at the end of the overlay.
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
331 (save-excursion
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
332 (goto-char to)
18598
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
333 (cond ((null (widget-get widget :size))
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
334 (forward-char 1))
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
335 (widget-field-add-space
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
336 (insert-and-inherit " ")))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
337 (setq to (point)))
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
338 (let ((keymap (widget-get widget :keymap))
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
339 (face (or (widget-get widget :value-face) 'widget-field))
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
340 (help-echo (widget-get widget :help-echo))
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
341 (follow-link (widget-get widget :follow-link))
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
342 (rear-sticky
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
343 (or (not widget-field-add-space) (widget-get widget :size))))
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
344 (if (functionp help-echo)
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
345 (setq help-echo 'widget-mouse-help))
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
346 (when (= (char-before to) ?\n)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
347 ;; When the last character in the field is a newline, we want to
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
348 ;; give it a `field' char-property of `boundary', which helps the
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
349 ;; C-n/C-p act more naturally when entering/leaving the field. We
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
350 ;; do this by making a small secondary overlay to contain just that
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
351 ;; one character.
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
352 (let ((overlay (make-overlay (1- to) to nil t nil)))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
353 (overlay-put overlay 'field 'boundary)
58766
4b3cfed7370f (widget-specify-field): Add `real-field' property to boundary.
Richard M. Stallman <rms@gnu.org>
parents: 58578
diff changeset
354 ;; We need the real field for tabbing.
4b3cfed7370f (widget-specify-field): Add `real-field' property to boundary.
Richard M. Stallman <rms@gnu.org>
parents: 58578
diff changeset
355 (overlay-put overlay 'real-field widget)
32903
63244e8732b3 (widget-specify-field): Revert to using local-map
Dave Love <fx@gnu.org>
parents: 32901
diff changeset
356 ;; Use `local-map' here, not `keymap', so that normal editing
63244e8732b3 (widget-specify-field): Revert to using local-map
Dave Love <fx@gnu.org>
parents: 32901
diff changeset
357 ;; works in the field when, say, Custom uses `suppress-keymap'.
63244e8732b3 (widget-specify-field): Revert to using local-map
Dave Love <fx@gnu.org>
parents: 32901
diff changeset
358 (overlay-put overlay 'local-map keymap)
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
359 (overlay-put overlay 'face face)
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
360 (overlay-put overlay 'follow-link follow-link)
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
361 (overlay-put overlay 'help-echo help-echo))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
362 (setq to (1- to))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
363 (setq rear-sticky t))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
364 (let ((overlay (make-overlay from to nil nil rear-sticky)))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
365 (widget-put widget :field-overlay overlay)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
366 ;;(overlay-put overlay 'detachable nil)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
367 (overlay-put overlay 'field widget)
32903
63244e8732b3 (widget-specify-field): Revert to using local-map
Dave Love <fx@gnu.org>
parents: 32901
diff changeset
368 (overlay-put overlay 'local-map keymap)
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
369 (overlay-put overlay 'face face)
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
370 (overlay-put overlay 'follow-link follow-link)
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
371 (overlay-put overlay 'help-echo help-echo)))
22422
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
372 (widget-specify-secret widget))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
373
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
374 (defun widget-specify-secret (field)
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
375 "Replace text in FIELD with value of `:secret', if non-nil."
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
376 (let ((secret (widget-get field :secret))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
377 (size (widget-get field :size)))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
378 (when secret
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
379 (let ((begin (widget-field-start field))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
380 (end (widget-field-end field)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
381 (when size
22422
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
382 (while (and (> end begin)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
383 (eq (char-after (1- end)) ?\s))
22422
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
384 (setq end (1- end))))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
385 (while (< begin end)
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
386 (let ((old (char-after begin)))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
387 (unless (eq old secret)
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
388 (subst-char-in-region begin (1+ begin) old secret)
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
389 (put-text-property begin (1+ begin) 'secret old))
1eba71735142 (widget-specify-secret): New function.
Richard M. Stallman <rms@gnu.org>
parents: 22421
diff changeset
390 (setq begin (1+ begin))))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
391
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
392 (defun widget-specify-button (widget from to)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
393 "Specify button for WIDGET between FROM and TO."
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
394 (let ((overlay (make-overlay from to nil t nil))
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
395 (follow-link (widget-get widget :follow-link))
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
396 (help-echo (widget-get widget :help-echo)))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
397 (widget-put widget :button-overlay overlay)
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
398 (if (functionp help-echo)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
399 (setq help-echo 'widget-mouse-help))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
400 (overlay-put overlay 'button widget)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
401 (overlay-put overlay 'keymap (widget-get widget :keymap))
55202
4c64ee838f41 * subr.el (remove-overlays): Make arguments optional.
Masatake YAMATO <jet@gyve.org>
parents: 53495
diff changeset
402 (overlay-put overlay 'evaporate t)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
403 ;; We want to avoid the face with image buttons.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
404 (unless (widget-get widget :suppress-face)
59767
08c82797edef (widget-specify-button): If mouse pointer shape cannot be changed,
Eli Zaretskii <eliz@gnu.org>
parents: 59131
diff changeset
405 (overlay-put overlay 'face (widget-apply widget :button-face-get))
68020
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
406 (overlay-put overlay 'mouse-face
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
407 (widget-apply widget :mouse-face-get)))
55984
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
408 (overlay-put overlay 'pointer 'hand)
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
409 (overlay-put overlay 'follow-link follow-link)
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
410 (overlay-put overlay 'help-echo help-echo)))
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
411
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
412 (defun widget-mouse-help (window overlay point)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
413 "Help-echo callback for widgets whose :help-echo is a function."
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
414 (with-current-buffer (overlay-buffer overlay)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
415 (let* ((widget (widget-at (overlay-start overlay)))
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
416 (help-echo (if widget (widget-get widget :help-echo))))
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
417 (if (functionp help-echo)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
418 (funcall help-echo widget)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
419 help-echo))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
420
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
421 (defun widget-specify-sample (widget from to)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
422 "Specify sample for WIDGET between FROM and TO."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
423 (let ((overlay (make-overlay from to nil t nil)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
424 (overlay-put overlay 'face (widget-apply widget :sample-face-get))
55202
4c64ee838f41 * subr.el (remove-overlays): Make arguments optional.
Masatake YAMATO <jet@gyve.org>
parents: 53495
diff changeset
425 (overlay-put overlay 'evaporate t)
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
426 (widget-put widget :sample-overlay overlay)))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
427
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
428 (defun widget-specify-doc (widget from to)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
429 "Specify documentation for WIDGET between FROM and TO."
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
430 (let ((overlay (make-overlay from to nil t nil)))
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
431 (overlay-put overlay 'widget-doc widget)
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
432 (overlay-put overlay 'face widget-documentation-face)
55202
4c64ee838f41 * subr.el (remove-overlays): Make arguments optional.
Masatake YAMATO <jet@gyve.org>
parents: 53495
diff changeset
433 (overlay-put overlay 'evaporate t)
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
434 (widget-put widget :doc-overlay overlay)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
435
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
436 (defmacro widget-specify-insert (&rest form)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
437 "Execute FORM without inheriting any text properties."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
438 `(save-restriction
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
439 (let ((inhibit-read-only t)
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
440 (inhibit-modification-hooks t))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
441 (narrow-to-region (point) (point))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
442 (prog1 (progn ,@form)
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
443 (goto-char (point-max))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
444
64504
6d0e9c3f9769 (widget-inactive): Inherit from `shadow'.
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
445 (defface widget-inactive
6d0e9c3f9769 (widget-inactive): Inherit from `shadow'.
Juri Linkov <juri@jurta.org>
parents: 64091
diff changeset
446 '((t :inherit shadow))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
447 "Face used for inactive widgets."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
448 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
449 ;; backward-compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
450 (put 'widget-inactive-face 'face-alias 'widget-inactive)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
451
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
452 (defun widget-specify-inactive (widget from to)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
453 "Make WIDGET inactive for user modifications."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
454 (unless (widget-get widget :inactive)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
455 (let ((overlay (make-overlay from to nil t nil)))
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
456 (overlay-put overlay 'face 'widget-inactive)
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
457 ;; This is disabled, as it makes the mouse cursor change shape.
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
458 ;; (overlay-put overlay 'mouse-face 'widget-inactive)
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
459 (overlay-put overlay 'evaporate t)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
460 (overlay-put overlay 'priority 100)
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
461 (overlay-put overlay 'modification-hooks '(widget-overlay-inactive))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
462 (widget-put widget :inactive overlay))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
463
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
464 (defun widget-overlay-inactive (&rest junk)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
465 "Ignoring the arguments, signal an error."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
466 (unless inhibit-read-only
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
467 (error "The widget here is not active")))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
468
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
469
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
470 (defun widget-specify-active (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
471 "Make WIDGET active for user modifications."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
472 (let ((inactive (widget-get widget :inactive)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
473 (when inactive
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
474 (delete-overlay inactive)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
475 (widget-put widget :inactive nil))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
476
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
477 ;;; Widget Properties.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
478
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
479 (defsubst widget-type (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
480 "Return the type of WIDGET, a symbol."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
481 (car widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
482
43295
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
483 ;;;###autoload
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
484 (defun widgetp (widget)
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
485 "Return non-nil iff WIDGET is a widget."
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
486 (if (symbolp widget)
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
487 (get widget 'widget-type)
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
488 (and (consp widget)
43299
683707b691b8 2002-02-15 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 43295
diff changeset
489 (symbolp (car widget))
683707b691b8 2002-02-15 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 43295
diff changeset
490 (get (car widget) 'widget-type))))
43295
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
491
18364
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
492 (defun widget-get-indirect (widget property)
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
493 "In WIDGET, get the value of PROPERTY.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
494 If the value is a symbol, return its binding.
18364
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
495 Otherwise, just return the value."
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
496 (let ((value (widget-get widget property)))
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
497 (if (symbolp value)
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
498 (symbol-value value)
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
499 value)))
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
500
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
501 (defun widget-member (widget property)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
502 "Non-nil iff there is a definition in WIDGET for PROPERTY."
29954
94c96c958d39 (widget-member): Use the new plist-member.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29567
diff changeset
503 (cond ((plist-member (cdr widget) property)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
504 t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
505 ((car widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
506 (widget-member (get (car widget) 'widget-type) property))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
507 (t nil)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
508
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
509 (defun widget-value (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
510 "Extract the current value of WIDGET."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
511 (widget-apply widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
512 :value-to-external (widget-apply widget :value-get)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
513
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
514 (defun widget-value-set (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
515 "Set the current value of WIDGET to VALUE."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
516 (widget-apply widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
517 :value-set (widget-apply widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
518 :value-to-internal value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
519
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
520 (defun widget-default-get (widget)
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
521 "Extract the default external value of WIDGET."
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
522 (widget-apply widget :value-to-external
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
523 (or (widget-get widget :value)
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
524 (widget-apply widget :default-get))))
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
525
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
526 (defun widget-match-inline (widget vals)
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
527 "In WIDGET, match the start of VALS."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
528 (cond ((widget-get widget :inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
529 (widget-apply widget :match-inline vals))
27711
bc335df29000 2000-02-02 Per Abrahamsen <abraham@dina.kvl.dk>
Dave Love <fx@gnu.org>
parents: 27655
diff changeset
530 ((and (listp vals)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
531 (widget-apply widget :match (car vals)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
532 (cons (list (car vals)) (cdr vals)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
533 (t nil)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
534
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
535 (defun widget-apply-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
536 "Apply :action in WIDGET in response to EVENT."
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
537 (if (widget-apply widget :active)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
538 (widget-apply widget :action event)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
539 (error "Attempt to perform action on inactive widget")))
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
540
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
541 ;;; Helper functions.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
542 ;;
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
543 ;; These are widget specific.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
544
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
545 ;;;###autoload
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
546 (defun widget-prompt-value (widget prompt &optional value unbound)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
547 "Prompt for a value matching WIDGET, using PROMPT.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
548 The current value is assumed to be VALUE, unless UNBOUND is non-nil."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
549 (unless (listp widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
550 (setq widget (list widget)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
551 (setq prompt (format "[%s] %s" (widget-type widget) prompt))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
552 (setq widget (widget-convert widget))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
553 (let ((answer (widget-apply widget :prompt-value prompt value unbound)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
554 (unless (widget-apply widget :match answer)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
555 (error "Value does not match %S type" (car widget)))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
556 answer))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
557
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
558 (defun widget-get-sibling (widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
559 "Get the item WIDGET is assumed to toggle.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
560 This is only meaningful for radio buttons or checkboxes in a list."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
561 (let* ((children (widget-get (widget-get widget :parent) :children))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
562 child)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
563 (catch 'child
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
564 (while children
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
565 (setq child (car children)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
566 children (cdr children))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
567 (when (eq (widget-get child :button) widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
568 (throw 'child child)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
569 nil)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
570
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
571 (defun widget-map-buttons (function &optional buffer maparg)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
572 "Map FUNCTION over the buttons in BUFFER.
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
573 FUNCTION is called with the arguments WIDGET and MAPARG.
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
574
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
575 If FUNCTION returns non-nil, the walk is cancelled.
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
576
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
577 The arguments MAPARG, and BUFFER default to nil and (current-buffer),
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
578 respectively."
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
579 (let ((cur (point-min))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
580 (widget nil)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
581 (overlays (if buffer
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
582 (with-current-buffer buffer (overlay-lists))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
583 (overlay-lists))))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
584 (setq overlays (append (car overlays) (cdr overlays)))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
585 (while (setq cur (pop overlays))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
586 (setq widget (overlay-get cur 'button))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
587 (if (and widget (funcall function widget maparg))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
588 (setq overlays nil)))))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
589
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
590 ;;; Images.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
591
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
592 (defcustom widget-image-directory (file-name-as-directory
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
593 (expand-file-name "custom" data-directory))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
594 "Where widget button images are located.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
595 If this variable is nil, widget will try to locate the directory
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
596 automatically."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
597 :group 'widgets
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
598 :type 'directory)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
599
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
600 (defcustom widget-image-enable t
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
601 "If non nil, use image buttons in widgets when available."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
602 :version "21.1"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
603 :group 'widgets
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
604 :type 'boolean)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
605
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
606 (defcustom widget-image-conversion
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
607 '((xpm ".xpm") (gif ".gif") (png ".png") (jpeg ".jpg" ".jpeg")
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
608 (xbm ".xbm"))
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
609 "Conversion alist from image formats to file name suffixes."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
610 :group 'widgets
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
611 :type '(repeat (cons :format "%v"
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
612 (symbol :tag "Image Format" unknown)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
613 (repeat :tag "Suffixes"
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
614 (string :format "%v")))))
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
615
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
616 (defun widget-image-find (image)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
617 "Create a graphical button from IMAGE.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
618 IMAGE should either already be an image, or be a file name sans
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
619 extension (xpm, xbm, gif, jpg, or png) located in
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
620 `widget-image-directory' or otherwise where `find-image' will find it."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
621 (cond ((not (and image widget-image-enable (display-graphic-p)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
622 ;; We don't want or can't use images.
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
623 nil)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
624 ((and (consp image)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
625 (eq 'image (car image)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
626 ;; Already an image spec. Use it.
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
627 image)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
628 ((stringp image)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
629 ;; A string. Look it up in relevant directories.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
630 (let* ((load-path (cons widget-image-directory load-path))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
631 specs)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
632 (dolist (elt widget-image-conversion)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
633 (dolist (ext (cdr elt))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
634 (push (list :type (car elt) :file (concat image ext)) specs)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
635 (setq specs (nreverse specs))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
636 (find-image specs)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
637 (t
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
638 ;; Oh well.
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
639 nil)))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
640
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
641 (defvar widget-button-pressed-face 'widget-button-pressed
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
642 "Face used for pressed buttons in widgets.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
643 This exists as a variable so it can be set locally in certain
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
644 buffers.")
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
645
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
646 (defun widget-image-insert (widget tag image &optional down inactive)
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
647 "In WIDGET, insert the text TAG or, if supported, IMAGE.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
648 IMAGE should either be an image or an image file name sans extension
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
649 \(xpm, xbm, gif, jpg, or png) located in `widget-image-directory'.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
650
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
651 Optional arguments DOWN and INACTIVE are used instead of IMAGE when the
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
652 button is pressed or inactive, respectively. These are currently ignored."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
653 (if (and (display-graphic-p)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
654 (setq image (widget-image-find image)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
655 (progn (widget-put widget :suppress-face t)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
656 (insert-image image
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
657 (propertize
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
658 tag 'mouse-face widget-button-pressed-face)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
659 (insert tag)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
660
66171
1b475d6de39b * cus-edit.el (Custom-move-and-invoke): Deleted.
Chong Yidong <cyd@stupidchicken.com>
parents: 66170
diff changeset
661 (defun widget-move-and-invoke (event)
1b475d6de39b * cus-edit.el (Custom-move-and-invoke): Deleted.
Chong Yidong <cyd@stupidchicken.com>
parents: 66170
diff changeset
662 "Move to where you click, and if it is an active field, invoke it."
1b475d6de39b * cus-edit.el (Custom-move-and-invoke): Deleted.
Chong Yidong <cyd@stupidchicken.com>
parents: 66170
diff changeset
663 (interactive "e")
1b475d6de39b * cus-edit.el (Custom-move-and-invoke): Deleted.
Chong Yidong <cyd@stupidchicken.com>
parents: 66170
diff changeset
664 (mouse-set-point event)
66336
d9a2701e02cd * cus-edit.el (custom-button, custom-button-pressed): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 66171
diff changeset
665 (let ((pos (widget-event-point event)))
d9a2701e02cd * cus-edit.el (custom-button, custom-button-pressed): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 66171
diff changeset
666 (if (and pos (get-char-property pos 'button))
d9a2701e02cd * cus-edit.el (custom-button, custom-button-pressed): New vars.
Chong Yidong <cyd@stupidchicken.com>
parents: 66171
diff changeset
667 (widget-button-click event))))
66171
1b475d6de39b * cus-edit.el (Custom-move-and-invoke): Deleted.
Chong Yidong <cyd@stupidchicken.com>
parents: 66170
diff changeset
668
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
669 ;;; Buttons.
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
670
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
671 (defgroup widget-button nil
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
672 "The look of various kinds of buttons."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
673 :group 'widgets)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
674
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
675 (defcustom widget-button-prefix ""
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
676 "String used as prefix for buttons."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
677 :type 'string
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
678 :group 'widget-button)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
679
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
680 (defcustom widget-button-suffix ""
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
681 "String used as suffix for buttons."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
682 :type 'string
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
683 :group 'widget-button)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
684
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
685 ;;; Creating Widgets.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
686
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
687 ;;;###autoload
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
688 (defun widget-create (type &rest args)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
689 "Create widget of TYPE.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
690 The optional ARGS are additional keyword arguments."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
691 (let ((widget (apply 'widget-convert type args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
692 (widget-apply widget :create)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
693 widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
694
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
695 (defun widget-create-child-and-convert (parent type &rest args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
696 "As part of the widget PARENT, create a child widget TYPE.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
697 The child is converted, using the keyword arguments ARGS."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
698 (let ((widget (apply 'widget-convert type args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
699 (widget-put widget :parent parent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
700 (unless (widget-get widget :indent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
701 (widget-put widget :indent (+ (or (widget-get parent :indent) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
702 (or (widget-get widget :extra-offset) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
703 (widget-get parent :offset))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
704 (widget-apply widget :create)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
705 widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
706
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
707 (defun widget-create-child (parent type)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
708 "Create widget of TYPE."
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
709 (let ((widget (widget-copy type)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
710 (widget-put widget :parent parent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
711 (unless (widget-get widget :indent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
712 (widget-put widget :indent (+ (or (widget-get parent :indent) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
713 (or (widget-get widget :extra-offset) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
714 (widget-get parent :offset))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
715 (widget-apply widget :create)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
716 widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
717
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
718 (defun widget-create-child-value (parent type value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
719 "Create widget of TYPE with value VALUE."
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
720 (let ((widget (widget-copy type)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
721 (widget-put widget :value (widget-apply widget :value-to-internal value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
722 (widget-put widget :parent parent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
723 (unless (widget-get widget :indent)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
724 (widget-put widget :indent (+ (or (widget-get parent :indent) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
725 (or (widget-get widget :extra-offset) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
726 (widget-get parent :offset))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
727 (widget-apply widget :create)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
728 widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
729
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
730 ;;;###autoload
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
731 (defun widget-delete (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
732 "Delete WIDGET."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
733 (widget-apply widget :delete))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
734
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
735 (defun widget-copy (widget)
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
736 "Make a deep copy of WIDGET."
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
737 (widget-apply (copy-sequence widget) :copy))
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
738
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
739 (defun widget-convert (type &rest args)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
740 "Convert TYPE to a widget without inserting it in the buffer.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
741 The optional ARGS are additional keyword arguments."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
742 ;; Don't touch the type.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
743 (let* ((widget (if (symbolp type)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
744 (list type)
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
745 (copy-sequence type)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
746 (current widget)
46644
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
747 done
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
748 (keys args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
749 ;; First set the :args keyword.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
750 (while (cdr current) ;Look in the type.
46644
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
751 (if (and (keywordp (cadr current))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
752 ;; If the last element is a keyword,
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
753 ;; it is still the :args element,
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
754 ;; even though it is a keyword.
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
755 (cddr current))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
756 (if (eq (cadr current) :args)
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
757 ;; If :args is explicitly specified, obey it.
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
758 (setq current nil)
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
759 ;; Some other irrelevant keyword.
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
760 (setq current (cdr (cdr current))))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
761 (setcdr current (list :args (cdr current)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
762 (setq current nil)))
46644
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
763 (while (and args (not done)) ;Look in ARGS.
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
764 (cond ((eq (car args) :args)
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
765 ;; Handle explicit specification of :args.
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
766 (setq args (cadr args)
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
767 done t))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
768 ((keywordp (car args))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
769 (setq args (cddr args)))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
770 (t (setq done t))))
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
771 (when done
0bbb6f2a6ddb (widget-convert): Handle an argument that's a keyword.
Richard M. Stallman <rms@gnu.org>
parents: 46581
diff changeset
772 (widget-put widget :args args))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
773 ;; Then Convert the widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
774 (setq type widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
775 (while type
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
776 (let ((convert-widget (plist-get (cdr type) :convert-widget)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
777 (if convert-widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
778 (setq widget (funcall convert-widget widget))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
779 (setq type (get (car type) 'widget-type)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
780 ;; Finally set the keyword args.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
781 (while keys
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
782 (let ((next (nth 0 keys)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
783 (if (keywordp next)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
784 (progn
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
785 (widget-put widget next (nth 1 keys))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
786 (setq keys (nthcdr 2 keys)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
787 (setq keys nil))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
788 ;; Convert the :value to internal format.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
789 (if (widget-member widget :value)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
790 (widget-put widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
791 :value (widget-apply widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
792 :value-to-internal
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
793 (widget-get widget :value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
794 ;; Return the newly create widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
795 widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
796
43295
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
797 ;;;###autoload
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
798 (defun widget-insert (&rest args)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
799 "Call `insert' with ARGS even if surrounding text is read only."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
800 (let ((inhibit-read-only t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
801 (inhibit-modification-hooks t))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
802 (apply 'insert args)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
803
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
804 (defun widget-convert-text (type from to
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
805 &optional button-from button-to
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
806 &rest args)
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
807 "Return a widget of type TYPE with endpoint FROM TO.
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
808 No text will be inserted to the buffer, instead the text between FROM
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
809 and TO will be used as the widgets end points. If optional arguments
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
810 BUTTON-FROM and BUTTON-TO are given, these will be used as the widgets
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
811 button end points.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
812 Optional ARGS are extra keyword arguments for TYPE."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
813 (let ((widget (apply 'widget-convert type :delete 'widget-leave-text args))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
814 (from (copy-marker from))
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
815 (to (copy-marker to)))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
816 (set-marker-insertion-type from t)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
817 (set-marker-insertion-type to nil)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
818 (widget-put widget :from from)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
819 (widget-put widget :to to)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
820 (when button-from
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
821 (widget-specify-button widget button-from button-to))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
822 widget))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
823
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
824 (defun widget-convert-button (type from to &rest args)
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
825 "Return a widget of type TYPE with endpoint FROM TO.
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
826 Optional ARGS are extra keyword arguments for TYPE.
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
827 No text will be inserted to the buffer, instead the text between FROM
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
828 and TO will be used as the widgets end points, as well as the widgets
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
829 button end points."
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
830 (apply 'widget-convert-text type from to from to args))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
831
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
832 (defun widget-leave-text (widget)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
833 "Remove markers and overlays from WIDGET and its children."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
834 (let ((button (widget-get widget :button-overlay))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
835 (sample (widget-get widget :sample-overlay))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
836 (doc (widget-get widget :doc-overlay))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
837 (field (widget-get widget :field-overlay)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
838 (set-marker (widget-get widget :from) nil)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
839 (set-marker (widget-get widget :to) nil)
18338
e15d8860f504 Don't delete nil overlays.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18337
diff changeset
840 (when button
e15d8860f504 Don't delete nil overlays.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18337
diff changeset
841 (delete-overlay button))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
842 (when sample
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
843 (delete-overlay sample))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
844 (when doc
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
845 (delete-overlay doc))
18338
e15d8860f504 Don't delete nil overlays.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18337
diff changeset
846 (when field
e15d8860f504 Don't delete nil overlays.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18337
diff changeset
847 (delete-overlay field))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
848 (mapc 'widget-leave-text (widget-get widget :children))))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
849
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
850 ;;; Keymap and Commands.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
851
43295
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
852 ;;;###autoload
68405
3f56050552c3 (advertised-widget-backward): New alias.
Richard M. Stallman <rms@gnu.org>
parents: 68180
diff changeset
853 (defalias 'advertised-widget-backward 'widget-backward)
3f56050552c3 (advertised-widget-backward): New alias.
Richard M. Stallman <rms@gnu.org>
parents: 68180
diff changeset
854
3f56050552c3 (advertised-widget-backward): New alias.
Richard M. Stallman <rms@gnu.org>
parents: 68180
diff changeset
855 ;;;###autoload
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
856 (defvar widget-keymap
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
857 (let ((map (make-sparse-keymap)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
858 (define-key map "\t" 'widget-forward)
67376
a57102d7cc7e (widget-keymap): Bind M-TAB to `widget-backward'.
Juri Linkov <juri@jurta.org>
parents: 66942
diff changeset
859 (define-key map "\e\t" 'widget-backward)
68405
3f56050552c3 (advertised-widget-backward): New alias.
Richard M. Stallman <rms@gnu.org>
parents: 68180
diff changeset
860 (define-key map [(shift tab)] 'advertised-widget-backward)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
861 (define-key map [backtab] 'widget-backward)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
862 (define-key map [down-mouse-2] 'widget-button-click)
68911
f484ff9069d6 * wid-edit.el (widget-keymap): Bind down-mouse-1 to
Chong Yidong <cyd@stupidchicken.com>
parents: 68892
diff changeset
863 (define-key map [down-mouse-1] 'widget-button-click)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
864 (define-key map "\C-m" 'widget-button-press)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
865 map)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
866 "Keymap containing useful binding for buffers containing widgets.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
867 Recommended as a parent keymap for modes using widgets.")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
868
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
869 (defvar widget-global-map global-map
32861
Dave Love <fx@gnu.org>
parents: 32855
diff changeset
870 "Keymap used for events a widget does not handle itself.")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
871 (make-variable-buffer-local 'widget-global-map)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
872
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
873 (defvar widget-field-keymap
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
874 (let ((map (copy-keymap widget-keymap)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
875 (define-key map "\C-k" 'widget-kill-line)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
876 (define-key map "\M-\t" 'widget-complete)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
877 (define-key map "\C-m" 'widget-field-activate)
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
878 ;; Since the widget code uses a `field' property to identify fields,
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
879 ;; ordinary beginning-of-line does the right thing.
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
880 ;; (define-key map "\C-a" 'widget-beginning-of-line)
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
881 (define-key map "\C-e" 'widget-end-of-line)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
882 map)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
883 "Keymap used inside an editable field.")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
884
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
885 (defvar widget-text-keymap
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
886 (let ((map (copy-keymap widget-keymap)))
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
887 ;; Since the widget code uses a `field' property to identify fields,
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
888 ;; ordinary beginning-of-line does the right thing.
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
889 ;; (define-key map "\C-a" 'widget-beginning-of-line)
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
890 (define-key map "\C-e" 'widget-end-of-line)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
891 map)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
892 "Keymap used inside a text field.")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
893
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
894 (defun widget-field-activate (pos &optional event)
34294
5e3fcfc24d23 (widget-text-keymap): Doc fix.
Dave Love <fx@gnu.org>
parents: 33934
diff changeset
895 "Invoke the editable field at point."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
896 (interactive "@d")
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
897 (let ((field (widget-field-at pos)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
898 (if field
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
899 (widget-apply-action field event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
900 (call-interactively
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
901 (lookup-key widget-global-map (this-command-keys))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
902
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
903 (defface widget-button-pressed
61394
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 61308
diff changeset
904 '((((min-colors 88) (class color))
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 61308
diff changeset
905 (:foreground "red1"))
31aa9a390538 * mh-customize.el (mh-speedbar-selected-folder-face): Special case
Dan Nicolaescu <dann@ics.uci.edu>
parents: 61308
diff changeset
906 (((class color))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
907 (:foreground "red"))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
908 (t
42452
0cfd64a10789 (ps-font-lock-face-attributes): Use :weight and :slant.
Richard M. Stallman <rms@gnu.org>
parents: 42355
diff changeset
909 (:weight bold :underline t)))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
910 "Face used for pressed buttons."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
911 :group 'widget-faces)
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
912 ;; backward-compatibility alias
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
913 (put 'widget-button-pressed-face 'face-alias 'widget-button-pressed)
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
914
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
915 (defun widget-button-click (event)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
916 "Invoke the button that the mouse is pointing at."
41763
541b53a03028 (widget-button-click): Don't move point permanently:
Richard M. Stallman <rms@gnu.org>
parents: 41605
diff changeset
917 (interactive "e")
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
918 (if (widget-event-point event)
68935
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
919 (let* ((oevent event)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
920 (mouse-1 (memq (event-basic-type event) '(mouse-1 down-mouse-1)))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
921 (pos (widget-event-point event))
41763
541b53a03028 (widget-button-click): Don't move point permanently:
Richard M. Stallman <rms@gnu.org>
parents: 41605
diff changeset
922 (start (event-start event))
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
923 (button (get-char-property
41763
541b53a03028 (widget-button-click): Don't move point permanently:
Richard M. Stallman <rms@gnu.org>
parents: 41605
diff changeset
924 pos 'button (and (windowp (posn-window start))
541b53a03028 (widget-button-click): Don't move point permanently:
Richard M. Stallman <rms@gnu.org>
parents: 41605
diff changeset
925 (window-buffer (posn-window start))))))
68935
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
926 (when (or (null button)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
927 (catch 'button-press-cancelled
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
928 ;; Mouse click on a widget button. Do the following
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
929 ;; in a save-excursion so that the click on the button
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
930 ;; doesn't change point.
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
931 (save-selected-window
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
932 (select-window (posn-window (event-start event)))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
933 (save-excursion
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
934 (goto-char (posn-point (event-start event)))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
935 (let* ((overlay (widget-get button :button-overlay))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
936 (pressed-face (or (widget-get button :pressed-face)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
937 widget-button-pressed-face))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
938 (face (overlay-get overlay 'face))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
939 (mouse-face (overlay-get overlay 'mouse-face)))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
940 (unwind-protect
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
941 ;; Read events, including mouse-movement
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
942 ;; events, waiting for a release event. If we
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
943 ;; began with a mouse-1 event and receive a
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
944 ;; movement event, that means the user wants
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
945 ;; to perform drag-selection, so cancel the
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
946 ;; button press and do the default mouse-1
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
947 ;; action. For mouse-2, just highlight/
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
948 ;; unhighlight the button the mouse was
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
949 ;; initially on when we move over it.
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
950 (save-excursion
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
951 (when face ; avoid changing around image
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
952 (overlay-put overlay 'face pressed-face)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
953 (overlay-put overlay 'mouse-face pressed-face))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
954 (unless (widget-apply button :mouse-down-action event)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
955 (let ((track-mouse t))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
956 (while (not (widget-button-release-event-p event))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
957 (setq event (read-event))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
958 (when (and mouse-1 (mouse-movement-p event))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
959 (push event unread-command-events)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
960 (setq event oevent)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
961 (throw 'button-press-cancelled t))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
962 (setq pos (widget-event-point event))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
963 (if (and pos
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
964 (eq (get-char-property pos 'button)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
965 button))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
966 (when face
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
967 (overlay-put overlay 'face pressed-face)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
968 (overlay-put overlay 'mouse-face pressed-face))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
969 (overlay-put overlay 'face face)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
970 (overlay-put overlay 'mouse-face mouse-face)))))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
971
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
972 ;; When mouse is released over the button, run
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
973 ;; its action function.
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
974 (when (and pos
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
975 (eq (get-char-property pos 'button) button))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
976 (widget-apply-action button event)))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
977 (overlay-put overlay 'face face)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
978 (overlay-put overlay 'mouse-face mouse-face))))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
979
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
980 ;; This loses if the widget action switches windows. -- cyd
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
981 ;; (unless (pos-visible-in-window-p (widget-event-point event))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
982 ;; (mouse-set-point event)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
983 ;; (beginning-of-line)
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
984 ;; (recenter))
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
985 )
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
986 nil))
63757
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
987 (let ((up t) command)
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
988 ;; Mouse click not on a widget button. Find the global
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
989 ;; command to run, and check whether it is bound to an
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
990 ;; up event.
68935
bb4dc0e56e88 * wid-edit.el (widget-button-click): For mouse-1, cancel button
Chong Yidong <cyd@stupidchicken.com>
parents: 68911
diff changeset
991 (if mouse-1
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
992 (cond ((setq command ;down event
63757
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
993 (lookup-key widget-global-map [down-mouse-1]))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
994 (setq up nil))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
995 ((setq command ;up event
63757
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
996 (lookup-key widget-global-map [mouse-1]))))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
997 (cond ((setq command ;down event
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
998 (lookup-key widget-global-map [down-mouse-2]))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
999 (setq up nil))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1000 ((setq command ;up event
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1001 (lookup-key widget-global-map [mouse-2])))))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1002 (when up
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1003 ;; Don't execute up events twice.
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1004 (while (not (widget-button-release-event-p event))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1005 (setq event (read-event))))
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1006 (when command
73e0fc286df5 Fix indentation.
Richard M. Stallman <rms@gnu.org>
parents: 63193
diff changeset
1007 (call-interactively command)))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1008 (message "You clicked somewhere weird.")))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1009
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1010 (defun widget-button-press (pos &optional event)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1011 "Invoke button at POS."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1012 (interactive "@d")
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1013 (let ((button (get-char-property pos 'button)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1014 (if button
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1015 (widget-apply-action button event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1016 (let ((command (lookup-key widget-global-map (this-command-keys))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1017 (when (commandp command)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1018 (call-interactively command))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1019
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1020 (defun widget-tabable-at (&optional pos)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1021 "Return the tabable widget at POS, or nil.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1022 POS defaults to the value of (point)."
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1023 (let ((widget (widget-at pos)))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1024 (if widget
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1025 (let ((order (widget-get widget :tab-order)))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1026 (if order
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1027 (if (>= order 0)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1028 widget)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1029 widget)))))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1030
24978
ba243531aa37 (widget-use-overlay-change): Uncustomize and make it unconditionally t.
Dave Love <fx@gnu.org>
parents: 24532
diff changeset
1031 (defvar widget-use-overlay-change t
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1032 "If non-nil, use overlay change functions to tab around in the buffer.
24978
ba243531aa37 (widget-use-overlay-change): Uncustomize and make it unconditionally t.
Dave Love <fx@gnu.org>
parents: 24532
diff changeset
1033 This is much faster, but doesn't work reliably on Emacs 19.34.")
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1034
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1035 (defun widget-move (arg)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1036 "Move point to the ARG next field or button.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1037 ARG may be negative to move backward."
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1038 (or (bobp) (> arg 0) (backward-char))
48842
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1039 (let ((wrapped 0)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1040 (number arg)
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
1041 (old (widget-tabable-at)))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1042 ;; Forward.
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1043 (while (> arg 0)
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1044 (cond ((eobp)
48842
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1045 (goto-char (point-min))
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1046 (setq wrapped (1+ wrapped)))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1047 (widget-use-overlay-change
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1048 (goto-char (next-overlay-change (point))))
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1049 (t
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1050 (forward-char 1)))
48842
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1051 (and (= wrapped 2)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1052 (eq arg number)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1053 (error "No buttons or fields found"))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1054 (let ((new (widget-tabable-at)))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1055 (when new
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1056 (unless (eq new old)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1057 (setq arg (1- arg))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1058 (setq old new)))))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1059 ;; Backward.
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1060 (while (< arg 0)
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1061 (cond ((bobp)
48842
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1062 (goto-char (point-max))
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1063 (setq wrapped (1+ wrapped)))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1064 (widget-use-overlay-change
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1065 (goto-char (previous-overlay-change (point))))
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1066 (t
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1067 (backward-char 1)))
48842
66dc7b1b4b00 (widget-move): Don't loop infinitely when there is
Andreas Schwab <schwab@suse.de>
parents: 48707
diff changeset
1068 (and (= wrapped 2)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1069 (eq arg number)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1070 (error "No buttons or fields found"))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1071 (let ((new (widget-tabable-at)))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1072 (when new
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1073 (unless (eq new old)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1074 (setq arg (1+ arg))))))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1075 (let ((new (widget-tabable-at)))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1076 (while (eq (widget-tabable-at) new)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1077 (backward-char)))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1078 (forward-char))
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1079 (widget-echo-help (point))
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1080 (run-hooks 'widget-move-hook))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1081
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1082 (defun widget-forward (arg)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1083 "Move point to the next field or button.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1084 With optional ARG, move across that many fields."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1085 (interactive "p")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1086 (run-hooks 'widget-forward-hook)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1087 (widget-move arg))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1088
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1089 (defun widget-backward (arg)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1090 "Move point to the previous field or button.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1091 With optional ARG, move across that many fields."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1092 (interactive "p")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1093 (run-hooks 'widget-backward-hook)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1094 (widget-move (- arg)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1095
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
1096 ;; Since the widget code uses a `field' property to identify fields,
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1097 ;; ordinary beginning-of-line does the right thing.
32853
3410d8818561 (widget-beginning-of-line, widget-end-of-line):
Miles Bader <miles@gnu.org>
parents: 32817
diff changeset
1098 (defalias 'widget-beginning-of-line 'beginning-of-line)
33171
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1099
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1100 (defun widget-end-of-line ()
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1101 "Go to end of field or end of line, whichever is first.
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1102 Trailing spaces at the end of padded fields are not considered part of
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1103 the field."
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1104 (interactive)
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1105 ;; Ordinary end-of-line does the right thing, because we're inside
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1106 ;; text with a `field' property.
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1107 (end-of-line)
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1108 (unless (eolp)
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1109 ;; ... except that we want to ignore trailing spaces in fields that
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1110 ;; aren't terminated by a newline, because they are used as padding,
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1111 ;; and ignored when extracting the entered value of the field.
eb486d535fd8 (widget-end-of-line): Reinstate, with a new definition, so that trailing
Miles Bader <miles@gnu.org>
parents: 32935
diff changeset
1112 (skip-chars-backward " " (field-beginning (1- (point))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1113
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1114 (defun widget-kill-line ()
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1115 "Kill to end of field or end of line, whichever is first."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1116 (interactive)
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1117 (let* ((field (widget-field-find (point)))
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1118 (end (and field (widget-field-end field))))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1119 (if (and field (> (line-beginning-position 2) end))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1120 (kill-region (point) end)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1121 (call-interactively 'kill-line))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1122
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1123 (defcustom widget-complete-field (lookup-key global-map "\M-\t")
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1124 "Default function to call for completion inside fields."
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1125 :options '(ispell-complete-word complete-tag lisp-complete-symbol)
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1126 :type 'function
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1127 :group 'widgets)
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1128
58578
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1129 (defun widget-narrow-to-field ()
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1130 "Narrow to field."
58578
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1131 (interactive)
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1132 (let ((field (widget-field-find (point))))
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1133 (if field
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1134 (narrow-to-region (line-beginning-position) (line-end-position)))))
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1135
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1136 (defun widget-complete ()
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1137 "Complete content of editable field from point.
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1138 When not inside a field, move to the previous button or field."
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1139 (interactive)
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1140 (let ((field (widget-field-find (point))))
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1141 (if field
58578
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1142 (save-restriction
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1143 (widget-narrow-to-field)
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1144 (widget-apply field :complete))
3b4942fd58d8 (widget-narrow-to-field): New function.
Eli Zaretskii <eliz@gnu.org>
parents: 56628
diff changeset
1145 (error "Not in an editable field"))))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1146
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1147 ;;; Setting up the buffer.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1148
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
1149 (defvar widget-field-new nil
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
1150 "List of all newly created editable fields in the buffer.")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1151 (make-variable-buffer-local 'widget-field-new)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1152
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
1153 (defvar widget-field-list nil
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
1154 "List of all editable fields in the buffer.")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1155 (make-variable-buffer-local 'widget-field-list)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1156
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1157 (defun widget-at (&optional pos)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1158 "The button or field at POS (default, point)."
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1159 (or (get-char-property (or pos (point)) 'button)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1160 (widget-field-at pos)))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1161
43295
ce2590f06ba0 2002-02-14 Per Abrahamsen <abraham@dina.kvl.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 42452
diff changeset
1162 ;;;###autoload
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1163 (defun widget-setup ()
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1164 "Setup current buffer so editing string widgets works."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1165 (let ((inhibit-read-only t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1166 (inhibit-modification-hooks t)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1167 field)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1168 (while widget-field-new
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1169 (setq field (car widget-field-new)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1170 widget-field-new (cdr widget-field-new)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1171 widget-field-list (cons field widget-field-list))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1172 (let ((from (car (widget-get field :field-overlay)))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1173 (to (cdr (widget-get field :field-overlay))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1174 (widget-specify-field field
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1175 (marker-position from) (marker-position to))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1176 (set-marker from nil)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1177 (set-marker to nil))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1178 (widget-clear-undo)
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1179 (widget-add-change))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1180
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1181 (defvar widget-field-last nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1182 ;; Last field containing point.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1183 (make-variable-buffer-local 'widget-field-last)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1184
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1185 (defvar widget-field-was nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1186 ;; The widget data before the change.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1187 (make-variable-buffer-local 'widget-field-was)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1188
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1189 (defun widget-field-at (pos)
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1190 "Return the widget field at POS, or nil if none."
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1191 (let ((field (get-char-property (or pos (point)) 'field)))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1192 (if (eq field 'boundary)
58766
4b3cfed7370f (widget-specify-field): Add `real-field' property to boundary.
Richard M. Stallman <rms@gnu.org>
parents: 58578
diff changeset
1193 (get-char-property (or pos (point)) 'real-field)
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1194 field)))
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1195
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1196 (defun widget-field-buffer (widget)
56384
21a47f89c6f6 (widget-field-buffer): Doc fix.
Lars Hansen <larsh@soem.dk>
parents: 55984
diff changeset
1197 "Return the buffer of WIDGET's editing field."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1198 (let ((overlay (widget-get widget :field-overlay)))
33893
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1199 (cond ((overlayp overlay)
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1200 (overlay-buffer overlay))
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1201 ((consp overlay)
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1202 (marker-buffer (car overlay))))))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1203
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1204 (defun widget-field-start (widget)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1205 "Return the start of WIDGET's editing field."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1206 (let ((overlay (widget-get widget :field-overlay)))
33893
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1207 (if (overlayp overlay)
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1208 (overlay-start overlay)
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1209 (car overlay))))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1210
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1211 (defun widget-field-end (widget)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1212 "Return the end of WIDGET's editing field."
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1213 (let ((overlay (widget-get widget :field-overlay)))
32855
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1214 ;; Don't subtract one if local-map works at the end of the overlay,
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1215 ;; or if a special `boundary' field has been added after the widget
9e73952fac8c (widget-field-at): New function.
Miles Bader <miles@gnu.org>
parents: 32853
diff changeset
1216 ;; field.
33893
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1217 (if (overlayp overlay)
68180
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1218 ;; Don't proceed if overlay has been removed from buffer.
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1219 (when (overlay-buffer overlay)
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1220 (if (and (not (eq (with-current-buffer
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1221 (widget-field-buffer widget)
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1222 (save-restriction
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1223 ;; `widget-narrow-to-field' can be
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1224 ;; active when this function is called
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1225 ;; from an change-functions hook. So
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1226 ;; temporarily remove field narrowing
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1227 ;; before to call `get-char-property'.
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1228 (widen)
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1229 (get-char-property (overlay-end overlay)
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1230 'field)))
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1231 'boundary))
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1232 (or widget-field-add-space
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1233 (null (widget-get widget :size))))
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1234 (1- (overlay-end overlay))
ca3d61094d2b (widget-field-end): If the overlay is no longer associated with a buffer,
Eli Zaretskii <eliz@gnu.org>
parents: 68020
diff changeset
1235 (overlay-end overlay)))
33893
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1236 (cdr overlay))))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1237
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1238 (defun widget-field-find (pos)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1239 "Return the field at POS.
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1240 Unlike (get-char-property POS 'field), this works with empty fields too."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1241 (let ((fields widget-field-list)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1242 field found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1243 (while fields
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1244 (setq field (car fields)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1245 fields (cdr fields))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1246 (when (and (<= (widget-field-start field) pos)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1247 (<= pos (widget-field-end field)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1248 (when found
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1249 (error "Overlapping fields"))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1250 (setq found field)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1251 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1252
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1253 (defun widget-before-change (from to)
18364
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
1254 ;; This is how, for example, a variable changes its state to `modified'.
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
1255 ;; when it is being edited.
19357
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1256 (unless inhibit-read-only
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1257 (let ((from-field (widget-field-find from))
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1258 (to-field (widget-field-find to)))
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1259 (cond ((not (eq from-field to-field))
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1260 (add-hook 'post-command-hook 'widget-add-change nil t)
24532
731dcf8c11dc (widget-before-change): Signal text-read-only rather
Karl Heuer <kwzh@gnu.org>
parents: 24317
diff changeset
1261 (signal 'text-read-only
731dcf8c11dc (widget-before-change): Signal text-read-only rather
Karl Heuer <kwzh@gnu.org>
parents: 24317
diff changeset
1262 '("Change should be restricted to a single field")))
19357
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1263 ((null from-field)
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1264 (add-hook 'post-command-hook 'widget-add-change nil t)
24532
731dcf8c11dc (widget-before-change): Signal text-read-only rather
Karl Heuer <kwzh@gnu.org>
parents: 24317
diff changeset
1265 (signal 'text-read-only
731dcf8c11dc (widget-before-change): Signal text-read-only rather
Karl Heuer <kwzh@gnu.org>
parents: 24317
diff changeset
1266 '("Attempt to change text outside editable field")))
19357
e2131e9d3bf6 (widget-before-change): Obey `inhibit-read-only'.
Richard M. Stallman <rms@gnu.org>
parents: 19256
diff changeset
1267 (widget-field-use-before-change
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1268 (widget-apply from-field :notify from-field))))))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1269
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1270 (defun widget-add-change ()
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1271 (remove-hook 'post-command-hook 'widget-add-change t)
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1272 (add-hook 'before-change-functions 'widget-before-change nil t)
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1273 (add-hook 'after-change-functions 'widget-after-change nil t))
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
1274
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1275 (defun widget-after-change (from to old)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1276 "Adjust field size and text properties."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1277 (let ((field (widget-field-find from))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1278 (other (widget-field-find to)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1279 (when field
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1280 (unless (eq field other)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1281 (error "Change in different fields"))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1282 (let ((size (widget-get field :size)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1283 (when size
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1284 (let ((begin (widget-field-start field))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1285 (end (widget-field-end field)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1286 (cond ((< (- end begin) size)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1287 ;; Field too small.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1288 (save-excursion
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1289 (goto-char end)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1290 (insert-char ?\s (- (+ begin size) end))))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1291 ((> (- end begin) size)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1292 ;; Field too large and
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1293 (if (or (< (point) (+ begin size))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1294 (> (point) end))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1295 ;; Point is outside extra space.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1296 (setq begin (+ begin size))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1297 ;; Point is within the extra space.
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1298 (setq begin (point)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1299 (save-excursion
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1300 (goto-char end)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1301 (while (and (eq (preceding-char) ?\s)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1302 (> (point) begin))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1303 (delete-backward-char 1)))))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1304 (widget-specify-secret field))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1305 (widget-apply field :notify field))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1306
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1307 ;;; Widget Functions
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1308 ;;
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1309 ;; These functions are used in the definition of multiple widgets.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1310
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1311 (defun widget-parent-action (widget &optional event)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1312 "Tell :parent of WIDGET to handle the :action.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1313 Optional EVENT is the event that triggered the action."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1314 (widget-apply (widget-get widget :parent) :action event))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1315
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1316 (defun widget-children-value-delete (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1317 "Delete all :children and :buttons in WIDGET."
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1318 (mapc 'widget-delete (widget-get widget :children))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1319 (widget-put widget :children nil)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1320 (mapc 'widget-delete (widget-get widget :buttons))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1321 (widget-put widget :buttons nil))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1322
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1323 (defun widget-children-validate (widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1324 "All the :children must be valid."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1325 (let ((children (widget-get widget :children))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1326 child found)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1327 (while (and children (not found))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1328 (setq child (car children)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1329 children (cdr children)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1330 found (widget-apply child :validate)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1331 found))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1332
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1333 (defun widget-child-value-get (widget)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1334 "Get the value of the first member of :children in WIDGET."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1335 (widget-value (car (widget-get widget :children))))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1336
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1337 (defun widget-child-value-inline (widget)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1338 "Get the inline value of the first member of :children in WIDGET."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1339 (widget-apply (car (widget-get widget :children)) :value-inline))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1340
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1341 (defun widget-child-validate (widget)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1342 "The result of validating the first member of :children in WIDGET."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1343 (widget-apply (car (widget-get widget :children)) :validate))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1344
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1345 (defun widget-type-value-create (widget)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1346 "Convert and instantiate the value of the :type attribute of WIDGET.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1347 Store the newly created widget in the :children attribute.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1348
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1349 The value of the :type attribute should be an unconverted widget type."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1350 (let ((value (widget-get widget :value))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1351 (type (widget-get widget :type)))
55984
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
1352 (widget-put widget :children
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
1353 (list (widget-create-child-value widget
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1354 (widget-convert type)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1355 value)))))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1356
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1357 (defun widget-type-default-get (widget)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1358 "Get default value from the :type attribute of WIDGET.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1359
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1360 The value of the :type attribute should be an unconverted widget type."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1361 (widget-default-get (widget-convert (widget-get widget :type))))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1362
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1363 (defun widget-type-match (widget value)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1364 "Non-nil if the :type value of WIDGET matches VALUE.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1365
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1366 The value of the :type attribute should be an unconverted widget type."
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1367 (widget-apply (widget-convert (widget-get widget :type)) :match value))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1368
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1369 (defun widget-types-copy (widget)
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1370 "Copy :args as widget types in WIDGET."
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1371 (widget-put widget :args (mapcar 'widget-copy (widget-get widget :args)))
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1372 widget)
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1373
30246
e99b2e89fa59 (widget-specify-field, widget-specify-button): Allow
Dave Love <fx@gnu.org>
parents: 29954
diff changeset
1374 ;; Made defsubst to speed up face editor creation.
e99b2e89fa59 (widget-specify-field, widget-specify-button): Allow
Dave Love <fx@gnu.org>
parents: 29954
diff changeset
1375 (defsubst widget-types-convert-widget (widget)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1376 "Convert :args as widget types in WIDGET."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1377 (widget-put widget :args (mapcar 'widget-convert (widget-get widget :args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1378 widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1379
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1380 (defun widget-value-convert-widget (widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1381 "Initialize :value from :args in WIDGET."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1382 (let ((args (widget-get widget :args)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1383 (when args
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1384 (widget-put widget :value (car args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1385 ;; Don't convert :value here, as this is done in `widget-convert'.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1386 ;; (widget-put widget :value (widget-apply widget
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1387 ;; :value-to-internal (car args)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1388 (widget-put widget :args nil)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1389 widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1390
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1391 (defun widget-value-value-get (widget)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1392 "Return the :value property of WIDGET."
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1393 (widget-get widget :value))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1394
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1395 ;;; The `default' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1396
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1397 (define-widget 'default nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1398 "Basic widget other widgets are derived from."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1399 :value-to-internal (lambda (widget value) value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1400 :value-to-external (lambda (widget value) value)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1401 :button-prefix 'widget-button-prefix
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1402 :button-suffix 'widget-button-suffix
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1403 :complete 'widget-default-complete
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1404 :create 'widget-default-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1405 :indent nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1406 :offset 0
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1407 :format-handler 'widget-default-format-handler
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
1408 :button-face-get 'widget-default-button-face-get
68020
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1409 :mouse-face-get 'widget-default-mouse-face-get
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
1410 :sample-face-get 'widget-default-sample-face-get
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1411 :delete 'widget-default-delete
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1412 :copy 'identity
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1413 :value-set 'widget-default-value-set
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1414 :value-inline 'widget-default-value-inline
53495
15266cc5ed84 Fix dec-8 bug
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 53319
diff changeset
1415 :value-delete 'ignore
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
1416 :default-get 'widget-default-default-get
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1417 :menu-tag-get 'widget-default-menu-tag-get
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
1418 :validate #'ignore
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1419 :active 'widget-default-active
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1420 :activate 'widget-specify-active
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1421 :deactivate 'widget-default-deactivate
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
1422 :mouse-down-action #'ignore
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1423 :action 'widget-default-action
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1424 :notify 'widget-default-notify
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1425 :prompt-value 'widget-default-prompt-value)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1426
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1427 (defun widget-default-complete (widget)
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1428 "Call the value of the :complete-function property of WIDGET.
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1429 If that does not exists, call the value of `widget-complete-field'."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1430 (call-interactively (or (widget-get widget :complete-function)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1431 widget-complete-field)))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
1432
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1433 (defun widget-default-create (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1434 "Create WIDGET at point in the current buffer."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1435 (widget-specify-insert
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1436 (let ((from (point))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1437 button-begin button-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1438 sample-begin sample-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1439 doc-begin doc-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1440 value-pos)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1441 (insert (widget-get widget :format))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1442 (goto-char from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1443 ;; Parse escapes in format.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1444 (while (re-search-forward "%\\(.\\)" nil t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1445 (let ((escape (char-after (match-beginning 1))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1446 (delete-backward-char 2)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1447 (cond ((eq escape ?%)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1448 (insert ?%))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1449 ((eq escape ?\[)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1450 (setq button-begin (point))
18364
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
1451 (insert (widget-get-indirect widget :button-prefix)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1452 ((eq escape ?\])
18364
01666331d10f Synched with 1.9930.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18361
diff changeset
1453 (insert (widget-get-indirect widget :button-suffix))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1454 (setq button-end (point)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1455 ((eq escape ?\{)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1456 (setq sample-begin (point)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1457 ((eq escape ?\})
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1458 (setq sample-end (point)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1459 ((eq escape ?n)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1460 (when (widget-get widget :indent)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1461 (insert ?\n)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1462 (insert-char ?\s (widget-get widget :indent))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1463 ((eq escape ?t)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1464 (let ((image (widget-get widget :tag-glyph))
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1465 (tag (widget-get widget :tag)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1466 (cond (image
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1467 (widget-image-insert widget (or tag "image") image))
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1468 (tag
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1469 (insert tag))
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1470 (t
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1471 (princ (widget-get widget :value)
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1472 (current-buffer))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1473 ((eq escape ?d)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1474 (let ((doc (widget-get widget :doc)))
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1475 (when doc
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1476 (setq doc-begin (point))
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1477 (insert doc)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1478 (while (eq (preceding-char) ?\n)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1479 (delete-backward-char 1))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1480 (insert ?\n)
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1481 (setq doc-end (point)))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1482 ((eq escape ?v)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1483 (if (and button-begin (not button-end))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1484 (widget-apply widget :value-create)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1485 (setq value-pos (point))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1486 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1487 (widget-apply widget :format-handler escape)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1488 ;; Specify button, sample, and doc, and insert value.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1489 (and button-begin button-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1490 (widget-specify-button widget button-begin button-end))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1491 (and sample-begin sample-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1492 (widget-specify-sample widget sample-begin sample-end))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1493 (and doc-begin doc-end
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1494 (widget-specify-doc widget doc-begin doc-end))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1495 (when value-pos
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1496 (goto-char value-pos)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1497 (widget-apply widget :value-create)))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1498 (let ((from (point-min-marker))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1499 (to (point-max-marker)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1500 (set-marker-insertion-type from t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1501 (set-marker-insertion-type to nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1502 (widget-put widget :from from)
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1503 (widget-put widget :to to)))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1504 (widget-clear-undo))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1505
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1506 (defun widget-default-format-handler (widget escape)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1507 ;; We recognize the %h escape by default.
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1508 (let* ((buttons (widget-get widget :buttons)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1509 (cond ((eq escape ?h)
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1510 (let* ((doc-property (widget-get widget :documentation-property))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1511 (doc-try (cond ((widget-get widget :doc))
31578
48f674467ba6 (widget-default-format-handler): DTRT when
Dave Love <fx@gnu.org>
parents: 31361
diff changeset
1512 ((functionp doc-property)
48f674467ba6 (widget-default-format-handler): DTRT when
Dave Love <fx@gnu.org>
parents: 31361
diff changeset
1513 (funcall doc-property
48f674467ba6 (widget-default-format-handler): DTRT when
Dave Love <fx@gnu.org>
parents: 31361
diff changeset
1514 (widget-get widget :value)))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1515 ((symbolp doc-property)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1516 (documentation-property
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1517 (widget-get widget :value)
31578
48f674467ba6 (widget-default-format-handler): DTRT when
Dave Love <fx@gnu.org>
parents: 31361
diff changeset
1518 doc-property))))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1519 (doc-text (and (stringp doc-try)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1520 (> (length doc-try) 1)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1521 doc-try))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1522 (doc-indent (widget-get widget :documentation-indent)))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1523 (when doc-text
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1524 (and (eq (preceding-char) ?\n)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1525 (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1526 (insert-char ?\s (widget-get widget :indent)))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1527 ;; The `*' in the beginning is redundant.
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1528 (when (eq (aref doc-text 0) ?*)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1529 (setq doc-text (substring doc-text 1)))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1530 ;; Get rid of trailing newlines.
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1531 (when (string-match "\n+\\'" doc-text)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1532 (setq doc-text (substring doc-text 0 (match-beginning 0))))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1533 (push (widget-create-child-and-convert
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1534 widget 'documentation-string
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1535 :indent (cond ((numberp doc-indent )
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1536 doc-indent)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1537 ((null doc-indent)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1538 nil)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
1539 (t 0))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1540 doc-text)
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
1541 buttons))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1542 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1543 (error "Unknown escape `%c'" escape)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1544 (widget-put widget :buttons buttons)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1545
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1546 (defun widget-default-button-face-get (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1547 ;; Use :button-face or widget-button-face
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1548 (or (widget-get widget :button-face)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1549 (let ((parent (widget-get widget :parent)))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1550 (if parent
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1551 (widget-apply parent :button-face-get)
18572
f0c2a091d91f (color-sample, editable-color): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 18562
diff changeset
1552 widget-button-face))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1553
68020
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1554 (defun widget-default-mouse-face-get (widget)
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1555 ;; Use :mouse-face or widget-mouse-face
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1556 (or (widget-get widget :mouse-face)
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1557 (let ((parent (widget-get widget :parent)))
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1558 (if parent
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1559 (widget-apply parent :mouse-face-get)
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1560 widget-mouse-face))))
d8acae190ef7 * cus-edit.el (custom-reset-menu, custom-reset, Custom-mode-menu)
Chong Yidong <cyd@stupidchicken.com>
parents: 68005
diff changeset
1561
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1562 (defun widget-default-sample-face-get (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1563 ;; Use :sample-face.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1564 (widget-get widget :sample-face))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1565
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1566 (defun widget-default-delete (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1567 "Remove widget from the buffer."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1568 (let ((from (widget-get widget :from))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1569 (to (widget-get widget :to))
18089
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1570 (inactive-overlay (widget-get widget :inactive))
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1571 (button-overlay (widget-get widget :button-overlay))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
1572 (sample-overlay (widget-get widget :sample-overlay))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1573 (doc-overlay (widget-get widget :doc-overlay))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1574 (inhibit-modification-hooks t)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1575 (inhibit-read-only t))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1576 (widget-apply widget :value-delete)
52935
aadc87ded24c (widget-default-delete): Always delete child widgets. (From Per
Luc Teirlinck <teirllm@auburn.edu>
parents: 52401
diff changeset
1577 (widget-children-value-delete widget)
18089
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1578 (when inactive-overlay
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1579 (delete-overlay inactive-overlay))
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1580 (when button-overlay
bb0e09c8ada3 Synched with 1.9904
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18087
diff changeset
1581 (delete-overlay button-overlay))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
1582 (when sample-overlay
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
1583 (delete-overlay sample-overlay))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1584 (when doc-overlay
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1585 (delete-overlay doc-overlay))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1586 (when (< from to)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1587 ;; Kludge: this doesn't need to be true for empty formats.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1588 (delete-region from to))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1589 (set-marker from nil)
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1590 (set-marker to nil))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1591 (widget-clear-undo))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1592
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1593 (defun widget-default-value-set (widget value)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1594 "Recreate widget with new value."
18374
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1595 (let* ((old-pos (point))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1596 (from (copy-marker (widget-get widget :from)))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1597 (to (copy-marker (widget-get widget :to)))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1598 (offset (if (and (<= from old-pos) (<= old-pos to))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1599 (if (>= old-pos (1- to))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1600 (- old-pos to 1)
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1601 (- old-pos from)))))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1602 ;;??? Bug: this ought to insert the new value before deleting the old one,
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1603 ;; so that markers on either side of the value automatically
18374
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1604 ;; stay on the same side. -- rms.
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1605 (save-excursion
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1606 (goto-char (widget-get widget :from))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1607 (widget-apply widget :delete)
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1608 (widget-put widget :value value)
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1609 (widget-apply widget :create))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1610 (if offset
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1611 (if (< offset 0)
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1612 (goto-char (+ (widget-get widget :to) offset 1))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
1613 (goto-char (min (+ from offset) (1- (widget-get widget :to))))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1614
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1615 (defun widget-default-value-inline (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1616 "Wrap value in a list unless it is inline."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1617 (if (widget-get widget :inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1618 (widget-value widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1619 (list (widget-value widget))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1620
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
1621 (defun widget-default-default-get (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1622 "Get `:value'."
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
1623 (widget-get widget :value))
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
1624
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1625 (defun widget-default-menu-tag-get (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1626 "Use tag or value for menus."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1627 (or (widget-get widget :menu-tag)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1628 (widget-get widget :tag)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1629 (widget-princ-to-string (widget-get widget :value))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1630
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1631 (defun widget-default-active (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1632 "Return t iff this widget active (user modifiable)."
28780
6bc5854eef8b (widget-default-active): Obey `:always-active'.
Gerd Moellmann <gerd@gnu.org>
parents: 27711
diff changeset
1633 (or (widget-get widget :always-active)
6bc5854eef8b (widget-default-active): Obey `:always-active'.
Gerd Moellmann <gerd@gnu.org>
parents: 27711
diff changeset
1634 (and (not (widget-get widget :inactive))
6bc5854eef8b (widget-default-active): Obey `:always-active'.
Gerd Moellmann <gerd@gnu.org>
parents: 27711
diff changeset
1635 (let ((parent (widget-get widget :parent)))
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
1636 (or (null parent)
28780
6bc5854eef8b (widget-default-active): Obey `:always-active'.
Gerd Moellmann <gerd@gnu.org>
parents: 27711
diff changeset
1637 (widget-apply parent :active))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1638
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1639 (defun widget-default-deactivate (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1640 "Make WIDGET inactive for user modifications."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1641 (widget-specify-inactive widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1642 (widget-get widget :from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1643 (widget-get widget :to)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1644
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1645 (defun widget-default-action (widget &optional event)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1646 "Notify the parent when a widget changes."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1647 (let ((parent (widget-get widget :parent)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1648 (when parent
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1649 (widget-apply parent :notify widget event))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1650
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1651 (defun widget-default-notify (widget child &optional event)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1652 "Pass notification to parent."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1653 (widget-default-action widget event))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1654
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1655 (defun widget-default-prompt-value (widget prompt value unbound)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1656 "Read an arbitrary value. Stolen from `set-variable'."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1657 ;; (let ((initial (if unbound
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1658 ;; nil
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1659 ;; It would be nice if we could do a `(cons val 1)' here.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1660 ;; (prin1-to-string (custom-quote value))))))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1661 (eval-minibuffer prompt))
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
1662
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1663 ;;; The `item' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1664
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1665 (define-widget 'item 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1666 "Constant items for inclusion in other widgets."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1667 :convert-widget 'widget-value-convert-widget
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1668 :value-create 'widget-item-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1669 :value-delete 'ignore
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1670 :value-get 'widget-value-value-get
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1671 :match 'widget-item-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1672 :match-inline 'widget-item-match-inline
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1673 :action 'widget-item-action
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1674 :format "%t\n")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1675
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1676 (defun widget-item-value-create (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1677 "Insert the printed representation of the value."
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1678 (princ (widget-get widget :value) (current-buffer)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1679
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1680 (defun widget-item-match (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1681 ;; Match if the value is the same.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1682 (equal (widget-get widget :value) value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1683
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1684 (defun widget-item-match-inline (widget values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1685 ;; Match if the value is the same.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1686 (let ((value (widget-get widget :value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1687 (and (listp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1688 (<= (length value) (length values))
18056
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1689 (let ((head (widget-sublist values 0 (length value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1690 (and (equal head value)
18056
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1691 (cons head (widget-sublist values (length value))))))))
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1692
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1693 (defun widget-sublist (list start &optional end)
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1694 "Return the sublist of LIST from START to END.
f8591273bf79 (widget-default-format-handler): Don't use push.
Richard M. Stallman <rms@gnu.org>
parents: 18055
diff changeset
1695 If END is omitted, it defaults to the length of LIST."
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1696 (if (> start 0) (setq list (nthcdr start list)))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1697 (if end
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1698 (unless (<= end start)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1699 (setq list (copy-sequence list))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1700 (setcdr (nthcdr (- end start 1) list) nil)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1701 list)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1702 (copy-sequence list)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1703
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1704 (defun widget-item-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1705 ;; Just notify itself.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1706 (widget-apply widget :notify widget event))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1707
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1708 ;;; The `push-button' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1709
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1710 ;; (defcustom widget-push-button-gui t
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1711 ;; "If non nil, use GUI push buttons when available."
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1712 ;; :group 'widgets
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1713 ;; :type 'boolean)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1714
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1715 ;; Cache already created GUI objects.
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1716 ;; (defvar widget-push-button-cache nil)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1717
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1718 (defcustom widget-push-button-prefix "["
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1719 "String used as prefix for buttons."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1720 :type 'string
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1721 :group 'widget-button)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1722
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1723 (defcustom widget-push-button-suffix "]"
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1724 "String used as suffix for buttons."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1725 :type 'string
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1726 :group 'widget-button)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1727
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1728 (define-widget 'push-button 'item
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1729 "A pushable button."
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1730 :button-prefix ""
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1731 :button-suffix ""
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1732 :value-create 'widget-push-button-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1733 :format "%[%v%]")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1734
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1735 (defun widget-push-button-value-create (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1736 "Insert text representing the `on' and `off' states."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1737 (let* ((tag (or (widget-get widget :tag)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1738 (widget-get widget :value)))
18451
8eb08560287b Synched with 1.9936.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18438
diff changeset
1739 (tag-glyph (widget-get widget :tag-glyph))
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1740 (text (concat widget-push-button-prefix
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1741 tag widget-push-button-suffix)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1742 (if tag-glyph
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1743 (widget-image-insert widget text tag-glyph)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1744 (insert text))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1745
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1746 ;; (defun widget-gui-action (widget)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1747 ;; "Apply :action for WIDGET."
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1748 ;; (widget-apply-action widget (this-command-keys)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1749
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1750 ;;; The `link' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1751
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1752 (defcustom widget-link-prefix "["
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1753 "String used as prefix for links."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1754 :type 'string
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1755 :group 'widget-button)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1756
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1757 (defcustom widget-link-suffix "]"
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1758 "String used as suffix for links."
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1759 :type 'string
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1760 :group 'widget-button)
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1761
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1762 (define-widget 'link 'item
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1763 "An embedded link."
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1764 :button-prefix 'widget-link-prefix
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1765 :button-suffix 'widget-link-suffix
59023
fa849ef3cf2c (widget-specify-field, widget-specify-button):
Kim F. Storm <storm@cua.dk>
parents: 58766
diff changeset
1766 :follow-link "\C-m"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1767 :help-echo "Follow the link."
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
1768 :format "%[%t%]")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1769
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1770 ;;; The `info-link' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1771
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1772 (define-widget 'info-link 'link
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1773 "A link to an info file."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1774 :action 'widget-info-link-action)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1775
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1776 (defun widget-info-link-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1777 "Open the info node specified by WIDGET."
51047
497252d655f0 (pp-to-string, Info-goto-node): Don't autoload.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 49786
diff changeset
1778 (info (widget-value widget)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1779
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1780 ;;; The `url-link' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1781
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1782 (define-widget 'url-link 'link
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1783 "A link to an www page."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1784 :action 'widget-url-link-action)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1785
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1786 (defun widget-url-link-action (widget &optional event)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1787 "Open the URL specified by WIDGET."
21068
cb35e7350402 Use browse-url directly.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 20466
diff changeset
1788 (browse-url (widget-value widget)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1789
20073
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1790 ;;; The `function-link' Widget.
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1791
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1792 (define-widget 'function-link 'link
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1793 "A link to an Emacs function."
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1794 :action 'widget-function-link-action)
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1795
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1796 (defun widget-function-link-action (widget &optional event)
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1797 "Show the function specified by WIDGET."
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1798 (describe-function (widget-value widget)))
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1799
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1800 ;;; The `variable-link' Widget.
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1801
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1802 (define-widget 'variable-link 'link
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1803 "A link to an Emacs variable."
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1804 :action 'widget-variable-link-action)
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1805
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1806 (defun widget-variable-link-action (widget &optional event)
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1807 "Show the variable specified by WIDGET."
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1808 (describe-variable (widget-value widget)))
74c909547230 (variable-link): New widget.
Karl Heuer <kwzh@gnu.org>
parents: 20064
diff changeset
1809
18598
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1810 ;;; The `file-link' Widget.
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1811
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1812 (define-widget 'file-link 'link
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1813 "A link to a file."
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1814 :action 'widget-file-link-action)
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1815
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1816 (defun widget-file-link-action (widget &optional event)
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1817 "Find the file specified by WIDGET."
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1818 (find-file (widget-value widget)))
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1819
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1820 ;;; The `emacs-library-link' Widget.
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1821
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1822 (define-widget 'emacs-library-link 'link
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1823 "A link to an Emacs Lisp library file."
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1824 :action 'widget-emacs-library-link-action)
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1825
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1826 (defun widget-emacs-library-link-action (widget &optional event)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1827 "Find the Emacs library file specified by WIDGET."
18598
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1828 (find-file (locate-library (widget-value widget))))
e12b4c195b2b Synched with 1.9944.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18572
diff changeset
1829
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1830 ;;; The `emacs-commentary-link' Widget.
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
1831
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1832 (define-widget 'emacs-commentary-link 'link
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1833 "A link to Commentary in an Emacs Lisp library file."
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1834 :action 'widget-emacs-commentary-link-action)
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
1835
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1836 (defun widget-emacs-commentary-link-action (widget &optional event)
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1837 "Find the Commentary section of the Emacs file specified by WIDGET."
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1838 (finder-commentary (widget-value widget)))
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
1839
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1840 ;;; The `editable-field' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1841
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1842 (define-widget 'editable-field 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1843 "An editable text field."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1844 :convert-widget 'widget-value-convert-widget
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1845 :keymap widget-field-keymap
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1846 :format "%v"
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1847 :help-echo "M-TAB: complete field; RET: enter value"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1848 :value ""
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1849 :prompt-internal 'widget-field-prompt-internal
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1850 :prompt-history 'widget-field-history
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1851 :prompt-value 'widget-field-prompt-value
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1852 :action 'widget-field-action
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1853 :validate 'widget-field-validate
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1854 :valid-regexp ""
31578
48f674467ba6 (widget-default-format-handler): DTRT when
Dave Love <fx@gnu.org>
parents: 31361
diff changeset
1855 :error "Field's value doesn't match allowed forms"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1856 :value-create 'widget-field-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1857 :value-delete 'widget-field-value-delete
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1858 :value-get 'widget-field-value-get
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1859 :match 'widget-field-match)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1860
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1861 (defvar widget-field-history nil
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1862 "History of field minibuffer edits.")
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1863
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1864 (defun widget-field-prompt-internal (widget prompt initial history)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1865 "Read string for WIDGET promptinhg with PROMPT.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1866 INITIAL is the initial input and HISTORY is a symbol containing
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1867 the earlier input."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1868 (read-string prompt initial history))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1869
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1870 (defun widget-field-prompt-value (widget prompt value unbound)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1871 "Prompt for a string."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1872 (widget-apply widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1873 :value-to-external
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1874 (widget-apply widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1875 :prompt-internal prompt
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1876 (unless unbound
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1877 (cons (widget-apply widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1878 :value-to-internal value)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1879 0))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1880 (widget-get widget :prompt-history))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1881
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1882 (defvar widget-edit-functions nil)
18429
8326843eefd9 (widget-edit-hook): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18374
diff changeset
1883
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1884 (defun widget-field-action (widget &optional event)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1885 "Move to next field."
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
1886 (widget-forward 1)
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
1887 (run-hook-with-args 'widget-edit-functions widget))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1888
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1889 (defun widget-field-validate (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1890 "Valid if the content matches `:valid-regexp'."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1891 (unless (string-match (widget-get widget :valid-regexp)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1892 (widget-apply widget :value-get))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
1893 widget))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1894
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1895 (defun widget-field-value-create (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1896 "Create an editable text field."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1897 (let ((size (widget-get widget :size))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1898 (value (widget-get widget :value))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1899 (from (point))
18562
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
1900 ;; This is changed to a real overlay in `widget-setup'. We
e22e2a4e683a Synched with 1.9942.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18461
diff changeset
1901 ;; need the end points to behave differently until
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1902 ;; `widget-setup' is called.
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1903 (overlay (cons (make-marker) (make-marker))))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1904 (widget-put widget :field-overlay overlay)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1905 (insert value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1906 (and size
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1907 (< (length value) size)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1908 (insert-char ?\s (- size (length value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1909 (unless (memq widget widget-field-list)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1910 (setq widget-field-new (cons widget widget-field-new)))
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1911 (move-marker (cdr overlay) (point))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1912 (set-marker-insertion-type (cdr overlay) nil)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1913 (when (null size)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1914 (insert ?\n))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1915 (move-marker (car overlay) from)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1916 (set-marker-insertion-type (car overlay) t)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1917
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1918 (defun widget-field-value-delete (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1919 "Remove the widget from the list of active editing fields."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1920 (setq widget-field-list (delq widget widget-field-list))
33893
8b25bc5d3aa4 (widget-field-buffer, widget-field-start)
Miles Bader <miles@gnu.org>
parents: 33872
diff changeset
1921 (setq widget-field-new (delq widget widget-field-new))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1922 ;; These are nil if the :format string doesn't contain `%v'.
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1923 (let ((overlay (widget-get widget :field-overlay)))
33872
d65847dea2c0 (widget-field-value-delete): Don't try to delete overlay when it's the
Miles Bader <miles@gnu.org>
parents: 33846
diff changeset
1924 (when (overlayp overlay)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1925 (delete-overlay overlay))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1926
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1927 (defun widget-field-value-get (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1928 "Return current text in editing field."
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1929 (let ((from (widget-field-start widget))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1930 (to (widget-field-end widget))
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1931 (buffer (widget-field-buffer widget))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1932 (size (widget-get widget :size))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1933 (secret (widget-get widget :secret))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1934 (old (current-buffer)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1935 (if (and from to)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1936 (progn
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1937 (set-buffer buffer)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1938 (while (and size
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1939 (not (zerop size))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1940 (> to from)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
1941 (eq (char-after (1- to)) ?\s))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1942 (setq to (1- to)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1943 (let ((result (buffer-substring-no-properties from to)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1944 (when secret
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1945 (let ((index 0))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1946 (while (< (+ from index) to)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1947 (aset result index
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
1948 (get-char-property (+ from index) 'secret))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1949 (setq index (1+ index)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1950 (set-buffer old)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1951 result))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1952 (widget-get widget :value))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1953
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1954 (defun widget-field-match (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1955 ;; Match any string.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1956 (stringp value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1957
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1958 ;;; The `text' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1959
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1960 (define-widget 'text 'editable-field
38907
7124795193df (text): Re-order docstring correctly.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38235
diff changeset
1961 "A multiline text area."
7124795193df (text): Re-order docstring correctly.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38235
diff changeset
1962 :keymap widget-text-keymap)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1963
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1964 ;;; The `menu-choice' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1965
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1966 (define-widget 'menu-choice 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1967 "A menu of options."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1968 :convert-widget 'widget-types-convert-widget
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
1969 :copy 'widget-types-copy
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1970 :format "%[%t%]: %v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1971 :case-fold t
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1972 :tag "choice"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1973 :void '(item :format "invalid (%t)\n")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1974 :value-create 'widget-choice-value-create
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1975 :value-get 'widget-child-value-get
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
1976 :value-inline 'widget-child-value-inline
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
1977 :default-get 'widget-choice-default-get
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
1978 :mouse-down-action 'widget-choice-mouse-down-action
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1979 :action 'widget-choice-action
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1980 :error "Make a choice"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1981 :validate 'widget-choice-validate
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1982 :match 'widget-choice-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1983 :match-inline 'widget-choice-match-inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1984
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1985 (defun widget-choice-value-create (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
1986 "Insert the first choice that matches the value."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1987 (let ((value (widget-get widget :value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1988 (args (widget-get widget :args))
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1989 (explicit (widget-get widget :explicit-choice))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
1990 current)
64766
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
1991 (if explicit
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1992 (progn
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1993 ;; If the user specified the choice for this value,
64766
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
1994 ;; respect that choice.
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1995 (widget-put widget :children (list (widget-create-child-value
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1996 widget explicit value)))
64766
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
1997 (widget-put widget :choice explicit)
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
1998 (widget-put widget :explicit-choice nil))
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
1999 (while args
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2000 (setq current (car args)
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2001 args (cdr args))
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2002 (when (widget-apply current :match value)
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2003 (widget-put widget :children (list (widget-create-child-value
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2004 widget current value)))
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2005 (widget-put widget :choice current)
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2006 (setq args nil
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2007 current nil)))
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2008 (when current
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2009 (let ((void (widget-get widget :void)))
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2010 (widget-put widget :children (list (widget-create-child-and-convert
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2011 widget void :value value)))
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2012 (widget-put widget :choice void))))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2013
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2014 (defun widget-choice-default-get (widget)
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2015 ;; Get default for the first choice.
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2016 (widget-default-get (car (widget-get widget :args))))
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2017
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2018 (defcustom widget-choice-toggle nil
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2019 "If non-nil, a binary choice will just toggle between the values.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2020 Otherwise, the user will explicitly have to choose between the values
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
2021 when he invoked the menu."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2022 :type 'boolean
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2023 :group 'widgets)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2024
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2025 (defun widget-choice-mouse-down-action (widget &optional event)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2026 ;; Return non-nil if we need a menu.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2027 (let ((args (widget-get widget :args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2028 (old (widget-get widget :choice)))
30539
bb2f9fca15c9 (widget-choose): Use display-mouse-p instead of window-system.
Eli Zaretskii <eliz@gnu.org>
parents: 30246
diff changeset
2029 (cond ((not (display-popup-menus-p))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2030 ;; No place to pop up a menu.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2031 nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2032 ((< (length args) 2)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2033 ;; Empty or singleton list, just return the value.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2034 nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2035 ((> (length args) widget-menu-max-size)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2036 ;; Too long, prompt.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2037 nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2038 ((> (length args) 2)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2039 ;; Reasonable sized list, use menu.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2040 t)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2041 ((and widget-choice-toggle (memq old args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2042 ;; We toggle.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2043 nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2044 (t
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2045 ;; Ask which of the two.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2046 t))))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2047
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2048 (defun widget-choice-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2049 ;; Make a choice.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2050 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2051 (old (widget-get widget :choice))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2052 (tag (widget-apply widget :menu-tag-get))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2053 (completion-ignore-case (widget-get widget :case-fold))
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2054 this-explicit
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2055 current choices)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2056 ;; Remember old value.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2057 (if (and old (not (widget-apply widget :validate)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2058 (let* ((external (widget-value widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2059 (internal (widget-apply old :value-to-internal external)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2060 (widget-put old :value internal)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2061 ;; Find new choice.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2062 (setq current
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2063 (cond ((= (length args) 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2064 nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2065 ((= (length args) 1)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2066 (nth 0 args))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2067 ((and widget-choice-toggle
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2068 (= (length args) 2)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2069 (memq old args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2070 (if (eq old (nth 0 args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2071 (nth 1 args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2072 (nth 0 args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2073 (t
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2074 (while args
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2075 (setq current (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2076 args (cdr args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2077 (setq choices
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2078 (cons (cons (widget-apply current :menu-tag-get)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2079 current)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2080 choices)))
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2081 (setq this-explicit t)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2082 (widget-choose tag (reverse choices) event))))
18374
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
2083 (when current
64766
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
2084 ;; If this was an explicit user choice, record the choice,
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
2085 ;; so that widget-choice-value-create will respect it.
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
2086 (when this-explicit
64766
a0da2f13ae20 (widget-choice-value-create): Unconditionally respect user choice.
Luc Teirlinck <teirllm@auburn.edu>
parents: 64762
diff changeset
2087 (widget-put widget :explicit-choice current))
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2088 (widget-value-set widget (widget-default-get current))
18374
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
2089 (widget-setup)
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
2090 (widget-apply widget :notify widget event)))
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
2091 (run-hook-with-args 'widget-edit-functions widget))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2092
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2093 (defun widget-choice-validate (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2094 ;; Valid if we have made a valid choice.
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2095 (if (eq (widget-get widget :void) (widget-get widget :choice))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2096 widget
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2097 (widget-apply (car (widget-get widget :children)) :validate)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2098
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2099 (defun widget-choice-match (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2100 ;; Matches if one of the choices matches.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2101 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2102 current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2103 (while (and args (not found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2104 (setq current (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2105 args (cdr args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2106 found (widget-apply current :match value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2107 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2108
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2109 (defun widget-choice-match-inline (widget values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2110 ;; Matches if one of the choices matches.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2111 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2112 current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2113 (while (and args (null found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2114 (setq current (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2115 args (cdr args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2116 found (widget-match-inline current values)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2117 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2118
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2119 ;;; The `toggle' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2120
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2121 (define-widget 'toggle 'item
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2122 "Toggle between two states."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2123 :format "%[%v%]\n"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2124 :value-create 'widget-toggle-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2125 :action 'widget-toggle-action
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2126 :match (lambda (widget value) t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2127 :on "on"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2128 :off "off")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2129
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2130 (defun widget-toggle-value-create (widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2131 "Insert text representing the `on' and `off' states."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2132 (if (widget-value widget)
42355
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2133 (let ((image (widget-get widget :on-glyph)))
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2134 (and (display-graphic-p)
42355
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2135 (listp image)
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2136 (not (eq (car image) 'image))
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2137 (widget-put widget :on-glyph (setq image (eval image))))
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2138 (widget-image-insert widget
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2139 (widget-get widget :on)
42355
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2140 image))
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2141 (let ((image (widget-get widget :off-glyph)))
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2142 (and (display-graphic-p)
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2143 (listp image)
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2144 (not (eq (car image) 'image))
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2145 (widget-put widget :off-glyph (setq image (eval image))))
6a1a8da1ad47 (widget-toggle-value-create): Don't eval actual images (which are lists too).
Miles Bader <miles@gnu.org>
parents: 41763
diff changeset
2146 (widget-image-insert widget (widget-get widget :off) image))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2147
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2148 (defun widget-toggle-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2149 ;; Toggle value.
18374
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
2150 (widget-value-set widget (not (widget-value widget)))
201d766770fd (widget-default-value-set): Preserve point here.
Richard M. Stallman <rms@gnu.org>
parents: 18372
diff changeset
2151 (widget-apply widget :notify widget event)
18461
35976f73432d (widget-choice-action): Use widget-edit-functions.
Richard M. Stallman <rms@gnu.org>
parents: 18451
diff changeset
2152 (run-hook-with-args 'widget-edit-functions widget))
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2153
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2154 ;;; The `checkbox' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2155
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2156 (define-widget 'checkbox 'toggle
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2157 "A checkbox toggle."
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
2158 :button-suffix ""
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
2159 :button-prefix ""
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2160 :format "%[%v%]"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2161 :on "[X]"
29567
db8d9c0d471f (widget-specify-button): Really suppress the face if required.
Dave Love <fx@gnu.org>
parents: 29402
diff changeset
2162 ;; We could probably do the same job as the images using single
db8d9c0d471f (widget-specify-button): Really suppress the face if required.
Dave Love <fx@gnu.org>
parents: 29402
diff changeset
2163 ;; space characters in a boxed face with a stretch specification to
db8d9c0d471f (widget-specify-button): Really suppress the face if required.
Dave Love <fx@gnu.org>
parents: 29402
diff changeset
2164 ;; make them square.
45200
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2165 :on-glyph '(create-image "\300\300\141\143\067\076\034\030"
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2166 'xbm t :width 8 :height 8
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2167 :background "grey75" ; like default mode line
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2168 :foreground "black"
45200
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2169 :relief -2
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2170 :ascent 'center)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2171 :off "[ ]"
45200
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2172 :off-glyph '(create-image (make-string 8 0)
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2173 'xbm t :width 8 :height 8
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2174 :background "grey75"
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2175 :foreground "black"
45200
411711e43201 (checkbox): New check-mark image.
Kim F. Storm <storm@cua.dk>
parents: 44591
diff changeset
2176 :relief -2
41605
faa52db1ed51 (widget-toggle-value-create): On graphic terminal,
Richard M. Stallman <rms@gnu.org>
parents: 40868
diff changeset
2177 :ascent 'center)
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
2178 :help-echo "Toggle this item."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2179 :action 'widget-checkbox-action)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2180
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2181 (defun widget-checkbox-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2182 "Toggle checkbox, notify parent, and set active state of sibling."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2183 (widget-toggle-action widget event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2184 (let ((sibling (widget-get-sibling widget)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2185 (when sibling
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2186 (if (widget-value widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2187 (widget-apply sibling :activate)
67631
5b2b1ad90419 (widget-checkbox-action): Clear undo info.
Eli Zaretskii <eliz@gnu.org>
parents: 67376
diff changeset
2188 (widget-apply sibling :deactivate))
5b2b1ad90419 (widget-checkbox-action): Clear undo info.
Eli Zaretskii <eliz@gnu.org>
parents: 67376
diff changeset
2189 (widget-clear-undo))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2190
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2191 ;;; The `checklist' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2192
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2193 (define-widget 'checklist 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2194 "A multiple choice widget."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2195 :convert-widget 'widget-types-convert-widget
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2196 :copy 'widget-types-copy
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2197 :format "%v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2198 :offset 4
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2199 :entry-format "%b %v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2200 :greedy nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2201 :value-create 'widget-checklist-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2202 :value-get 'widget-checklist-value-get
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2203 :validate 'widget-checklist-validate
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2204 :match 'widget-checklist-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2205 :match-inline 'widget-checklist-match-inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2206
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2207 (defun widget-checklist-value-create (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2208 ;; Insert all values
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2209 (let ((alist (widget-checklist-match-find widget (widget-get widget :value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2210 (args (widget-get widget :args)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2211 (while args
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2212 (widget-checklist-add-item widget (car args) (assq (car args) alist))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2213 (setq args (cdr args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2214 (widget-put widget :children (nreverse (widget-get widget :children)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2215
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2216 (defun widget-checklist-add-item (widget type chosen)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2217 "Create checklist item in WIDGET of type TYPE.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2218 If the item is checked, CHOSEN is a cons whose cdr is the value."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2219 (and (eq (preceding-char) ?\n)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2220 (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2221 (insert-char ?\s (widget-get widget :indent)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2222 (widget-specify-insert
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2223 (let* ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2224 (buttons (widget-get widget :buttons))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2225 (button-args (or (widget-get type :sibling-args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2226 (widget-get widget :button-args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2227 (from (point))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2228 child button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2229 (insert (widget-get widget :entry-format))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2230 (goto-char from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2231 ;; Parse % escapes in format.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2232 (while (re-search-forward "%\\([bv%]\\)" nil t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2233 (let ((escape (char-after (match-beginning 1))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2234 (delete-backward-char 2)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2235 (cond ((eq escape ?%)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2236 (insert ?%))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2237 ((eq escape ?b)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2238 (setq button (apply 'widget-create-child-and-convert
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2239 widget 'checkbox
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2240 :value (not (null chosen))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2241 button-args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2242 ((eq escape ?v)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2243 (setq child
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2244 (cond ((not chosen)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2245 (let ((child (widget-create-child widget type)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2246 (widget-apply child :deactivate)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2247 child))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2248 ((widget-get type :inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2249 (widget-create-child-value
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2250 widget type (cdr chosen)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2251 (t
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2252 (widget-create-child-value
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2253 widget type (car (cdr chosen)))))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2254 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2255 (error "Unknown escape `%c'" escape)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2256 ;; Update properties.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2257 (and button child (widget-put child :button button))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2258 (and button (widget-put widget :buttons (cons button buttons)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2259 (and child (widget-put widget :children (cons child children))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2260
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2261 (defun widget-checklist-match (widget values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2262 ;; All values must match a type in the checklist.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2263 (and (listp values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2264 (null (cdr (widget-checklist-match-inline widget values)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2265
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2266 (defun widget-checklist-match-inline (widget values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2267 ;; Find the values which match a type in the checklist.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2268 (let ((greedy (widget-get widget :greedy))
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
2269 (args (copy-sequence (widget-get widget :args)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2270 found rest)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2271 (while values
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2272 (let ((answer (widget-checklist-match-up args values)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2273 (cond (answer
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2274 (let ((vals (widget-match-inline answer values)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2275 (setq found (append found (car vals))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2276 values (cdr vals)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2277 args (delq answer args))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2278 (greedy
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2279 (setq rest (append rest (list (car values)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2280 values (cdr values)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2281 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2282 (setq rest (append rest values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2283 values nil)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2284 (cons found rest)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2285
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2286 (defun widget-checklist-match-find (widget vals)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2287 "Find the vals which match a type in the checklist.
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2288 Return an alist of (TYPE MATCH)."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2289 (let ((greedy (widget-get widget :greedy))
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
2290 (args (copy-sequence (widget-get widget :args)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2291 found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2292 (while vals
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2293 (let ((answer (widget-checklist-match-up args vals)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2294 (cond (answer
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2295 (let ((match (widget-match-inline answer vals)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2296 (setq found (cons (cons answer (car match)) found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2297 vals (cdr match)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2298 args (delq answer args))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2299 (greedy
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2300 (setq vals (cdr vals)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2301 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2302 (setq vals nil)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2303 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2304
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2305 (defun widget-checklist-match-up (args vals)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2306 "Return the first type from ARGS that matches VALS."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2307 (let (current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2308 (while (and args (null found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2309 (setq current (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2310 args (cdr args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2311 found (widget-match-inline current vals)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2312 (if found
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2313 current)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2314
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2315 (defun widget-checklist-value-get (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2316 ;; The values of all selected items.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2317 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2318 child result)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2319 (while children
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2320 (setq child (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2321 children (cdr children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2322 (if (widget-value (widget-get child :button))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2323 (setq result (append result (widget-apply child :value-inline)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2324 result))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2325
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2326 (defun widget-checklist-validate (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2327 ;; Ticked chilren must be valid.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2328 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2329 child button found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2330 (while (and children (not found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2331 (setq child (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2332 children (cdr children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2333 button (widget-get child :button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2334 found (and (widget-value button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2335 (widget-apply child :validate))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2336 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2337
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2338 ;;; The `option' Widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2339
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2340 (define-widget 'option 'checklist
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2341 "An widget with an optional item."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2342 :inline t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2343
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2344 ;;; The `choice-item' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2345
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2346 (define-widget 'choice-item 'item
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2347 "Button items that delegate action events to their parents."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2348 :action 'widget-parent-action
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2349 :format "%[%t%] \n")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2350
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2351 ;;; The `radio-button' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2352
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2353 (define-widget 'radio-button 'toggle
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2354 "A radio button for use in the `radio' widget."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2355 :notify 'widget-radio-button-notify
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2356 :format "%[%v%]"
18033
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
2357 :button-suffix ""
bccd356a3b7c Synched with version 1.9900.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17799
diff changeset
2358 :button-prefix ""
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2359 :on "(*)"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2360 :on-glyph "radio1"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2361 :off "( )"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2362 :off-glyph "radio0")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2363
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2364 (defun widget-radio-button-notify (widget child &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2365 ;; Tell daddy.
55682
1374d9297422 * wid-edit.el (widget-radio-button-notify): Revert my last
Masatake YAMATO <jet@gyve.org>
parents: 55664
diff changeset
2366 (widget-apply (widget-get widget :parent) :action widget event))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2367
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2368 ;;; The `radio-button-choice' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2369
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2370 (define-widget 'radio-button-choice 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2371 "Select one of multiple options."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2372 :convert-widget 'widget-types-convert-widget
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2373 :copy 'widget-types-copy
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2374 :offset 4
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2375 :format "%v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2376 :entry-format "%b %v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2377 :value-create 'widget-radio-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2378 :value-get 'widget-radio-value-get
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2379 :value-inline 'widget-radio-value-inline
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2380 :value-set 'widget-radio-value-set
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2381 :error "You must push one of the buttons"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2382 :validate 'widget-radio-validate
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2383 :match 'widget-choice-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2384 :match-inline 'widget-choice-match-inline
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2385 :action 'widget-radio-action)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2386
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2387 (defun widget-radio-value-create (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2388 ;; Insert all values
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2389 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2390 arg)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2391 (while args
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2392 (setq arg (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2393 args (cdr args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2394 (widget-radio-add-item widget arg))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2395
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2396 (defun widget-radio-add-item (widget type)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2397 "Add to radio widget WIDGET a new radio button item of type TYPE."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2398 ;; (setq type (widget-convert type))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2399 (and (eq (preceding-char) ?\n)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2400 (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2401 (insert-char ?\s (widget-get widget :indent)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2402 (widget-specify-insert
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2403 (let* ((value (widget-get widget :value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2404 (children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2405 (buttons (widget-get widget :buttons))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2406 (button-args (or (widget-get type :sibling-args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2407 (widget-get widget :button-args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2408 (from (point))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2409 (chosen (and (null (widget-get widget :choice))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2410 (widget-apply type :match value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2411 child button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2412 (insert (widget-get widget :entry-format))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2413 (goto-char from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2414 ;; Parse % escapes in format.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2415 (while (re-search-forward "%\\([bv%]\\)" nil t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2416 (let ((escape (char-after (match-beginning 1))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2417 (delete-backward-char 2)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2418 (cond ((eq escape ?%)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2419 (insert ?%))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2420 ((eq escape ?b)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2421 (setq button (apply 'widget-create-child-and-convert
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2422 widget 'radio-button
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2423 :value (not (null chosen))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2424 button-args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2425 ((eq escape ?v)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2426 (setq child (if chosen
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2427 (widget-create-child-value
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2428 widget type value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2429 (widget-create-child widget type)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2430 (unless chosen
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2431 (widget-apply child :deactivate)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2432 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2433 (error "Unknown escape `%c'" escape)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2434 ;; Update properties.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2435 (when chosen
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2436 (widget-put widget :choice type))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2437 (when button
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2438 (widget-put child :button button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2439 (widget-put widget :buttons (nconc buttons (list button))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2440 (when child
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2441 (widget-put widget :children (nconc children (list child))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2442 child)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2443
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2444 (defun widget-radio-value-get (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2445 ;; Get value of the child widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2446 (let ((chosen (widget-radio-chosen widget)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2447 (and chosen (widget-value chosen))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2448
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2449 (defun widget-radio-chosen (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2450 "Return the widget representing the chosen radio button."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2451 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2452 current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2453 (while children
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2454 (setq current (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2455 children (cdr children))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2456 (when (widget-apply (widget-get current :button) :value-get)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2457 (setq found current
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2458 children nil)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2459 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2460
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2461 (defun widget-radio-value-inline (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2462 ;; Get value of the child widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2463 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2464 current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2465 (while children
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2466 (setq current (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2467 children (cdr children))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2468 (when (widget-apply (widget-get current :button) :value-get)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2469 (setq found (widget-apply current :value-inline)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2470 children nil)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2471 found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2472
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2473 (defun widget-radio-value-set (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2474 ;; We can't just delete and recreate a radio widget, since children
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2475 ;; can be added after the original creation and won't be recreated
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2476 ;; by `:create'.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2477 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2478 current found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2479 (while children
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2480 (setq current (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2481 children (cdr children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2482 (let* ((button (widget-get current :button))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2483 (match (and (not found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2484 (widget-apply current :match value))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2485 (widget-value-set button match)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2486 (if match
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2487 (progn
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2488 (widget-value-set current value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2489 (widget-apply current :activate))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2490 (widget-apply current :deactivate))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2491 (setq found (or found match))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2492
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2493 (defun widget-radio-validate (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2494 ;; Valid if we have made a valid choice.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2495 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2496 current found button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2497 (while (and children (not found))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2498 (setq current (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2499 children (cdr children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2500 button (widget-get current :button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2501 found (widget-apply button :value-get)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2502 (if found
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2503 (widget-apply current :validate)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2504 widget)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2505
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2506 (defun widget-radio-action (widget child event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2507 ;; Check if a radio button was pressed.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2508 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2509 (buttons (widget-get widget :buttons))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2510 current)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2511 (when (memq child buttons)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2512 (while children
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2513 (setq current (car children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2514 children (cdr children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2515 (let* ((button (widget-get current :button)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2516 (cond ((eq child button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2517 (widget-value-set button t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2518 (widget-apply current :activate))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2519 ((widget-value button)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2520 (widget-value-set button nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2521 (widget-apply current :deactivate)))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2522 ;; Pass notification to parent.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2523 (widget-apply widget :notify child event))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2524
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2525 ;;; The `insert-button' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2526
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2527 (define-widget 'insert-button 'push-button
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2528 "An insert button for the `editable-list' widget."
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2529 :tag "INS"
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2530 :help-echo "Insert a new item into the list at this position."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2531 :action 'widget-insert-button-action)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2532
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2533 (defun widget-insert-button-action (widget &optional event)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2534 ;; Ask the parent to insert a new item.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2535 (widget-apply (widget-get widget :parent)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2536 :insert-before (widget-get widget :widget)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2537
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2538 ;;; The `delete-button' Widget.
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2539
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2540 (define-widget 'delete-button 'push-button
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2541 "A delete button for the `editable-list' widget."
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2542 :tag "DEL"
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2543 :help-echo "Delete this item from the list."
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2544 :action 'widget-delete-button-action)
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2545
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2546 (defun widget-delete-button-action (widget &optional event)
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2547 ;; Ask the parent to insert a new item.
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2548 (widget-apply (widget-get widget :parent)
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2549 :delete-at (widget-get widget :widget)))
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2550
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2551 ;;; The `editable-list' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2552
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2553 ;; (defcustom widget-editable-list-gui nil
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2554 ;; "If non nil, use GUI push-buttons in editable list when available."
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2555 ;; :type 'boolean
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2556 ;; :group 'widgets)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2557
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2558 (define-widget 'editable-list 'default
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2559 "A variable list of widgets of the same type."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2560 :convert-widget 'widget-types-convert-widget
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2561 :copy 'widget-types-copy
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2562 :offset 12
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2563 :format "%v%i\n"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2564 :format-handler 'widget-editable-list-format-handler
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2565 :entry-format "%i %d %v"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2566 :value-create 'widget-editable-list-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2567 :value-get 'widget-editable-list-value-get
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2568 :validate 'widget-children-validate
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2569 :match 'widget-editable-list-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2570 :match-inline 'widget-editable-list-match-inline
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2571 :insert-before 'widget-editable-list-insert-before
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2572 :delete-at 'widget-editable-list-delete-at)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2573
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2574 (defun widget-editable-list-format-handler (widget escape)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2575 ;; We recognize the insert button.
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2576 ;; (let ((widget-push-button-gui widget-editable-list-gui))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2577 (cond ((eq escape ?i)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2578 (and (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2579 (insert-char ?\s (widget-get widget :indent)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2580 (apply 'widget-create-child-and-convert
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2581 widget 'insert-button
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2582 (widget-get widget :append-button-args)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2583 (t
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2584 (widget-default-format-handler widget escape)))
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2585 ;; )
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2586 )
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2587
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2588 (defun widget-editable-list-value-create (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2589 ;; Insert all values
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2590 (let* ((value (widget-get widget :value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2591 (type (nth 0 (widget-get widget :args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2592 children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2593 (widget-put widget :value-pos (copy-marker (point)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2594 (set-marker-insertion-type (widget-get widget :value-pos) t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2595 (while value
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2596 (let ((answer (widget-match-inline type value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2597 (if answer
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2598 (setq children (cons (widget-editable-list-entry-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2599 widget
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2600 (if (widget-get type :inline)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2601 (car answer)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2602 (car (car answer)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2603 t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2604 children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2605 value (cdr answer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2606 (setq value nil))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2607 (widget-put widget :children (nreverse children))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2608
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2609 (defun widget-editable-list-value-get (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2610 ;; Get value of the child widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2611 (apply 'append (mapcar (lambda (child) (widget-apply child :value-inline))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2612 (widget-get widget :children))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2613
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2614 (defun widget-editable-list-match (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2615 ;; Value must be a list and all the members must match the type.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2616 (and (listp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2617 (null (cdr (widget-editable-list-match-inline widget value)))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2618
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2619 (defun widget-editable-list-match-inline (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2620 (let ((type (nth 0 (widget-get widget :args)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2621 (ok t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2622 found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2623 (while (and value ok)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2624 (let ((answer (widget-match-inline type value)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2625 (if answer
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2626 (setq found (append found (car answer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2627 value (cdr answer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2628 (setq ok nil))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2629 (cons found value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2630
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2631 (defun widget-editable-list-insert-before (widget before)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2632 ;; Insert a new child in the list of children.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2633 (save-excursion
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2634 (let ((children (widget-get widget :children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2635 (inhibit-read-only t)
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2636 before-change-functions
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2637 after-change-functions)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2638 (cond (before
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2639 (goto-char (widget-get before :entry-from)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2640 (t
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2641 (goto-char (widget-get widget :value-pos))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2642 (let ((child (widget-editable-list-entry-create
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2643 widget nil nil)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2644 (when (< (widget-get child :entry-from) (widget-get widget :from))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2645 (set-marker (widget-get widget :from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2646 (widget-get child :entry-from)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2647 (if (eq (car children) before)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2648 (widget-put widget :children (cons child children))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2649 (while (not (eq (car (cdr children)) before))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2650 (setq children (cdr children)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2651 (setcdr children (cons child (cdr children)))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2652 (widget-setup)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
2653 (widget-apply widget :notify widget))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2654
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2655 (defun widget-editable-list-delete-at (widget child)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2656 ;; Delete child from list of children.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2657 (save-excursion
17535
4d7f2035303a Use copy-sequence, not copy-list.
Richard M. Stallman <rms@gnu.org>
parents: 17415
diff changeset
2658 (let ((buttons (copy-sequence (widget-get widget :buttons)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2659 button
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2660 (inhibit-read-only t)
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2661 before-change-functions
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2662 after-change-functions)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2663 (while buttons
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2664 (setq button (car buttons)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2665 buttons (cdr buttons))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2666 (when (eq (widget-get button :widget) child)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2667 (widget-put widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2668 :buttons (delq button (widget-get widget :buttons)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2669 (widget-delete button))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2670 (let ((entry-from (widget-get child :entry-from))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2671 (entry-to (widget-get child :entry-to))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2672 (inhibit-read-only t)
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2673 before-change-functions
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2674 after-change-functions)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2675 (widget-delete child)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2676 (delete-region entry-from entry-to)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2677 (set-marker entry-from nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2678 (set-marker entry-to nil))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2679 (widget-put widget :children (delq child (widget-get widget :children))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2680 (widget-setup)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2681 (widget-apply widget :notify widget))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2682
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2683 (defun widget-editable-list-entry-create (widget value conv)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2684 ;; Create a new entry to the list.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2685 (let ((type (nth 0 (widget-get widget :args)))
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2686 ;; (widget-push-button-gui widget-editable-list-gui)
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2687 child delete insert)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2688 (widget-specify-insert
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2689 (save-excursion
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2690 (and (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2691 (insert-char ?\s (widget-get widget :indent)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2692 (insert (widget-get widget :entry-format)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2693 ;; Parse % escapes in format.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2694 (while (re-search-forward "%\\(.\\)" nil t)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2695 (let ((escape (char-after (match-beginning 1))))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2696 (delete-backward-char 2)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2697 (cond ((eq escape ?%)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2698 (insert ?%))
36218
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2699 ((eq escape ?i)
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2700 (setq insert (apply 'widget-create-child-and-convert
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2701 widget 'insert-button
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2702 (widget-get widget :insert-button-args))))
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2703 ((eq escape ?d)
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2704 (setq delete (apply 'widget-create-child-and-convert
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2705 widget 'delete-button
24ded05f613e Revert bogus revision 1.93.
Dave Love <fx@gnu.org>
parents: 36204
diff changeset
2706 (widget-get widget :delete-button-args))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2707 ((eq escape ?v)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2708 (if conv
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2709 (setq child (widget-create-child-value
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2710 widget type value))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2711 (setq child (widget-create-child-value
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2712 widget type (widget-default-get type)))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2713 (t
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2714 (error "Unknown escape `%c'" escape)))))
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2715 (let ((buttons (widget-get widget :buttons)))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2716 (if insert (push insert buttons))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2717 (if delete (push delete buttons))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2718 (widget-put widget :buttons buttons))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2719 (let ((entry-from (point-min-marker))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2720 (entry-to (point-max-marker)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2721 (set-marker-insertion-type entry-from t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2722 (set-marker-insertion-type entry-to nil)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2723 (widget-put child :entry-from entry-from)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2724 (widget-put child :entry-to entry-to)))
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2725 (if insert (widget-put insert :widget child))
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
2726 (if delete (widget-put delete :widget child))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2727 child))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2728
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2729 ;;; The `group' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2730
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2731 (define-widget 'group 'default
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
2732 "A widget which groups other widgets inside."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2733 :convert-widget 'widget-types-convert-widget
47741
be7a44c8fe9c wid-edit.el fixes
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 46644
diff changeset
2734 :copy 'widget-types-copy
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2735 :format "%v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2736 :value-create 'widget-group-value-create
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2737 :value-get 'widget-editable-list-value-get
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2738 :default-get 'widget-group-default-get
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2739 :validate 'widget-children-validate
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2740 :match 'widget-group-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2741 :match-inline 'widget-group-match-inline)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2742
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2743 (defun widget-group-value-create (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2744 ;; Create each component.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2745 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2746 (value (widget-get widget :value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2747 arg answer children)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2748 (while args
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2749 (setq arg (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2750 args (cdr args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2751 answer (widget-match-inline arg value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2752 value (cdr answer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2753 (and (eq (preceding-char) ?\n)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2754 (widget-get widget :indent)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2755 (insert-char ?\s (widget-get widget :indent)))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2756 (push (cond ((null answer)
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2757 (widget-create-child widget arg))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2758 ((widget-get arg :inline)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2759 (widget-create-child-value widget arg (car answer)))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2760 (t
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2761 (widget-create-child-value widget arg (car (car answer)))))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2762 children))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2763 (widget-put widget :children (nreverse children))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2764
21428
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2765 (defun widget-group-default-get (widget)
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2766 ;; Get the default of the components.
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2767 (mapcar 'widget-default-get (widget-get widget :args)))
28157e58238a (default, widget-default-default-get): Define it.
Richard M. Stallman <rms@gnu.org>
parents: 21338
diff changeset
2768
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2769 (defun widget-group-match (widget values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2770 ;; Match if the components match.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2771 (and (listp values)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2772 (let ((match (widget-group-match-inline widget values)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2773 (and match (null (cdr match))))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2774
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2775 (defun widget-group-match-inline (widget vals)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2776 ;; Match if the components match.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2777 (let ((args (widget-get widget :args))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2778 argument answer found)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2779 (while args
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2780 (setq argument (car args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2781 args (cdr args)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2782 answer (widget-match-inline argument vals))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2783 (if answer
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2784 (setq vals (cdr answer)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2785 found (append found (car answer)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2786 (setq vals nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2787 args nil)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2788 (if answer
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2789 (cons found vals))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2790
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2791 ;;; The `visibility' Widget.
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2792
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2793 (define-widget 'visibility 'item
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2794 "An indicator and manipulator for hidden items."
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2795 :format "%[%v%]"
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2796 :button-prefix ""
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2797 :button-suffix ""
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2798 :on "Hide"
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2799 :off "Show"
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2800 :value-create 'widget-visibility-value-create
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2801 :action 'widget-toggle-action
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2802 :match (lambda (widget value) t))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2803
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2804 (defun widget-visibility-value-create (widget)
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2805 ;; Insert text representing the `on' and `off' states.
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2806 (let ((on (widget-get widget :on))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2807 (off (widget-get widget :off)))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2808 (if on
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2809 (setq on (concat widget-push-button-prefix
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2810 on
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2811 widget-push-button-suffix))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2812 (setq on ""))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2813 (if off
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2814 (setq off (concat widget-push-button-prefix
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2815 off
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2816 widget-push-button-suffix))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2817 (setq off ""))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2818 (if (widget-value widget)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2819 (widget-image-insert widget on "down" "down-pushed")
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2820 (widget-image-insert widget off "right" "right-pushed"))))
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2821
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2822 ;;; The `documentation-link' Widget.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2823 ;;
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2824 ;; This is a helper widget for `documentation-string'.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2825
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2826 (define-widget 'documentation-link 'link
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2827 "Link type used in documentation strings."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2828 :tab-order -1
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2829 :help-echo "Describe this symbol"
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2830 :action 'widget-documentation-link-action)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2831
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2832 (defun widget-documentation-link-action (widget &optional event)
18366
2aaa07c43738 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 18365
diff changeset
2833 "Display documentation for WIDGET's value. Ignore optional argument EVENT."
18365
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2834 (let* ((string (widget-get widget :value))
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2835 (symbol (intern string)))
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2836 (if (and (fboundp symbol) (boundp symbol))
18366
2aaa07c43738 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 18365
diff changeset
2837 ;; If there are two doc strings, give the user a way to pick one.
18365
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2838 (apropos (concat "\\`" (regexp-quote string) "\\'"))
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2839 (if (fboundp symbol)
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2840 (describe-function symbol)
ceb9388fe67f (widget-documentation-link-action):
Richard M. Stallman <rms@gnu.org>
parents: 18364
diff changeset
2841 (describe-variable symbol)))))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2842
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2843 (defcustom widget-documentation-links t
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2844 "Add hyperlinks to documentation strings when non-nil."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2845 :type 'boolean
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2846 :group 'widget-documentation)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2847
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2848 (defcustom widget-documentation-link-regexp "`\\([^\n`' ]+\\)'"
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2849 "Regexp for matching potential links in documentation strings.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2850 The first group should be the link itself."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2851 :type 'regexp
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2852 :group 'widget-documentation)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2853
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2854 (defcustom widget-documentation-link-p 'intern-soft
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2855 "Predicate used to test if a string is useful as a link.
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2856 The value should be a function. The function will be called one
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2857 argument, a string, and should return non-nil if there should be a
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2858 link for that string."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2859 :type 'function
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2860 :options '(widget-documentation-link-p)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2861 :group 'widget-documentation)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2862
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2863 (defcustom widget-documentation-link-type 'documentation-link
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2864 "Widget type used for links in documentation strings."
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2865 :type 'symbol
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2866 :group 'widget-documentation)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2867
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2868 (defun widget-documentation-link-add (widget from to)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2869 (widget-specify-doc widget from to)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2870 (when widget-documentation-links
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2871 (let ((regexp widget-documentation-link-regexp)
25686
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
2872 (buttons (widget-get widget :buttons))
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
2873 (widget-mouse-face (default-value 'widget-mouse-face))
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
2874 (widget-button-face widget-documentation-face)
c1a7a52bbfea Remove some compatibility code and checks.
Dave Love <fx@gnu.org>
parents: 24978
diff changeset
2875 (widget-button-pressed-face widget-documentation-face))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2876 (save-excursion
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2877 (goto-char from)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2878 (while (re-search-forward regexp to t)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2879 (let ((name (match-string 1))
18336
325190603227 Synched with 1.9924.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18258
diff changeset
2880 (begin (match-beginning 1))
325190603227 Synched with 1.9924.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18258
diff changeset
2881 (end (match-end 1)))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2882 (when (funcall widget-documentation-link-p name)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2883 (push (widget-convert-button widget-documentation-link-type
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2884 begin end :value name)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2885 buttons)))))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2886 (widget-put widget :buttons buttons)))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2887 (let ((indent (widget-get widget :indent)))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2888 (when (and indent (not (zerop indent)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2889 (save-excursion
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2890 (save-restriction
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2891 (narrow-to-region from to)
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2892 (goto-char (point-min))
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2893 (while (search-forward "\n" nil t)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2894 (insert-char ?\s indent)))))))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2895
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2896 ;;; The `documentation-string' Widget.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2897
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2898 (define-widget 'documentation-string 'item
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2899 "A documentation string."
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2900 :format "%v"
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2901 :action 'widget-documentation-string-action
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2902 :value-create 'widget-documentation-string-value-create)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2903
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2904 (defun widget-documentation-string-value-create (widget)
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2905 ;; Insert documentation string.
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2906 (let ((doc (widget-value widget))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2907 (indent (widget-get widget :indent))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
2908 (shown (widget-get (widget-get widget :parent) :documentation-shown))
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
2909 (start (point)))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2910 (if (string-match "\n" doc)
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2911 (let ((before (substring doc 0 (match-beginning 0)))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2912 (after (substring doc (match-beginning 0)))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2913 button)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2914 (insert before ?\s)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2915 (widget-documentation-link-add widget start (point))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2916 (setq button
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2917 (widget-create-child-and-convert
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2918 widget 'visibility
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2919 :help-echo "Show or hide rest of the documentation."
46581
e767254f9b0c (widget-documentation-string-value-create):
Richard M. Stallman <rms@gnu.org>
parents: 45427
diff changeset
2920 :on "Hide Rest"
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
2921 :off "More"
28780
6bc5854eef8b (widget-default-active): Obey `:always-active'.
Gerd Moellmann <gerd@gnu.org>
parents: 27711
diff changeset
2922 :always-active t
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2923 :action 'widget-parent-action
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2924 shown))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2925 (when shown
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
2926 (setq start (point))
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2927 (when (and indent (not (zerop indent)))
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
2928 (insert-char ?\s indent))
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
2929 (insert after)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2930 (widget-documentation-link-add widget start (point)))
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
2931 (widget-put widget :buttons (list button)))
18244
909a0f9169b8 Synched with 1.9914.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18138
diff changeset
2932 (insert doc)
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
2933 (widget-documentation-link-add widget start (point))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2934 (insert ?\n))
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2935
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2936 (defun widget-documentation-string-action (widget &rest ignore)
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2937 ;; Toggle documentation.
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2938 (let ((parent (widget-get widget :parent)))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
2939 (widget-put parent :documentation-shown
18067
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2940 (not (widget-get parent :documentation-shown))))
0e2aa3b58e16 Synched with version 1.9901.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18056
diff changeset
2941 ;; Redraw.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2942 (widget-value-set widget (widget-value widget)))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
2943
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2944 ;;; The Sexp Widgets.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2945
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2946 (define-widget 'const 'item
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2947 "An immutable sexp."
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2948 :prompt-value 'widget-const-prompt-value
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2949 :format "%t\n%d")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2950
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2951 (defun widget-const-prompt-value (widget prompt value unbound)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2952 ;; Return the value of the const.
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2953 (widget-value widget))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2954
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2955 (define-widget 'function-item 'const
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2956 "An immutable function name."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2957 :format "%v\n%h"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2958 :documentation-property (lambda (symbol)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2959 (condition-case nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2960 (documentation symbol t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2961 (error nil))))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2962
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2963 (define-widget 'variable-item 'const
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2964 "An immutable variable name."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2965 :format "%v\n%h"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2966 :documentation-property 'variable-documentation)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2967
22421
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2968 (define-widget 'other 'sexp
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2969 "Matches any value, but doesn't let the user edit the value.
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2970 This is useful as last item in a `choice' widget.
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2971 You should use this widget type with a default value,
22468
9c7650b90c06 (other): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 22422
diff changeset
2972 as in (other DEFAULT) or (other :tag \"NAME\" DEFAULT).
22421
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2973 If the user selects this alternative, that specifies DEFAULT
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2974 as the value."
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2975 :tag "Other"
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2976 :format "%t%n"
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2977 :value 'other)
b23a720f3b4f (other): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 22004
diff changeset
2978
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2979 (defvar widget-string-prompt-value-history nil
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2980 "History of input to `widget-string-prompt-value'.")
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2981
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2982 (define-widget 'string 'editable-field
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2983 "A string"
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2984 :tag "String"
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2985 :format "%{%t%}: %v"
18138
fa4eb2f6b05a Synached with 1.9908.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18090
diff changeset
2986 :complete-function 'ispell-complete-word
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
2987 :prompt-history 'widget-string-prompt-value-history)
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2988
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2989 (define-widget 'regexp 'string
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2990 "A regular expression."
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2991 :match 'widget-regexp-match
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2992 :validate 'widget-regexp-validate
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
2993 ;; Doesn't work well with terminating newline.
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
2994 ;; :value-face 'widget-single-line-field
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2995 :tag "Regexp")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
2996
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2997 (defun widget-regexp-match (widget value)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2998 ;; Match valid regexps.
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
2999 (and (stringp value)
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3000 (condition-case nil
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3001 (prog1 t
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3002 (string-match value ""))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3003 (error nil))))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3004
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3005 (defun widget-regexp-validate (widget)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3006 "Check that the value of WIDGET is a valid regexp."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3007 (condition-case data
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3008 (prog1 nil
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3009 (string-match (widget-value widget) ""))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3010 (error (widget-put widget :error (error-message-string data))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3011 widget)))
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3012
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3013 (define-widget 'file 'string
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3014 "A file widget.
67727
c0dbbeb95cd3 (file, directory): Doc fixes for the `define-widget's.
Luc Teirlinck <teirllm@auburn.edu>
parents: 67631
diff changeset
3015 It reads a file name from an editable text field."
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3016 :complete-function 'widget-file-complete
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3017 :prompt-value 'widget-file-prompt-value
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3018 :format "%{%t%}: %v"
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
3019 ;; Doesn't work well with terminating newline.
63193
0e93c53d878e Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-364
Miles Bader <miles@gnu.org>
parents: 61394
diff changeset
3020 ;; :value-face 'widget-single-line-field
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3021 :tag "File")
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3022
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3023 (defun widget-file-complete ()
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3024 "Perform completion on file name preceding point."
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3025 (interactive)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3026 (let* ((end (point))
65837
3a0debccbfea (widget-file-complete): Get the widget start point the right way.
Richard M. Stallman <rms@gnu.org>
parents: 65680
diff changeset
3027 (beg (widget-field-start widget))
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3028 (pattern (buffer-substring beg end))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3029 (name-part (file-name-nondirectory pattern))
65837
3a0debccbfea (widget-file-complete): Get the widget start point the right way.
Richard M. Stallman <rms@gnu.org>
parents: 65680
diff changeset
3030 ;; I think defaulting to root is right
3a0debccbfea (widget-file-complete): Get the widget start point the right way.
Richard M. Stallman <rms@gnu.org>
parents: 65680
diff changeset
3031 ;; because these really should be absolute file names.
3a0debccbfea (widget-file-complete): Get the widget start point the right way.
Richard M. Stallman <rms@gnu.org>
parents: 65680
diff changeset
3032 (directory (or (file-name-directory pattern) "/"))
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3033 (completion (file-name-completion name-part directory)))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3034 (cond ((eq completion t))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3035 ((null completion)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3036 (message "Can't find completion for \"%s\"" pattern)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3037 (ding))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3038 ((not (string= name-part completion))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3039 (delete-region beg end)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3040 (insert (expand-file-name completion directory)))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3041 (t
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3042 (message "Making completion list...")
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3043 (with-output-to-temp-buffer "*Completions*"
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3044 (display-completion-list
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3045 (sort (file-name-all-completions name-part directory)
66114
13abee3a9bc6 * message.el (message-expand-group): Pass the common
Masatake YAMATO <jet@gyve.org>
parents: 65868
diff changeset
3046 'string<)
13abee3a9bc6 * message.el (message-expand-group): Pass the common
Masatake YAMATO <jet@gyve.org>
parents: 65868
diff changeset
3047 name-part))
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3048 (message "Making completion list...%s" "done")))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3049
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3050 (defun widget-file-prompt-value (widget prompt value unbound)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3051 ;; Read file from minibuffer.
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3052 (abbreviate-file-name
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3053 (if unbound
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3054 (read-file-name prompt)
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64766
diff changeset
3055 (let ((prompt2 (format "%s (default %s): " prompt value))
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3056 (dir (file-name-directory value))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3057 (file (file-name-nondirectory value))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3058 (must-match (widget-get widget :must-match)))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3059 (read-file-name prompt2 dir nil must-match file)))))
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3060
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3061 ;;;(defun widget-file-action (widget &optional event)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3062 ;;; ;; Read a file name from the minibuffer.
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3063 ;;; (let* ((value (widget-value widget))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3064 ;;; (dir (file-name-directory value))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3065 ;;; (file (file-name-nondirectory value))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3066 ;;; (menu-tag (widget-apply widget :menu-tag-get))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3067 ;;; (must-match (widget-get widget :must-match))
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64766
diff changeset
3068 ;;; (answer (read-file-name (concat menu-tag " (default " value "): ")
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3069 ;;; dir nil must-match file)))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3070 ;;; (widget-value-set widget (abbreviate-file-name answer))
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3071 ;;; (widget-setup)
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3072 ;;; (widget-apply widget :notify widget event)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3073
35264
689589ab80b3 (function): Add :match-alternatives.
Dave Love <fx@gnu.org>
parents: 35155
diff changeset
3074 ;; Fixme: use file-name-as-directory.
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3075 (define-widget 'directory 'file
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3076 "A directory widget.
67727
c0dbbeb95cd3 (file, directory): Doc fixes for the `define-widget's.
Luc Teirlinck <teirllm@auburn.edu>
parents: 67631
diff changeset
3077 It reads a directory name from an editable text field."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3078 :tag "Directory")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3079
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3080 (defvar widget-symbol-prompt-value-history nil
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3081 "History of input to `widget-symbol-prompt-value'.")
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3082
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3083 (define-widget 'symbol 'editable-field
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
3084 "A Lisp symbol."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3085 :value nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3086 :tag "Symbol"
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3087 :format "%{%t%}: %v"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3088 :match (lambda (widget value) (symbolp value))
18372
5b5261ce8db9 (widget-file-complete): New function.
Richard M. Stallman <rms@gnu.org>
parents: 18369
diff changeset
3089 :complete-function 'lisp-complete-symbol
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3090 :prompt-internal 'widget-symbol-prompt-internal
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3091 :prompt-match 'symbolp
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3092 :prompt-history 'widget-symbol-prompt-value-history
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3093 :value-to-internal (lambda (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3094 (if (symbolp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3095 (symbol-name value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3096 value))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3097 :value-to-external (lambda (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3098 (if (stringp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3099 (intern value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3100 value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3101
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3102 (defun widget-symbol-prompt-internal (widget prompt initial history)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3103 ;; Read file from minibuffer.
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3104 (let ((answer (completing-read prompt obarray
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3105 (widget-get widget :prompt-match)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3106 nil initial history)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3107 (if (and (stringp answer)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3108 (not (zerop (length answer))))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3109 answer
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3110 (error "No value"))))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3111
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3112 (defvar widget-function-prompt-value-history nil
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3113 "History of input to `widget-function-prompt-value'.")
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3114
59131
52e7defa0669 (function): Use restricted-sexp as parent.
Richard M. Stallman <rms@gnu.org>
parents: 59023
diff changeset
3115 (define-widget 'function 'restricted-sexp
21337
901472ec6f29 Delete some compatibility code.
Richard M. Stallman <rms@gnu.org>
parents: 21068
diff changeset
3116 "A Lisp function."
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3117 :complete-function (lambda ()
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3118 (interactive)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3119 (lisp-complete-symbol 'fboundp))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3120 :prompt-value 'widget-field-prompt-value
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3121 :prompt-internal 'widget-symbol-prompt-internal
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3122 :prompt-match 'fboundp
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3123 :prompt-history 'widget-function-prompt-value-history
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3124 :action 'widget-field-action
35264
689589ab80b3 (function): Add :match-alternatives.
Dave Love <fx@gnu.org>
parents: 35155
diff changeset
3125 :match-alternatives '(functionp)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3126 :validate (lambda (widget)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3127 (unless (functionp (widget-value widget))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3128 (widget-put widget :error (format "Invalid function: %S"
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3129 (widget-value widget)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3130 widget))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3131 :value 'ignore
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3132 :tag "Function")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3133
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3134 (defvar widget-variable-prompt-value-history nil
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3135 "History of input to `widget-variable-prompt-value'.")
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3136
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3137 (define-widget 'variable 'symbol
22004
79a3c4eba19f (widgets: sexp, variable, list, vector): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 21428
diff changeset
3138 "A Lisp variable."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3139 :prompt-match 'boundp
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3140 :prompt-history 'widget-variable-prompt-value-history
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3141 :complete-function (lambda ()
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3142 (interactive)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3143 (lisp-complete-symbol 'boundp))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3144 :tag "Variable")
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3145
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3146 (defvar widget-coding-system-prompt-value-history nil
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3147 "History of input to `widget-coding-system-prompt-value'.")
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
3148
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3149 (define-widget 'coding-system 'symbol
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3150 "A MULE coding-system."
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3151 :format "%{%t%}: %v"
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3152 :tag "Coding system"
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3153 :base-only nil
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3154 :prompt-history 'widget-coding-system-prompt-value-history
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3155 :prompt-value 'widget-coding-system-prompt-value
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3156 :action 'widget-coding-system-action
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3157 :complete-function (lambda ()
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3158 (interactive)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3159 (lisp-complete-symbol 'coding-system-p))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3160 :validate (lambda (widget)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3161 (unless (coding-system-p (widget-value widget))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3162 (widget-put widget :error (format "Invalid coding system: %S"
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3163 (widget-value widget)))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3164 widget))
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3165 :value 'undecided
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3166 :prompt-match 'coding-system-p)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3167
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3168 (defun widget-coding-system-prompt-value (widget prompt value unbound)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3169 "Read coding-system from minibuffer."
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3170 (if (widget-get widget :base-only)
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3171 (intern
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64766
diff changeset
3172 (completing-read (format "%s (default %s): " prompt value)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3173 (mapcar #'list (coding-system-list t)) nil nil nil
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3174 coding-system-history))
65680
ed770a0a7846 2005-09-24 Emilio C. Lopes <eclig@gmx.net>
Romain Francoise <romain@orebokech.com>
parents: 64766
diff changeset
3175 (read-coding-system (format "%s (default %s): " prompt value) value)))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3176
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3177 (defun widget-coding-system-action (widget &optional event)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3178 (let ((answer
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3179 (widget-coding-system-prompt-value
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3180 widget
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3181 (widget-apply widget :menu-tag-get)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3182 (widget-value widget)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3183 t)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3184 (widget-value-set widget answer)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3185 (widget-apply widget :notify widget event)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3186 (widget-setup)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3187
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3188 ;;; I'm not sure about what this is good for? KFS.
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3189 (defvar widget-key-sequence-prompt-value-history nil
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3190 "History of input to `widget-key-sequence-prompt-value'.")
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3191
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3192 (defvar widget-key-sequence-default-value [ignore]
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3193 "Default value for an empty key sequence.")
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3194
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3195 (defvar widget-key-sequence-map
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3196 (let ((map (make-sparse-keymap)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3197 (set-keymap-parent map widget-field-keymap)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3198 (define-key map [(control ?q)] 'widget-key-sequence-read-event)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3199 map))
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3200
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3201 (define-widget 'key-sequence 'restricted-sexp
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3202 "A key sequence."
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3203 :prompt-value 'widget-field-prompt-value
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3204 :prompt-internal 'widget-symbol-prompt-internal
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3205 ; :prompt-match 'fboundp ;; What was this good for? KFS
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3206 :prompt-history 'widget-key-sequence-prompt-value-history
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3207 :action 'widget-field-action
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3208 :match-alternatives '(stringp vectorp)
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3209 :format "%{%t%}: %v"
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3210 :validate 'widget-key-sequence-validate
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3211 :value-to-internal 'widget-key-sequence-value-to-internal
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3212 :value-to-external 'widget-key-sequence-value-to-external
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3213 :value widget-key-sequence-default-value
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3214 :keymap widget-key-sequence-map
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3215 :help-echo "C-q: insert KEY, EVENT, or CODE; RET: enter value"
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3216 :tag "Key sequence")
68005
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3217
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3218 (defun widget-key-sequence-read-event (ev)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3219 (interactive (list
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3220 (let ((inhibit-quit t) quit-flag)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3221 (read-event "Insert KEY, EVENT, or CODE: "))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3222 (let ((ev2 (and (memq 'down (event-modifiers ev))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3223 (read-event)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3224 (tr (and (keymapp function-key-map)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3225 (lookup-key function-key-map (vector ev)))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3226 (when (and (integerp ev)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3227 (or (and (<= ?0 ev) (< ev (+ ?0 (min 10 read-quoted-char-radix))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3228 (and (<= ?a (downcase ev))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3229 (< (downcase ev) (+ ?a -10 (min 36 read-quoted-char-radix))))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3230 (setq unread-command-events (cons ev unread-command-events)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3231 ev (read-quoted-char (format "Enter code (radix %d)" read-quoted-char-radix))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3232 tr nil)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3233 (if (and (integerp ev) (not (char-valid-p ev)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3234 (insert (char-to-string ev)))) ;; throw invalid char error
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3235 (setq ev (key-description (list ev)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3236 (when (arrayp tr)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3237 (setq tr (key-description (list (aref tr 0))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3238 (if (y-or-n-p (format "Key %s is translated to %s -- use %s? " ev tr tr))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3239 (setq ev tr ev2 nil)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3240 (insert (if (= (char-before) ?\s) "" " ") ev " ")
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3241 (if ev2
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3242 (insert (key-description (list ev2)) " "))))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3243
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3244 (defun widget-key-sequence-validate (widget)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3245 (unless (or (stringp (widget-value widget))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3246 (vectorp (widget-value widget)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3247 (widget-put widget :error (format "Invalid key sequence: %S"
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3248 (widget-value widget)))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3249 widget))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3250
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3251 (defun widget-key-sequence-value-to-internal (widget value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3252 (if (widget-apply widget :match value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3253 (if (equal value widget-key-sequence-default-value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3254 ""
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3255 (key-description value))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3256 value))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3257
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3258 (defun widget-key-sequence-value-to-external (widget value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3259 (if (stringp value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3260 (if (string-match "\\`[[:space:]]*\\'" value)
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3261 widget-key-sequence-default-value
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3262 (read-kbd-macro value))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3263 value))
3d987bde3a79 (key-sequence): Rework widget to read key binding
Kim F. Storm <storm@cua.dk>
parents: 67727
diff changeset
3264
66673
a4d43f085476 (key-sequence): New widget type.
Richard M. Stallman <rms@gnu.org>
parents: 66336
diff changeset
3265
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3266 (define-widget 'sexp 'editable-field
22004
79a3c4eba19f (widgets: sexp, variable, list, vector): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 21428
diff changeset
3267 "An arbitrary Lisp expression."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3268 :tag "Lisp expression"
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3269 :format "%{%t%}: %v"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3270 :value nil
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3271 :validate 'widget-sexp-validate
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3272 :match (lambda (widget value) t)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3273 :value-to-internal 'widget-sexp-value-to-internal
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3274 :value-to-external (lambda (widget value) (read value))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3275 :prompt-history 'widget-sexp-prompt-value-history
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3276 :prompt-value 'widget-sexp-prompt-value)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3277
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3278 (defun widget-sexp-value-to-internal (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3279 ;; Use pp for printer representation.
18055
9e0c7dffc231 (widget-sexp-value-to-internal):
Richard M. Stallman <rms@gnu.org>
parents: 18033
diff changeset
3280 (let ((pp (if (symbolp value)
9e0c7dffc231 (widget-sexp-value-to-internal):
Richard M. Stallman <rms@gnu.org>
parents: 18033
diff changeset
3281 (prin1-to-string value)
9e0c7dffc231 (widget-sexp-value-to-internal):
Richard M. Stallman <rms@gnu.org>
parents: 18033
diff changeset
3282 (pp-to-string value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3283 (while (string-match "\n\\'" pp)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3284 (setq pp (substring pp 0 -1)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3285 (if (or (string-match "\n\\'" pp)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3286 (> (length pp) 40))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3287 (concat "\n" pp)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3288 pp)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3289
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3290 (defun widget-sexp-validate (widget)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3291 ;; Valid if we can read the string and there is no junk left after it.
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3292 (with-temp-buffer
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3293 (insert (widget-apply widget :value-get))
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3294 (goto-char (point-min))
31361
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3295 (let (err)
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3296 (condition-case data
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3297 (progn
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3298 ;; Avoid a confusing end-of-file error.
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3299 (skip-syntax-forward "\\s-")
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3300 (if (eobp)
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3301 (setq err "Empty sexp -- use `nil'?")
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3302 (unless (widget-apply widget :match (read (current-buffer)))
31361
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3303 (setq err (widget-get widget :type-error))))
56628
7759479de37c (widget-sexp-validate): Allow whitespace after expression.
Lars Hansen <larsh@soem.dk>
parents: 56384
diff changeset
3304 ;; Allow whitespace after expression.
7759479de37c (widget-sexp-validate): Allow whitespace after expression.
Lars Hansen <larsh@soem.dk>
parents: 56384
diff changeset
3305 (skip-syntax-forward "\\s-")
31361
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3306 (if (and (not (eobp))
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3307 (not err))
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3308 (setq err (format "Junk at end of expression: %s"
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3309 (buffer-substring (point)
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3310 (point-max))))))
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3311 (end-of-file ; Avoid confusing error message.
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3312 (setq err "Unbalanced sexp"))
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3313 (error (setq err (error-message-string data))))
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3314 (if (not err)
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3315 nil
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3316 (widget-put widget :error err)
cb09e02f0217 (widget-sexp-validate): Fix garbled code.
Dave Love <fx@gnu.org>
parents: 30982
diff changeset
3317 widget))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3318
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3319 (defvar widget-sexp-prompt-value-history nil
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3320 "History of input to `widget-sexp-prompt-value'.")
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3321
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3322 (defun widget-sexp-prompt-value (widget prompt value unbound)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3323 ;; Read an arbitrary sexp.
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3324 (let ((found (read-string prompt
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3325 (if unbound nil (cons (prin1-to-string value) 0))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3326 (widget-get widget :prompt-history))))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3327 (let ((answer (read-from-string found)))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3328 (unless (= (cdr answer) (length found))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3329 (error "Junk at end of expression: %s"
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3330 (substring found (cdr answer))))
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3331 (car answer))))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3332
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3333 (define-widget 'restricted-sexp 'sexp
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3334 "A Lisp expression restricted to values that match.
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3335 To use this type, you must define :match or :match-alternatives."
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3336 :type-error "The specified value is not valid"
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3337 :match 'widget-restricted-sexp-match
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3338 :value-to-internal (lambda (widget value)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3339 (if (widget-apply widget :match value)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3340 (prin1-to-string value)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3341 value)))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3342
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3343 (defun widget-restricted-sexp-match (widget value)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3344 (let ((alternatives (widget-get widget :match-alternatives))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3345 matched)
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3346 (while (and alternatives (not matched))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3347 (if (cond ((functionp (car alternatives))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3348 (funcall (car alternatives) value))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3349 ((and (consp (car alternatives))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3350 (eq (car (car alternatives)) 'quote))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3351 (eq value (nth 1 (car alternatives)))))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3352 (setq matched t))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3353 (setq alternatives (cdr alternatives)))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3354 matched))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3355
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3356 (define-widget 'integer 'restricted-sexp
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3357 "An integer."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3358 :tag "Integer"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3359 :value 0
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3360 :type-error "This field should contain an integer"
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3361 :match-alternatives '(integerp))
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3362
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3363 (define-widget 'number 'restricted-sexp
48707
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3364 "A number (floating point or integer)."
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3365 :tag "Number"
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3366 :value 0.0
48707
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3367 :type-error "This field should contain a number (floating point or integer)"
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3368 :match-alternatives '(numberp))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3369
48707
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3370 (define-widget 'float 'restricted-sexp
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3371 "A floating point number."
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3372 :tag "Floating point number"
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3373 :value 0.0
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3374 :type-error "This field should contain a floating point number"
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3375 :match-alternatives '(floatp))
e84d99848b76 (define-widget number): Clarify doc and error message.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 47921
diff changeset
3376
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3377 (define-widget 'character 'editable-field
18438
947c1b6ea8de (widget-menu-minibuffer-flag): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 18429
diff changeset
3378 "A character."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3379 :tag "Character"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3380 :value 0
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3381 :size 1
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3382 :format "%{%t%}: %v\n"
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3383 :valid-regexp "\\`.\\'"
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3384 :error "This field should contain a single character"
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3385 :value-to-internal (lambda (widget value)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3386 (if (stringp value)
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3387 value
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3388 (char-to-string value)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3389 :value-to-external (lambda (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3390 (if (stringp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3391 (aref value 0)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3392 value))
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3393 :match (lambda (widget value)
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3394 (char-valid-p value)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3395
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3396 (define-widget 'list 'group
22004
79a3c4eba19f (widgets: sexp, variable, list, vector): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 21428
diff changeset
3397 "A Lisp list."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3398 :tag "List"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3399 :format "%{%t%}:\n%v")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3400
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3401 (define-widget 'vector 'group
22004
79a3c4eba19f (widgets: sexp, variable, list, vector): Doc fixes.
Richard M. Stallman <rms@gnu.org>
parents: 21428
diff changeset
3402 "A Lisp vector."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3403 :tag "Vector"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3404 :format "%{%t%}:\n%v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3405 :match 'widget-vector-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3406 :value-to-internal (lambda (widget value) (append value nil))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3407 :value-to-external (lambda (widget value) (apply 'vector value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3408
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3409 (defun widget-vector-match (widget value)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3410 (and (vectorp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3411 (widget-group-match widget
17415
30a567b89fb6 Sync with 1.84.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17334
diff changeset
3412 (widget-apply widget :value-to-internal value))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3413
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3414 (define-widget 'cons 'group
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3415 "A cons-cell."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3416 :tag "Cons-cell"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3417 :format "%{%t%}:\n%v"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3418 :match 'widget-cons-match
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3419 :value-to-internal (lambda (widget value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3420 (list (car value) (cdr value)))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3421 :value-to-external (lambda (widget value)
51363
2d011e9999e9 (widget-specify-insert): Simplify.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 51047
diff changeset
3422 (apply 'cons value)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3423
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3424 (defun widget-cons-match (widget value)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3425 (and (consp value)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3426 (widget-group-match widget
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3427 (widget-apply widget :value-to-internal value))))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3428
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3429 ;;; The `lazy' Widget.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3430 ;;
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3431 ;; Recursive datatypes.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3432
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3433 (define-widget 'lazy 'default
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3434 "Base widget for recursive datastructures.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3435
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3436 The `lazy' widget will, when instantiated, contain a single inferior
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3437 widget, of the widget type specified by the :type parameter. The
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3438 value of the `lazy' widget is the same as the value of the inferior
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3439 widget. When deriving a new widget from the 'lazy' widget, the :type
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3440 parameter is allowed to refer to the widget currently being defined,
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3441 thus allowing recursive datastructures to be described.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3442
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3443 The :type parameter takes the same arguments as the defcustom
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3444 parameter with the same name.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3445
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3446 Most composite widgets, i.e. widgets containing other widgets, does
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3447 not allow recursion. That is, when you define a new widget type, none
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3448 of the inferior widgets may be of the same type you are currently
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3449 defining.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3450
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3451 In Lisp, however, it is custom to define datastructures in terms of
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3452 themselves. A list, for example, is defined as either nil, or a cons
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3453 cell whose cdr itself is a list. The obvious way to translate this
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3454 into a widget type would be
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3455
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3456 (define-widget 'my-list 'choice
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3457 \"A list of sexps.\"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3458 :tag \"Sexp list\"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3459 :args '((const nil) (cons :value (nil) sexp my-list)))
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3460
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3461 Here we attempt to define my-list as a choice of either the constant
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3462 nil, or a cons-cell containing a sexp and my-lisp. This will not work
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3463 because the `choice' widget does not allow recursion.
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3464
55984
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
3465 Using the `lazy' widget you can overcome this problem, as in this
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
3466 example:
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3467
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3468 (define-widget 'sexp-list 'lazy
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3469 \"A list of sexps.\"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3470 :tag \"Sexp list\"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3471 :type '(choice (const nil) (cons :value (nil) sexp sexp-list)))"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3472 :format "%{%t%}: %v"
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3473 ;; We don't convert :type because we want to allow recursive
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3474 ;; datastructures. This is slow, so we should not create speed
55984
6d619a8bd0ba (widget-specify-button): Use hand pointer rather
Kim F. Storm <storm@cua.dk>
parents: 55682
diff changeset
3475 ;; critical widgets by deriving from this.
53319
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3476 :convert-widget 'widget-value-convert-widget
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3477 :value-create 'widget-type-value-create
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3478 :value-get 'widget-child-value-get
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3479 :value-inline 'widget-child-value-inline
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3480 :default-get 'widget-type-default-get
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3481 :match 'widget-type-match
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3482 :validate 'widget-child-validate)
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3483
36b31fc002f2 2003-12-12 Jesper Harder <harder@ifa.au.dk>
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 52935
diff changeset
3484
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3485 ;;; The `plist' Widget.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3486 ;;
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3487 ;; Property lists.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3488
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3489 (define-widget 'plist 'list
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3490 "A property list."
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3491 :key-type '(symbol :tag "Key")
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3492 :value-type '(sexp :tag "Value")
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3493 :convert-widget 'widget-plist-convert-widget
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3494 :tag "Plist")
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3495
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3496 (defvar widget-plist-value-type) ;Dynamic variable
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3497
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3498 (defun widget-plist-convert-widget (widget)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3499 ;; Handle `:options'.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3500 (let* ((options (widget-get widget :options))
35992
56d876c3560d (widget-plist-convert-widget): Replace binding of
Dave Love <fx@gnu.org>
parents: 35858
diff changeset
3501 (widget-plist-value-type (widget-get widget :value-type))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3502 (other `(editable-list :inline t
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3503 (group :inline t
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3504 ,(widget-get widget :key-type)
35992
56d876c3560d (widget-plist-convert-widget): Replace binding of
Dave Love <fx@gnu.org>
parents: 35858
diff changeset
3505 ,widget-plist-value-type)))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3506 (args (if options
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3507 (list `(checklist :inline t
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3508 :greedy t
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3509 ,@(mapcar 'widget-plist-convert-option
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3510 options))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3511 other)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3512 (list other))))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3513 (widget-put widget :args args)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3514 widget))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3515
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3516 (defun widget-plist-convert-option (option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3517 ;; Convert a single plist option.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3518 (let (key-type value-type)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3519 (if (listp option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3520 (let ((key (nth 0 option)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3521 (setq value-type (nth 1 option))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3522 (if (listp key)
24134
9fd3f3cc78c1 (widget-alist-convert-option): Delete spurious comma.
Richard M. Stallman <rms@gnu.org>
parents: 24124
diff changeset
3523 (setq key-type key)
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3524 (setq key-type `(const ,key))))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3525 (setq key-type `(const ,option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3526 value-type widget-plist-value-type))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3527 `(group :format "Key: %v" :inline t ,key-type ,value-type)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3528
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3529
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3530 ;;; The `alist' Widget.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3531 ;;
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3532 ;; Association lists.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3533
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3534 (define-widget 'alist 'list
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3535 "An association list."
24124
21b9595acf22 (alist): Use sexp as default key-type.
Richard M. Stallman <rms@gnu.org>
parents: 24114
diff changeset
3536 :key-type '(sexp :tag "Key")
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3537 :value-type '(sexp :tag "Value")
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3538 :convert-widget 'widget-alist-convert-widget
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3539 :tag "Alist")
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3540
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3541 (defvar widget-alist-value-type) ;Dynamic variable
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3542
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3543 (defun widget-alist-convert-widget (widget)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3544 ;; Handle `:options'.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3545 (let* ((options (widget-get widget :options))
35992
56d876c3560d (widget-plist-convert-widget): Replace binding of
Dave Love <fx@gnu.org>
parents: 35858
diff changeset
3546 (widget-alist-value-type (widget-get widget :value-type))
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3547 (other `(editable-list :inline t
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3548 (cons :format "%v"
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3549 ,(widget-get widget :key-type)
35992
56d876c3560d (widget-plist-convert-widget): Replace binding of
Dave Love <fx@gnu.org>
parents: 35858
diff changeset
3550 ,widget-alist-value-type)))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3551 (args (if options
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3552 (list `(checklist :inline t
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3553 :greedy t
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3554 ,@(mapcar 'widget-alist-convert-option
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3555 options))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3556 other)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3557 (list other))))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3558 (widget-put widget :args args)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3559 widget))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3560
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3561 (defun widget-alist-convert-option (option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3562 ;; Convert a single alist option.
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3563 (let (key-type value-type)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3564 (if (listp option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3565 (let ((key (nth 0 option)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3566 (setq value-type (nth 1 option))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3567 (if (listp key)
24134
9fd3f3cc78c1 (widget-alist-convert-option): Delete spurious comma.
Richard M. Stallman <rms@gnu.org>
parents: 24124
diff changeset
3568 (setq key-type key)
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3569 (setq key-type `(const ,key))))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3570 (setq key-type `(const ,option)
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3571 value-type widget-alist-value-type))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3572 `(cons :format "Key: %v" ,key-type ,value-type)))
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3573
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3574 (define-widget 'choice 'menu-choice
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3575 "A union of several sexp types."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3576 :tag "Choice"
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
3577 :format "%{%t%}: %[Value Menu%] %v"
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
3578 :button-prefix 'widget-push-button-prefix
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
3579 :button-suffix 'widget-push-button-suffix
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3580 :prompt-value 'widget-choice-prompt-value)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3581
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3582 (defun widget-choice-prompt-value (widget prompt value unbound)
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3583 "Make a choice."
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3584 (let ((args (widget-get widget :args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3585 (completion-ignore-case (widget-get widget :case-fold))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3586 current choices old)
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3587 ;; Find the first arg that matches VALUE.
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3588 (let ((look args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3589 (while look
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3590 (if (widget-apply (car look) :match value)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3591 (setq old (car look)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3592 look nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3593 (setq look (cdr look)))))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3594 ;; Find new choice.
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3595 (setq current
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3596 (cond ((= (length args) 0)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3597 nil)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3598 ((= (length args) 1)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3599 (nth 0 args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3600 ((and (= (length args) 2)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3601 (memq old args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3602 (if (eq old (nth 0 args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3603 (nth 1 args)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3604 (nth 0 args)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3605 (t
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3606 (while args
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3607 (setq current (car args)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3608 args (cdr args))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3609 (setq choices
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3610 (cons (cons (widget-apply current :menu-tag-get)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3611 current)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3612 choices)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3613 (let ((val (completing-read prompt choices nil t)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3614 (if (stringp val)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3615 (let ((try (try-completion val choices)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3616 (when (stringp try)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3617 (setq val try))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3618 (cdr (assoc val choices)))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3619 nil)))))
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3620 (if current
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3621 (widget-prompt-value current prompt nil t)
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3622 value)))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3623
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3624 (define-widget 'radio 'radio-button-choice
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3625 "A union of several sexp types."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3626 :tag "Choice"
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3627 :format "%{%t%}:\n%v"
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3628 :prompt-value 'widget-choice-prompt-value)
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3629
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3630 (define-widget 'repeat 'editable-list
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3631 "A variable length homogeneous list."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3632 :tag "Repeat"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3633 :format "%{%t%}:\n%v%i\n")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3634
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3635 (define-widget 'set 'checklist
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3636 "A list of members from a fixed set."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3637 :tag "Set"
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3638 :format "%{%t%}:\n%v")
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3639
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3640 (define-widget 'boolean 'toggle
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3641 "To be nil or non-nil, that is the question."
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3642 :tag "Boolean"
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3643 :prompt-value 'widget-boolean-prompt-value
18258
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
3644 :button-prefix 'widget-push-button-prefix
e83bc8150072 Synched with 1.9920.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18244
diff changeset
3645 :button-suffix 'widget-push-button-suffix
18361
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
3646 :format "%{%t%}: %[Toggle%] %v\n"
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
3647 :on "on (non-nil)"
eecbc06aed1c (boolean): Capitalize "toggle".
Richard M. Stallman <rms@gnu.org>
parents: 18338
diff changeset
3648 :off "off (nil)")
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3649
17550
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3650 (defun widget-boolean-prompt-value (widget prompt value unbound)
d6545cfb6c5a Synched with custom 1.90.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17536
diff changeset
3651 ;; Toggle a boolean.
17799
0df9495348e7 Synched with 1.97.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 17550
diff changeset
3652 (y-or-n-p prompt))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3653
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3654 ;;; The `color' Widget.
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3655
47921
d69da0fafe03 (widget-choose): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents: 47741
diff changeset
3656 ;; Fixme: match
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3657 (define-widget 'color 'editable-field
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3658 "Choose a color name (with sample)."
66942
c94696e18de0 (color): Enclose %t in %{...%}.
Richard M. Stallman <rms@gnu.org>
parents: 66673
diff changeset
3659 :format "%{%t%}: %v (%{sample%})\n"
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3660 :size 10
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3661 :tag "Color"
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3662 :value "black"
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3663 :complete 'widget-color-complete
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3664 :sample-face-get 'widget-color-sample-face-get
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3665 :notify 'widget-color-notify
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3666 :action 'widget-color-action)
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3667
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3668 (defun widget-color-complete (widget)
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3669 "Complete the color in WIDGET."
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3670 (require 'facemenu) ; for facemenu-color-alist
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3671 (let* ((prefix (buffer-substring-no-properties (widget-field-start widget)
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3672 (point)))
45427
9133a6a4abf8 (widget-color-complete): Don't cons needlessly.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 45200
diff changeset
3673 (list (or facemenu-color-alist (defined-colors)))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3674 (completion (try-completion prefix list)))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3675 (cond ((eq completion t)
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3676 (message "Exact match."))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3677 ((null completion)
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3678 (error "Can't find completion for \"%s\"" prefix))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3679 ((not (string-equal prefix completion))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3680 (insert-and-inherit (substring completion (length prefix))))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3681 (t
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3682 (message "Making completion list...")
30982
7e7ba448ad10 (widget-choose, widget-choice-mouse-down-action):
Dave Love <fx@gnu.org>
parents: 30539
diff changeset
3683 (with-output-to-temp-buffer "*Completions*"
66114
13abee3a9bc6 * message.el (message-expand-group): Pass the common
Masatake YAMATO <jet@gyve.org>
parents: 65868
diff changeset
3684 (display-completion-list (all-completions prefix list nil)
13abee3a9bc6 * message.el (message-expand-group): Pass the common
Masatake YAMATO <jet@gyve.org>
parents: 65868
diff changeset
3685 prefix))
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3686 (message "Making completion list...done")))))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3687
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3688 (defun widget-color-sample-face-get (widget)
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
3689 (let* ((value (condition-case nil
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
3690 (widget-value widget)
37220
bd650fe3380e (widget-color-sample-face-get): Don't make
Gerd Moellmann <gerd@gnu.org>
parents: 36218
diff changeset
3691 (error (widget-get widget :value)))))
bd650fe3380e (widget-color-sample-face-get): Don't make
Gerd Moellmann <gerd@gnu.org>
parents: 36218
diff changeset
3692 (if (color-defined-p value)
38235
c6078ee53ddf (widget-color-sample-face-get): Return ((foreground-color . COLOR))
Richard M. Stallman <rms@gnu.org>
parents: 37220
diff changeset
3693 (list (cons 'foreground-color value))
37220
bd650fe3380e (widget-color-sample-face-get): Don't make
Gerd Moellmann <gerd@gnu.org>
parents: 36218
diff changeset
3694 'default)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3695
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3696 (defun widget-color-action (widget &optional event)
35264
689589ab80b3 (function): Add :match-alternatives.
Dave Love <fx@gnu.org>
parents: 35155
diff changeset
3697 "Prompt for a color."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3698 (let* ((tag (widget-apply widget :menu-tag-get))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3699 (prompt (concat tag ": "))
19022
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
3700 (value (widget-value widget))
904dcdbb8576 Synched with 1.9951.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18638
diff changeset
3701 (start (widget-field-start widget))
27655
f894902025ff (widgets) [defgroup]: Remove url link.
Dave Love <fx@gnu.org>
parents: 26386
diff changeset
3702 (answer (facemenu-read-color prompt)))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3703 (unless (zerop (length answer))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3704 (widget-value-set widget answer)
18090
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
3705 (widget-setup)
2983683a278b Synched with 1.9905
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18089
diff changeset
3706 (widget-apply widget :notify widget event))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3707
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3708 (defun widget-color-notify (widget child &optional event)
64565
e4fcf58d872c (widget-default-create, widget-after-change, widget-default-format-handler,
Juanma Barranquero <lekktu@gmail.com>
parents: 64504
diff changeset
3709 "Update the sample, and notify the parent."
29402
3bb8d5adf524 byte-compile-dynamic since we typically don't use
Dave Love <fx@gnu.org>
parents: 28780
diff changeset
3710 (overlay-put (widget-get widget :sample-overlay)
18600
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3711 'face (widget-apply widget :sample-face-get))
d95acbbb4ac7 Synched with 1.9945.
Per Abrahamsen <abraham@dina.kvl.dk>
parents: 18598
diff changeset
3712 (widget-default-notify widget child event))
24107
c222b0bea4f0 (plist, alist): New widget types.
Richard M. Stallman <rms@gnu.org>
parents: 23243
diff changeset
3713
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3714 ;;; The Help Echo
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3715
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3716 (defun widget-echo-help (pos)
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
3717 "Display help-echo text for widget at POS."
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3718 (let* ((widget (widget-at pos))
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3719 (help-echo (and widget (widget-get widget :help-echo))))
33519
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
3720 (if (functionp help-echo)
75fdaf22e3f2 (widget-specify-field, widget-specify-button): If
Dave Love <fx@gnu.org>
parents: 33171
diff changeset
3721 (setq help-echo (funcall help-echo widget)))
52245
1f6577b47562 (widget-echo-help): Make it handle expressions that evaluate to
Luc Teirlinck <teirllm@auburn.edu>
parents: 51363
diff changeset
3722 (if help-echo (message "%s" (eval help-echo)))))
17334
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3723
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3724 ;;; The End:
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3725
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3726 (provide 'wid-edit)
1effe507ea85 Initial revision
Per Abrahamsen <abraham@dina.kvl.dk>
parents:
diff changeset
3727
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52245
diff changeset
3728 ;;; arch-tag: a076e75e-18a1-4b46-8be5-3f317bcbc707
30246
e99b2e89fa59 (widget-specify-field, widget-specify-button): Allow
Dave Love <fx@gnu.org>
parents: 29954
diff changeset
3729 ;;; wid-edit.el ends here