(window_scroll): Set immediate_quit.
[bpt/emacs.git] / man / widget.texi
CommitLineData
6bf7aab6
DL
1\input texinfo.tex
2
3@c %**start of header
4@setfilename ../info/widget
5@settitle The Emacs Widget Library
18f952d5
KB
6@syncodeindex fn cp
7@syncodeindex vr cp
8@syncodeindex ky cp
9@afourpaper
10@c %**end of header
11
12@copying
13Copyright @copyright{} 2000, 2002 Free Software Foundation, Inc.
a159375d 14
18f952d5 15@quotation
a159375d
DL
16Permission is granted to copy, distribute and/or modify this document
17under the terms of the GNU Free Documentation License, Version 1.1 or
18any later version published by the Free Software Foundation; with the
19Invariant Sections being ``The GNU Manifesto'', ``Distribution'' and
20``GNU GENERAL PUBLIC LICENSE'', with the Front-Cover texts being ``A GNU
21Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
22license is included in the section entitled ``GNU Free Documentation
23License'' in the Emacs manual.
24
25This document is part of a collection distributed under the GNU Free
26Documentation License. If you want to distribute this document
27separately from the collection, you can do so by adding a copy of the
28license to the document, as described in section 6 of the license.
29
30(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
31this GNU Manual, like GNU software. Copies published by the Free
32Software Foundation raise funds for GNU development.''
18f952d5
KB
33@end quotation
34@end copying
6f7f063d 35
4c2ca4f3 36@dircategory Emacs
6bf7aab6 37@direntry
a1566793
EZ
38* Widget: (widget). The "widget" package used by the Emacs Customization
39 facility.
6bf7aab6
DL
40@end direntry
41
42@node Top, Introduction, (dir), (dir)
43@comment node-name, next, previous, up
44@top The Emacs Widget Library
45
6bf7aab6
DL
46@menu
47* Introduction::
48* User Interface::
49* Programming Example::
50* Setting Up the Buffer::
51* Basic Types::
52* Sexp Types::
53* Widget Properties::
54* Defining New Widgets::
55* Widget Browser::
56* Widget Minor Mode::
57* Utilities::
58* Widget Wishlist::
6f7f063d 59* Index::
6bf7aab6
DL
60@end menu
61
62@node Introduction, User Interface, Top, Top
63@comment node-name, next, previous, up
64@section Introduction
65
ce8abc78
RS
66Most graphical user interface toolkits provide a number of standard
67user interface controls (sometimes known as `widgets' or `gadgets').
68Emacs doesn't really support anything like this, except for an
69incredibly powerful text ``widget.'' On the other hand, Emacs does
70provide the necessary primitives to implement many other widgets
71within a text buffer. The @code{widget} package simplifies this task.
6bf7aab6 72
6f7f063d
EZ
73@cindex basic widgets
74@cindex widgets, basic types
6bf7aab6
DL
75The basic widgets are:
76
77@table @code
78@item link
79Areas of text with an associated action. Intended for hypertext links
80embedded in text.
81@item push-button
82Like link, but intended for stand-alone buttons.
83@item editable-field
84An editable text field. It can be either variable or fixed length.
85@item menu-choice
86Allows the user to choose one of multiple options from a menu, each
87option is itself a widget. Only the selected option will be visible in
88the buffer.
89@item radio-button-choice
90Allows the user to choose one of multiple options by activating radio
91buttons. The options are implemented as widgets. All options will be
92visible in the buffer.
93@item item
94A simple constant widget intended to be used in the @code{menu-choice} and
95@code{radio-button-choice} widgets.
96@item choice-item
6f7f063d 97A button item only intended for use in choices. When invoked, the user
6bf7aab6
DL
98will be asked to select another option from the choice widget.
99@item toggle
100A simple @samp{on}/@samp{off} switch.
101@item checkbox
102A checkbox (@samp{[ ]}/@samp{[X]}).
103@item editable-list
104Create an editable list. The user can insert or delete items in the
105list. Each list item is itself a widget.
106@end table
107
6f7f063d 108Now, of what possible use can support for widgets be in a text editor?
6bf7aab6
DL
109I'm glad you asked. The answer is that widgets are useful for
110implementing forms. A @dfn{form} in Emacs is a buffer where the user is
111supposed to fill out a number of fields, each of which has a specific
112meaning. The user is not supposed to change or delete any of the text
113between the fields. Examples of forms in Emacs are the @file{forms}
114package (of course), the customize buffers, the mail and news compose
115modes, and the @sc{html} form support in the @file{w3} browser.
116
6f7f063d 117@cindex widget library, why use it
6bf7aab6
DL
118The advantages for a programmer of using the @code{widget} package to
119implement forms are:
120
121@enumerate
122@item
6f7f063d 123More complex fields than just editable text are supported.
6bf7aab6 124@item
6f7f063d 125You can give the users immediate feedback if they enter invalid data in a
6bf7aab6
DL
126text field, and sometimes prevent entering invalid data.
127@item
6f7f063d 128You can have fixed sized fields, thus allowing multiple fields to be
6bf7aab6
DL
129lined up in columns.
130@item
131It is simple to query or set the value of a field.
132@item
6f7f063d 133Editing happens in the buffer, not in the mini-buffer.
6bf7aab6
DL
134@item
135Packages using the library get a uniform look, making them easier for
136the user to learn.
137@item
6f7f063d
EZ
138As support for embedded graphics improve, the widget library will be
139extended to use the GUI features. This means that your code using the
140widget library will also use the new graphic features automatically.
6bf7aab6
DL
141@end enumerate
142
143In order to minimize the code that is loaded by users who does not
144create any widgets, the code has been split in two files:
145
6f7f063d 146@cindex widget library, files
6bf7aab6
DL
147@table @file
148@item widget.el
149This will declare the user variables, define the function
75ba82a9 150@code{define-widget}, and autoload the function @code{widget-create}.
6bf7aab6
DL
151@item wid-edit.el
152Everything else is here, there is no reason to load it explicitly, as
153it will be autoloaded when needed.
154@end table
155
156@node User Interface, Programming Example, Introduction, Top
157@comment node-name, next, previous, up
158@section User Interface
159
160A form consist of read only text for documentation and some fields,
6f7f063d
EZ
161where each field contains two parts, a tag and a value. The tags are
162used to identify the fields, so the documentation can refer to the
163@samp{foo field}, meaning the field tagged with @samp{Foo}. Here is an
164example form:
6bf7aab6
DL
165
166@example
167Here is some documentation.
168
169Name: @i{My Name} @strong{Choose}: This option
170Address: @i{Some Place
171In some City
172Some country.}
173
174See also @b{_other work_} for more information.
175
176Numbers: count to three below
976e00f1
DL
177@b{[INS]} @b{[DEL]} @i{One}
178@b{[INS]} @b{[DEL]} @i{Eh, two?}
179@b{[INS]} @b{[DEL]} @i{Five!}
180@b{[INS]}
6bf7aab6
DL
181
182Select multiple:
183
184@b{[X]} This
185@b{[ ]} That
186@b{[X]} Thus
187
188Select one:
189
190@b{(*)} One
191@b{( )} Another One.
192@b{( )} A Final One.
193
194@b{[Apply Form]} @b{[Reset Form]}
195@end example
196
197The top level widgets in is example are tagged @samp{Name},
198@samp{Choose}, @samp{Address}, @samp{_other work_}, @samp{Numbers},
199@samp{Select multiple}, @samp{Select one}, @samp{[Apply Form]}, and
6f7f063d
EZ
200@samp{[Reset Form]}. There are basically two things the user can do
201within a form, namely editing the editable text fields and activating
202the buttons.
6bf7aab6
DL
203
204@subsection Editable Text Fields
205
206In the example, the value for the @samp{Name} is most likely displayed
207in an editable text field, and so are values for each of the members of
208the @samp{Numbers} list. All the normal Emacs editing operations are
209available for editing these fields. The only restriction is that each
210change you make must be contained within a single editable text field.
211For example, capitalizing all text from the middle of one field to the
212middle of another field is prohibited.
213
214Editing text fields are created by the @code{editable-field} widget.
215
216The editing text fields are highlighted with the
217@code{widget-field-face} face, making them easy to find.
218
219@deffn Face widget-field-face
220Face used for other editing fields.
221@end deffn
222
223@subsection Buttons
224
6f7f063d
EZ
225@cindex widget buttons
226@cindex button widgets
6bf7aab6
DL
227Some portions of the buffer have an associated @dfn{action}, which can
228be @dfn{invoked} by a standard key or mouse command. These portions
229are called @dfn{buttons}. The default commands for activating a button
230are:
231
232@table @kbd
233@item @key{RET}
234@deffn Command widget-button-press @var{pos} &optional @var{event}
235Invoke the button at @var{pos}, defaulting to point.
236If point is not located on a button, invoke the binding in
237@code{widget-global-map} (by default the global map).
238@end deffn
239
ce8abc78
RS
240@kindex Mouse-2 @r{(on button widgets})
241@item Mouse-2
6bf7aab6
DL
242@deffn Command widget-button-click @var{event}
243Invoke the button at the location of the mouse pointer. If the mouse
244pointer is located in an editable text field, invoke the binding in
245@code{widget-global-map} (by default the global map).
246@end deffn
247@end table
248
249There are several different kind of buttons, all of which are present in
250the example:
251
252@table @emph
6f7f063d
EZ
253@cindex option field tag
254@item The Option Field Tags
6bf7aab6
DL
255When you invoke one of these buttons, you will be asked to choose
256between a number of different options. This is how you edit an option
257field. Option fields are created by the @code{menu-choice} widget. In
258the example, @samp{@b{Choose}} is an option field tag.
976e00f1 259@item The @samp{@b{[INS]}} and @samp{@b{[DEL]}} buttons
6f7f063d 260Activating these will insert or delete elements from an editable list.
6bf7aab6 261The list is created by the @code{editable-list} widget.
6f7f063d
EZ
262@cindex embedded buttons
263@item Embedded Buttons
6bf7aab6 264The @samp{@b{_other work_}} is an example of an embedded
6f7f063d 265button. Embedded buttons are not associated with a fields, but can serve
6bf7aab6
DL
266any purpose, such as implementing hypertext references. They are
267usually created by the @code{link} widget.
6f7f063d 268@item The @samp{@b{[ ]}} and @samp{@b{[X]}} buttons
6bf7aab6 269Activating one of these will convert it to the other. This is useful
6f7f063d
EZ
270for implementing multiple-choice fields. You can create it with the
271@code{checkbox} widget.
272@item The @samp{@b{( )}} and @samp{@b{(*)}} buttons
6bf7aab6
DL
273Only one radio button in a @code{radio-button-choice} widget can be
274selected at any time. When you invoke one of the unselected radio
275buttons, it will be selected and the previous selected radio button will
276become unselected.
6f7f063d
EZ
277@item The @samp{@b{[Apply Form]}} @samp{@b{[Reset Form]}} buttons
278These are explicit buttons made with the @code{push-button} widget. The
279main difference from the @code{link} widget is that the buttons will be
6bf7aab6 280displayed as GUI buttons when possible.
6bf7aab6
DL
281@end table
282
283To make them easier to locate, buttons are emphasized in the buffer.
284
285@deffn Face widget-button-face
286Face used for buttons.
287@end deffn
288
289@defopt widget-mouse-face
6f7f063d
EZ
290Face used for highlighting a button when the mouse pointer moves across
291it.
6bf7aab6
DL
292@end defopt
293
294@subsection Navigation
295
296You can use all the normal Emacs commands to move around in a form
297buffer, plus you will have these additional commands:
298
299@table @kbd
300@item @key{TAB}
301@deffn Command widget-forward &optional count
302Move point @var{count} buttons or editing fields forward.
303@end deffn
304@item @key{M-TAB}
305@deffn Command widget-backward &optional count
306Move point @var{count} buttons or editing fields backward.
307@end deffn
308@end table
309
310@node Programming Example, Setting Up the Buffer, User Interface, Top
311@comment node-name, next, previous, up
312@section Programming Example
313
6f7f063d
EZ
314@cindex widgets, programming example
315@cindex example of using widgets
6bf7aab6
DL
316Here is the code to implement the user interface example (@pxref{User
317Interface}).
318
319@lisp
320(require 'widget)
321
322(eval-when-compile
323 (require 'wid-edit))
324
325(defvar widget-example-repeat)
326
327(defun widget-example ()
328 "Create the widgets from the Widget manual."
329 (interactive)
330 (switch-to-buffer "*Widget Example*")
331 (kill-all-local-variables)
332 (make-local-variable 'widget-example-repeat)
333 (let ((inhibit-read-only t))
334 (erase-buffer))
335 (widget-insert "Here is some documentation.\n\nName: ")
336 (widget-create 'editable-field
337 :size 13
338 "My Name")
339 (widget-create 'menu-choice
340 :tag "Choose"
341 :value "This"
342 :help-echo "Choose me, please!"
343 :notify (lambda (widget &rest ignore)
344 (message "%s is a good choice!"
345 (widget-value widget)))
346 '(item :tag "This option" :value "This")
347 '(choice-item "That option")
348 '(editable-field :menu-tag "No option" "Thus option"))
349 (widget-insert "Address: ")
350 (widget-create 'editable-field
351 "Some Place\nIn some City\nSome country.")
352 (widget-insert "\nSee also ")
353 (widget-create 'link
354 :notify (lambda (&rest ignore)
355 (widget-value-set widget-example-repeat
356 '("En" "To" "Tre"))
357 (widget-setup))
358 "other work")
ec45fa10
EZ
359 (widget-insert
360 " for more information.\n\nNumbers: count to three below\n")
6bf7aab6
DL
361 (setq widget-example-repeat
362 (widget-create 'editable-list
363 :entry-format "%i %d %v"
364 :notify (lambda (widget &rest ignore)
365 (let ((old (widget-get widget
366 ':example-length))
367 (new (length (widget-value widget))))
368 (unless (eq old new)
369 (widget-put widget ':example-length new)
370 (message "You can count to %d." new))))
371 :value '("One" "Eh, two?" "Five!")
372 '(editable-field :value "three")))
373 (widget-insert "\n\nSelect multiple:\n\n")
374 (widget-create 'checkbox t)
375 (widget-insert " This\n")
376 (widget-create 'checkbox nil)
377 (widget-insert " That\n")
378 (widget-create 'checkbox
379 :notify (lambda (&rest ignore) (message "Tickle"))
380 t)
381 (widget-insert " Thus\n\nSelect one:\n\n")
382 (widget-create 'radio-button-choice
383 :value "One"
384 :notify (lambda (widget &rest ignore)
385 (message "You selected %s"
386 (widget-value widget)))
387 '(item "One") '(item "Another One.") '(item "A Final One."))
388 (widget-insert "\n")
389 (widget-create 'push-button
390 :notify (lambda (&rest ignore)
391 (if (= (length (widget-value widget-example-repeat))
392 3)
393 (message "Congratulation!")
394 (error "Three was the count!")))
395 "Apply Form")
396 (widget-insert " ")
397 (widget-create 'push-button
398 :notify (lambda (&rest ignore)
399 (widget-example))
400 "Reset Form")
401 (widget-insert "\n")
402 (use-local-map widget-keymap)
403 (widget-setup))
404@end lisp
405
406@node Setting Up the Buffer, Basic Types, Programming Example, Top
407@comment node-name, next, previous, up
408@section Setting Up the Buffer
409
410Widgets are created with @code{widget-create}, which returns a
411@dfn{widget} object. This object can be queried and manipulated by
412other widget functions, until it is deleted with @code{widget-delete}.
413After the widgets have been created, @code{widget-setup} must be called
414to enable them.
415
416@defun widget-create type [ keyword argument ]@dots{}
417Create and return a widget of type @var{type}.
418The syntax for the @var{type} argument is described in @ref{Basic Types}.
419
420The keyword arguments can be used to overwrite the keyword arguments
421that are part of @var{type}.
422@end defun
423
424@defun widget-delete widget
425Delete @var{widget} and remove it from the buffer.
426@end defun
427
428@defun widget-setup
6f7f063d 429Set up a buffer to support widgets.
6bf7aab6
DL
430
431This should be called after creating all the widgets and before allowing
432the user to edit them.
433@refill
434@end defun
435
436If you want to insert text outside the widgets in the form, the
437recommended way to do that is with @code{widget-insert}.
438
439@defun widget-insert
440Insert the arguments, either strings or characters, at point.
6f7f063d 441The inserted text will be read-only.
6bf7aab6
DL
442@end defun
443
444There is a standard widget keymap which you might find useful.
445
6f7f063d
EZ
446@findex widget-button-press
447@findex widget-button-click
6bf7aab6
DL
448@defvr Const widget-keymap
449A keymap with the global keymap as its parent.@*
450@key{TAB} and @kbd{C-@key{TAB}} are bound to @code{widget-forward} and
ce8abc78 451@code{widget-backward}, respectively. @key{RET} and @kbd{Mouse-2}
6bf7aab6 452are bound to @code{widget-button-press} and
6f7f063d 453@code{widget-button-click}.@refill
6bf7aab6
DL
454@end defvr
455
456@defvar widget-global-map
457Keymap used by @code{widget-button-press} and @code{widget-button-click}
458when not on a button. By default this is @code{global-map}.
459@end defvar
460
461@node Basic Types, Sexp Types, Setting Up the Buffer, Top
462@comment node-name, next, previous, up
463@section Basic Types
464
465The syntax of a type specification is given below:
466
467@example
468NAME ::= (NAME [KEYWORD ARGUMENT]... ARGS)
469 | NAME
470@end example
471
472Where, @var{name} is a widget name, @var{keyword} is the name of a
473property, @var{argument} is the value of the property, and @var{args}
474are interpreted in a widget specific way.
475
6f7f063d
EZ
476@cindex keyword arguments
477The following keyword arguments that apply to all widgets:
6bf7aab6
DL
478
479@table @code
6f7f063d 480@vindex value@r{ keyword}
6bf7aab6
DL
481@item :value
482The initial value for widgets of this type.
483
6f7f063d 484@vindex format@r{ keyword}
6bf7aab6
DL
485@item :format
486This string will be inserted in the buffer when you create a widget.
487The following @samp{%} escapes are available:
488
489@table @samp
490@item %[
491@itemx %]
492The text inside will be marked as a button.
493
494By default, the text will be shown in @code{widget-button-face}, and
495surrounded by brackets.
496
497@defopt widget-button-prefix
498String to prefix buttons.
499@end defopt
500
501@defopt widget-button-suffix
502String to suffix buttons.
503@end defopt
504
505@item %@{
506@itemx %@}
507The text inside will be displayed with the face specified by
508@code{:sample-face}.
509
510@item %v
54438eb5 511This will be replaced with the buffer representation of the widget's
6bf7aab6
DL
512value. What this is depends on the widget type.
513
514@item %d
515Insert the string specified by @code{:doc} here.
516
517@item %h
518Like @samp{%d}, with the following modifications: If the documentation
519string is more than one line, it will add a button which will toggle
520between showing only the first line, and showing the full text.
521Furthermore, if there is no @code{:doc} property in the widget, it will
522instead examine the @code{:documentation-property} property. If it is a
523lambda expression, it will be called with the widget's value as an
524argument, and the result will be used as the documentation text.
525
526@item %t
527Insert the string specified by @code{:tag} here, or the @code{princ}
528representation of the value if there is no tag.
529
530@item %%
531Insert a literal @samp{%}.
532@end table
533
6f7f063d 534@vindex button-face@r{ keyword}
6bf7aab6
DL
535@item :button-face
536Face used to highlight text inside %[ %] in the format.
537
6f7f063d
EZ
538@vindex button-prefix@r{ keyword}
539@vindex button-suffix@r{ keyword}
6bf7aab6
DL
540@item :button-prefix
541@itemx :button-suffix
6bf7aab6
DL
542Text around %[ %] in the format.
543
544These can be
545@table @emph
546@item nil
547No text is inserted.
548
549@item a string
550The string is inserted literally.
551
552@item a symbol
553The value of the symbol is expanded according to this table.
554@end table
555
6f7f063d 556@vindex doc@r{ keyword}
6bf7aab6
DL
557@item :doc
558The string inserted by the @samp{%d} escape in the format
559string.
560
6f7f063d 561@vindex tag@r{ keyword}
6bf7aab6
DL
562@item :tag
563The string inserted by the @samp{%t} escape in the format
564string.
565
6f7f063d 566@vindex tag-glyph@r{ keyword}
6bf7aab6 567@item :tag-glyph
6f7f063d 568Name of image to use instead of the string specified by @code{:tag} on
6bf7aab6
DL
569Emacsen that supports it.
570
6f7f063d 571@vindex help-echo@r{ keyword}
6bf7aab6 572@item :help-echo
a159375d
DL
573Specifies how to display a message whenever you move to the widget with
574either @code{widget-forward} or @code{widget-backward} or move the mouse
56600dfa 575over it (using the standard @code{help-echo} mechanism). The argument
a159375d
DL
576is either a string to display or a function of one argument, the widget,
577which should return a string to display.
6bf7aab6 578
6f7f063d 579@vindex indent@r{ keyword}
6bf7aab6
DL
580@item :indent
581An integer indicating the absolute number of spaces to indent children
582of this widget.
583
6f7f063d 584@vindex offset@r{ keyword}
6bf7aab6
DL
585@item :offset
586An integer indicating how many extra spaces to add to the widget's
587grandchildren compared to this widget.
588
6f7f063d 589@vindex extra-offset@r{ keyword}
6bf7aab6
DL
590@item :extra-offset
591An integer indicating how many extra spaces to add to the widget's
592children compared to this widget.
593
6f7f063d 594@vindex notify@r{ keyword}
6bf7aab6
DL
595@item :notify
596A function called each time the widget or a nested widget is changed.
597The function is called with two or three arguments. The first argument
598is the widget itself, the second argument is the widget that was
599changed, and the third argument is the event leading to the change, if
600any.
601
6f7f063d 602@vindex menu-tag@r{ keyword}
6bf7aab6
DL
603@item :menu-tag
604Tag used in the menu when the widget is used as an option in a
605@code{menu-choice} widget.
606
6f7f063d 607@vindex menu-tag-get@r{ keyword}
6bf7aab6
DL
608@item :menu-tag-get
609Function used for finding the tag when the widget is used as an option
610in a @code{menu-choice} widget. By default, the tag used will be either the
611@code{:menu-tag} or @code{:tag} property if present, or the @code{princ}
612representation of the @code{:value} property if not.
613
6f7f063d 614@vindex match@r{ keyword}
6bf7aab6
DL
615@item :match
616Should be a function called with two arguments, the widget and a value,
617and returning non-nil if the widget can represent the specified value.
618
6f7f063d 619@vindex validate@r{ keyword}
6bf7aab6 620@item :validate
6f7f063d
EZ
621A function which takes a widget as an argument, and returns @code{nil}
622if the widget's current value is valid for the widget. Otherwise it
623should return the widget containing the invalid data, and set that
624widget's @code{:error} property to a string explaining the error.
6bf7aab6
DL
625
626The following predefined function can be used:
627
628@defun widget-children-validate widget
629All the @code{:children} of @var{widget} must be valid.
630@end defun
631
6f7f063d 632@vindex tab-order@r{ keyword}
6bf7aab6
DL
633@item :tab-order
634Specify the order in which widgets are traversed with
635@code{widget-forward} or @code{widget-backward}. This is only partially
636implemented.
637
638@enumerate a
639@item
640Widgets with tabbing order @code{-1} are ignored.
641
642@item
643(Unimplemented) When on a widget with tabbing order @var{n}, go to the
644next widget in the buffer with tabbing order @var{n+1} or @code{nil},
645whichever comes first.
646
647@item
648When on a widget with no tabbing order specified, go to the next widget
649in the buffer with a positive tabbing order, or @code{nil}
650@end enumerate
651
6f7f063d 652@vindex parent@r{ keyword}
6bf7aab6 653@item :parent
a159375d 654The parent of a nested widget (e.g.@: a @code{menu-choice} item or an
6bf7aab6
DL
655element of a @code{editable-list} widget).
656
6f7f063d 657@vindex sibling-args@r{ keyword}
6bf7aab6
DL
658@item :sibling-args
659This keyword is only used for members of a @code{radio-button-choice} or
660@code{checklist}. The value should be a list of extra keyword
661arguments, which will be used when creating the @code{radio-button} or
662@code{checkbox} associated with this item.
663
664@end table
665
666@deffn {User Option} widget-glyph-directory
667Directory where glyphs are found.
668Widget will look here for a file with the same name as specified for the
6f7f063d 669image, with either a @file{.xpm} (if supported) or @file{.xbm} extension.
6bf7aab6
DL
670@end deffn
671
672@deffn{User Option} widget-glyph-enable
673If non-nil, allow glyphs to appear on displays where they are supported.
674@end deffn
675
676
677@menu
678* link::
679* url-link::
680* info-link::
681* push-button::
682* editable-field::
683* text::
684* menu-choice::
685* radio-button-choice::
686* item::
687* choice-item::
688* toggle::
689* checkbox::
690* checklist::
691* editable-list::
692* group::
693@end menu
694
695@node link, url-link, Basic Types, Basic Types
696@comment node-name, next, previous, up
697@subsection The @code{link} Widget
6f7f063d 698@findex link@r{ widget}
6bf7aab6
DL
699
700Syntax:
701
702@example
703TYPE ::= (link [KEYWORD ARGUMENT]... [ VALUE ])
704@end example
705
706The @var{value}, if present, is used to initialize the @code{:value}
707property. The value should be a string, which will be inserted in the
708buffer.
709
710By default the link will be shown in brackets.
711
712@defopt widget-link-prefix
713String to prefix links.
714@end defopt
715
716@defopt widget-link-suffix
717String to suffix links.
718@end defopt
719
720@node url-link, info-link, link, Basic Types
721@comment node-name, next, previous, up
722@subsection The @code{url-link} Widget
6f7f063d 723@findex url-link@r{ widget}
6bf7aab6
DL
724
725Syntax:
726
727@example
728TYPE ::= (url-link [KEYWORD ARGUMENT]... URL)
729@end example
730
6f7f063d 731@findex browse-url-browser-function@r{, and @code{url-link} widget}
6bf7aab6
DL
732When this link is invoked, the @sc{www} browser specified by
733@code{browse-url-browser-function} will be called with @var{url}.
734
735@node info-link, push-button, url-link, Basic Types
736@comment node-name, next, previous, up
737@subsection The @code{info-link} Widget
6f7f063d 738@findex info-link@r{ widget}
6bf7aab6
DL
739
740Syntax:
741
742@example
743TYPE ::= (info-link [KEYWORD ARGUMENT]... ADDRESS)
744@end example
745
6f7f063d 746When this link is invoked, the built-in Info reader is started on
6bf7aab6
DL
747@var{address}.
748
749@node push-button, editable-field, info-link, Basic Types
750@comment node-name, next, previous, up
751@subsection The @code{push-button} Widget
6f7f063d 752@findex push-button@r{ widget}
6bf7aab6
DL
753
754Syntax:
755
756@example
757TYPE ::= (push-button [KEYWORD ARGUMENT]... [ VALUE ])
758@end example
759
760The @var{value}, if present, is used to initialize the @code{:value}
6f7f063d 761property. The value should be a string, which will be inserted in the
6bf7aab6
DL
762buffer.
763
764By default the tag will be shown in brackets.
765
766@defopt widget-push-button-prefix
767String to prefix push buttons.
768@end defopt
769
770@defopt widget-push-button-suffix
771String to suffix push buttons.
772@end defopt
773
774@node editable-field, text, push-button, Basic Types
775@comment node-name, next, previous, up
776@subsection The @code{editable-field} Widget
6f7f063d 777@findex editable-field@r{ widget}
6bf7aab6
DL
778
779Syntax:
780
781@example
782TYPE ::= (editable-field [KEYWORD ARGUMENT]... [ VALUE ])
783@end example
784
785The @var{value}, if present, is used to initialize the @code{:value}
786property. The value should be a string, which will be inserted in
787field. This widget will match all string values.
788
6f7f063d 789The following extra properties are recognized:
6bf7aab6
DL
790
791@table @code
6f7f063d 792@vindex size@r{ keyword}
6bf7aab6
DL
793@item :size
794The width of the editable field.@*
795By default the field will reach to the end of the line.
796
6f7f063d 797@vindex value-face@r{ keyword}
6bf7aab6
DL
798@item :value-face
799Face used for highlighting the editable field. Default is
6f7f063d 800@code{widget-field-face}, see @ref{User Interface}.
6bf7aab6 801
6f7f063d 802@vindex secret@r{ keyword}
6bf7aab6 803@item :secret
a159375d 804Character used to display the value. You can set this to e.g.@: @code{?*}
6bf7aab6 805if the field contains a password or other secret information. By
6f7f063d 806default, this is nil, and the value is not secret.
6bf7aab6 807
6f7f063d 808@vindex valid-regexp@r{ keyword}
6bf7aab6
DL
809@item :valid-regexp
810By default the @code{:validate} function will match the content of the
811field with the value of this attribute. The default value is @code{""}
812which matches everything.
813
6f7f063d
EZ
814@vindex keymap@r{ keyword}
815@vindex widget-field-keymap
6bf7aab6
DL
816@item :keymap
817Keymap used in the editable field. The default value is
818@code{widget-field-keymap}, which allows you to use all the normal
6f7f063d
EZ
819editing commands, even if the buffer's major mode suppresses some of
820them. Pressing @key{RET} invokes the function specified by
821@code{:action}.
6bf7aab6
DL
822@end table
823
824@node text, menu-choice, editable-field, Basic Types
825@comment node-name, next, previous, up
826@subsection The @code{text} Widget
6f7f063d 827@findex text@r{ widget}
6bf7aab6 828
6f7f063d 829@vindex widget-text-keymap
6bf7aab6
DL
830This is just like @code{editable-field}, but intended for multiline text
831fields. The default @code{:keymap} is @code{widget-text-keymap}, which
6f7f063d 832does not rebind the @key{RET} key.
6bf7aab6
DL
833
834@node menu-choice, radio-button-choice, text, Basic Types
835@comment node-name, next, previous, up
836@subsection The @code{menu-choice} Widget
6f7f063d 837@findex menu-choice@r{ widget}
6bf7aab6
DL
838
839Syntax:
840
841@example
842TYPE ::= (menu-choice [KEYWORD ARGUMENT]... TYPE ... )
843@end example
844
54438eb5
DL
845The @var{type} argument represents each possible choice. The widget's
846value will be that of the chosen @var{type} argument. This widget will
847match any value matching at least one of the specified @var{type}
848arguments.
6bf7aab6
DL
849
850@table @code
6f7f063d 851@vindex void@r{ keyword}
6bf7aab6
DL
852@item :void
853Widget type used as a fallback when the value does not match any of the
854specified @var{type} arguments.
855
6f7f063d 856@vindex case-fold@r{ keyword}
6bf7aab6
DL
857@item :case-fold
858Set this to nil if you don't want to ignore case when prompting for a
859choice through the minibuffer.
860
6f7f063d 861@vindex children@r{ keyword}
6bf7aab6 862@item :children
6f7f063d
EZ
863A list whose @code{car} is the widget representing the currently chosen
864type in the buffer.
6bf7aab6 865
6f7f063d 866@vindex choice@r{ keyword}
6bf7aab6 867@item :choice
6f7f063d 868The current chosen type.
6bf7aab6 869
6f7f063d 870@vindex args@r{ keyword}
6bf7aab6
DL
871@item :args
872The list of types.
873@end table
874
875@node radio-button-choice, item, menu-choice, Basic Types
876@comment node-name, next, previous, up
877@subsection The @code{radio-button-choice} Widget
6f7f063d 878@findex radio-button-choice@r{ widget}
6bf7aab6
DL
879
880Syntax:
881
882@example
883TYPE ::= (radio-button-choice [KEYWORD ARGUMENT]... TYPE ... )
884@end example
885
54438eb5
DL
886The @var{type} argument represents each possible choice. The widget's
887value will be that of the chosen @var{type} argument. This widget will
888match any value matching at least one of the specified @var{type}
889arguments.
6bf7aab6
DL
890
891The following extra properties are recognized.
892
893@table @code
6f7f063d 894@vindex entry-format@r{ keyword}
6bf7aab6
DL
895@item :entry-format
896This string will be inserted for each entry in the list.
897The following @samp{%} escapes are available:
898@table @samp
899@item %v
6f7f063d 900Replace with the buffer representation of the @var{type} widget.
6bf7aab6
DL
901@item %b
902Replace with the radio button.
903@item %%
904Insert a literal @samp{%}.
905@end table
906
6f7f063d
EZ
907@vindex button-args@r{ keyword}
908@item :button-args
6bf7aab6 909A list of keywords to pass to the radio buttons. Useful for setting
a159375d 910e.g.@: the @samp{:help-echo} for each button.
6bf7aab6 911
6f7f063d 912@vindex buttons@r{ keyword}
6bf7aab6
DL
913@item :buttons
914The widgets representing the radio buttons.
915
6f7f063d 916@vindex children@r{ keyword}
6bf7aab6
DL
917@item :children
918The widgets representing each type.
919
6f7f063d 920@vindex choice@r{ keyword}
6bf7aab6
DL
921@item :choice
922The current chosen type
923
6f7f063d 924@vindex args@r{ keyword}
6bf7aab6
DL
925@item :args
926The list of types.
927@end table
928
929You can add extra radio button items to a @code{radio-button-choice}
930widget after it has been created with the function
931@code{widget-radio-add-item}.
932
933@defun widget-radio-add-item widget type
6f7f063d
EZ
934Add to @code{radio-button-choice} widget @var{widget} a new radio button
935item of type @var{type}.
6bf7aab6
DL
936@end defun
937
938Please note that such items added after the @code{radio-button-choice}
939widget has been created will @strong{not} be properly destructed when
940you call @code{widget-delete}.
941
942@node item, choice-item, radio-button-choice, Basic Types
943@comment node-name, next, previous, up
944@subsection The @code{item} Widget
6f7f063d 945@findex item@r{ widget}
6bf7aab6
DL
946
947Syntax:
948
949@example
950ITEM ::= (item [KEYWORD ARGUMENT]... VALUE)
951@end example
952
953The @var{value}, if present, is used to initialize the @code{:value}
954property. The value should be a string, which will be inserted in the
955buffer. This widget will only match the specified value.
956
957@node choice-item, toggle, item, Basic Types
958@comment node-name, next, previous, up
959@subsection The @code{choice-item} Widget
6f7f063d 960@findex choice-item@r{ widget}
6bf7aab6
DL
961
962Syntax:
963
964@example
965ITEM ::= (choice-item [KEYWORD ARGUMENT]... VALUE)
966@end example
967
968The @var{value}, if present, is used to initialize the @code{:value}
969property. The value should be a string, which will be inserted in the
970buffer as a button. Activating the button of a @code{choice-item} is
971equivalent to activating the parent widget. This widget will only match
972the specified value.
973
974@node toggle, checkbox, choice-item, Basic Types
975@comment node-name, next, previous, up
976@subsection The @code{toggle} Widget
6f7f063d 977@findex toggle@r{ widget}
6bf7aab6
DL
978
979Syntax:
980
981@example
982TYPE ::= (toggle [KEYWORD ARGUMENT]...)
983@end example
984
6f7f063d
EZ
985The widget has two possible states, @samp{on} and @samp{off}, which
986correspond to a @code{t} or @code{nil} value, respectively.
6bf7aab6 987
6f7f063d 988The following extra properties are recognized:
6bf7aab6
DL
989
990@table @code
991@item :on
6f7f063d
EZ
992A string representing the @samp{on} state. By default the string
993@samp{on}.
6bf7aab6 994@item :off
6f7f063d
EZ
995A string representing the @samp{off} state. By default the string
996@samp{off}.
997@vindex on-glyph@r{ keyword}
6bf7aab6 998@item :on-glyph
6f7f063d
EZ
999Name of a glyph to be used instead of the @samp{:on} text string, on
1000emacsen that supports this.
1001@vindex off-glyph@r{ keyword}
6bf7aab6 1002@item :off-glyph
6f7f063d
EZ
1003Name of a glyph to be used instead of the @samp{:off} text string, on
1004emacsen that supports this.
6bf7aab6
DL
1005@end table
1006
1007@node checkbox, checklist, toggle, Basic Types
1008@comment node-name, next, previous, up
1009@subsection The @code{checkbox} Widget
6f7f063d 1010@findex checkbox@r{ widget}
6bf7aab6 1011
6f7f063d
EZ
1012This widget has two possible states, @samp{selected} and
1013@samp{unselected}, which corresponds to a @code{t} or @code{nil} value.
6bf7aab6
DL
1014
1015Syntax:
1016
1017@example
1018TYPE ::= (checkbox [KEYWORD ARGUMENT]...)
1019@end example
1020
1021@node checklist, editable-list, checkbox, Basic Types
1022@comment node-name, next, previous, up
1023@subsection The @code{checklist} Widget
6f7f063d 1024@findex checklist@r{ widget}
6bf7aab6
DL
1025
1026Syntax:
1027
1028@example
1029TYPE ::= (checklist [KEYWORD ARGUMENT]... TYPE ... )
1030@end example
1031
6f7f063d
EZ
1032The @var{type} arguments represent each checklist item. The widget's
1033value will be a list containing the values of all checked @var{type}
54438eb5
DL
1034arguments. The checklist widget will match a list whose elements all
1035match at least one of the specified @var{type} arguments.
6bf7aab6 1036
6f7f063d 1037The following extra properties are recognized:
6bf7aab6
DL
1038
1039@table @code
6f7f063d 1040@vindex entry-format@r{ keyword}
6bf7aab6
DL
1041@item :entry-format
1042This string will be inserted for each entry in the list.
1043The following @samp{%} escapes are available:
1044@table @samp
1045@item %v
1046Replaced with the buffer representation of the @var{type} widget.
1047@item %b
1048Replace with the checkbox.
1049@item %%
1050Insert a literal @samp{%}.
1051@end table
1052
6f7f063d 1053@vindex greedy@r{ keyword}
6bf7aab6 1054@item :greedy
54438eb5 1055Usually a checklist will only match if the items are in the exact
6bf7aab6
DL
1056sequence given in the specification. By setting @code{:greedy} to
1057non-nil, it will allow the items to come in any sequence. However, if
1058you extract the value they will be in the sequence given in the
a159375d 1059checklist, i.e.@: the original sequence is forgotten.
6bf7aab6 1060
6f7f063d 1061@vindex button-args@r{ keyword}
a159375d 1062@item :button-args
6bf7aab6 1063A list of keywords to pass to the checkboxes. Useful for setting
a159375d 1064e.g.@: the @samp{:help-echo} for each checkbox.
6bf7aab6 1065
6f7f063d 1066@vindex buttons@r{ keyword}
6bf7aab6
DL
1067@item :buttons
1068The widgets representing the checkboxes.
1069
6f7f063d 1070@vindex children@r{ keyword}
6bf7aab6
DL
1071@item :children
1072The widgets representing each type.
1073
6f7f063d 1074@vindex args@r{ keyword}
6bf7aab6
DL
1075@item :args
1076The list of types.
1077@end table
1078
1079@node editable-list, group, checklist, Basic Types
1080@comment node-name, next, previous, up
1081@subsection The @code{editable-list} Widget
6f7f063d 1082@findex editable-list@r{ widget}
6bf7aab6
DL
1083
1084Syntax:
1085
1086@example
1087TYPE ::= (editable-list [KEYWORD ARGUMENT]... TYPE)
1088@end example
1089
1090The value is a list, where each member represents one widget of type
1091@var{type}.
1092
6f7f063d 1093The following extra properties are recognized:
6bf7aab6
DL
1094
1095@table @code
6f7f063d 1096@vindex entry-format@r{ keyword}
6bf7aab6
DL
1097@item :entry-format
1098This string will be inserted for each entry in the list.
1099The following @samp{%} escapes are available:
1100@table @samp
1101@item %v
1102This will be replaced with the buffer representation of the @var{type}
1103widget.
1104@item %i
976e00f1 1105Insert the @b{[INS]} button.
6bf7aab6
DL
1106@item %d
1107Insert the @b{[DEL]} button.
1108@item %%
1109Insert a literal @samp{%}.
1110@end table
1111
976e00f1
DL
1112@vindex insert-button-args@r{ keyword}
1113@item :insert-button-args
6bf7aab6
DL
1114A list of keyword arguments to pass to the insert buttons.
1115
6f7f063d 1116@vindex delete-button-args@r{ keyword}
6bf7aab6
DL
1117@item :delete-button-args
1118A list of keyword arguments to pass to the delete buttons.
1119
6f7f063d 1120@vindex append-button-args@r{ keyword}
6bf7aab6
DL
1121@item :append-button-args
1122A list of keyword arguments to pass to the trailing insert button.
1123
6f7f063d 1124@vindex buttons@r{ keyword}
6bf7aab6
DL
1125@item :buttons
1126The widgets representing the insert and delete buttons.
1127
6f7f063d 1128@vindex children@r{ keyword}
6bf7aab6
DL
1129@item :children
1130The widgets representing the elements of the list.
1131
6f7f063d 1132@vindex args@r{ keyword}
6bf7aab6 1133@item :args
6f7f063d 1134List whose @code{car} is the type of the list elements.
6bf7aab6
DL
1135@end table
1136
1137@node group, , editable-list, Basic Types
1138@comment node-name, next, previous, up
1139@subsection The @code{group} Widget
6f7f063d 1140@findex group@r{ widget}
6bf7aab6 1141
6f7f063d 1142This widget simply group other widgets together.
6bf7aab6
DL
1143
1144Syntax:
1145
1146@example
1147TYPE ::= (group [KEYWORD ARGUMENT]... TYPE...)
1148@end example
1149
1150The value is a list, with one member for each @var{type}.
1151
1152@node Sexp Types, Widget Properties, Basic Types, Top
1153@comment
1154@section Sexp Types
6f7f063d 1155@cindex sexp types
6bf7aab6 1156
6f7f063d
EZ
1157A number of widgets for editing @dfn{s-expressions} (lisp types), sexp
1158for short, are also available. These basically fall in several
1159categories described in this section.
6bf7aab6
DL
1160
1161@menu
1162* constants::
1163* generic::
1164* atoms::
1165* composite::
1166@end menu
1167
1168@node constants, generic, Sexp Types, Sexp Types
1169@comment node-name, next, previous, up
6f7f063d
EZ
1170@subsection The Constant Widgets
1171@cindex constant widgets
6bf7aab6
DL
1172
1173The @code{const} widget can contain any lisp expression, but the user is
6f7f063d
EZ
1174prohibited from editing it, which is mainly useful as a component of one
1175of the composite widgets.
6bf7aab6 1176
6f7f063d 1177The syntax for the @code{const} widget is:
6bf7aab6
DL
1178
1179@example
1180TYPE ::= (const [KEYWORD ARGUMENT]... [ VALUE ])
1181@end example
1182
1183The @var{value}, if present, is used to initialize the @code{:value}
1184property and can be any s-expression.
1185
1186@deffn Widget const
1187This will display any valid s-expression in an immutable part of the
1188buffer.
1189@end deffn
1190
1191There are two variations of the @code{const} widget, namely
1192@code{variable-item} and @code{function-item}. These should contain a
1193symbol with a variable or function binding. The major difference from
1194the @code{const} widget is that they will allow the user to see the
1195variable or function documentation for the symbol.
1196
1197@deffn Widget variable-item
1198An immutable symbol that is bound as a variable.
1199@end deffn
1200
1201@deffn Widget function-item
1202An immutable symbol that is bound as a function.
1203@end deffn
1204
1205@node generic, atoms, constants, Sexp Types
1206@comment node-name, next, previous, up
6f7f063d
EZ
1207@subsection Generic Sexp Widget
1208@cindex generic sexp widget
6bf7aab6
DL
1209
1210The @code{sexp} widget can contain any lisp expression, and allows the
1211user to edit it inline in the buffer.
1212
6f7f063d 1213The syntax for the @code{sexp} widget is:
6bf7aab6
DL
1214
1215@example
1216TYPE ::= (sexp [KEYWORD ARGUMENT]... [ VALUE ])
1217@end example
1218
1219@deffn Widget sexp
1220This will allow you to edit any valid s-expression in an editable buffer
1221field.
1222
1223The @code{sexp} widget takes the same keyword arguments as the
6f7f063d 1224@code{editable-field} widget. @xref{editable-field}.
6bf7aab6
DL
1225@end deffn
1226
1227@node atoms, composite, generic, Sexp Types
1228@comment node-name, next, previous, up
6f7f063d
EZ
1229@subsection Atomic Sexp Widgets
1230@cindex atomic sexp widget
6bf7aab6 1231
6f7f063d
EZ
1232The atoms are s-expressions that do not consist of other s-expressions.
1233For example, a string, a file name, or a symbol are atoms, while a list
1234is a composite type. You can edit the value of an atom with the
1235following widgets.
6bf7aab6 1236
6f7f063d 1237The syntax for all the atoms are:
6bf7aab6
DL
1238
1239@example
1240TYPE ::= (NAME [KEYWORD ARGUMENT]... [ VALUE ])
1241@end example
1242
1243The @var{value}, if present, is used to initialize the @code{:value}
1244property and must be an expression of the same type as the widget.
6f7f063d 1245That is, the string widget can only be initialized with a string.
6bf7aab6
DL
1246
1247All the atom widgets take the same keyword arguments as the
6f7f063d 1248@code{editable-field} widget. @xref{editable-field}.
6bf7aab6
DL
1249
1250@deffn Widget string
1251Allows you to edit a string in an editable field.
1252@end deffn
1253
1254@deffn Widget regexp
1255Allows you to edit a regular expression in an editable field.
1256@end deffn
1257
1258@deffn Widget character
1259Allows you to enter a character in an editable field.
1260@end deffn
1261
1262@deffn Widget file
1263Allows you to edit a file name in an editable field. If you invoke
1264the tag button, you can edit the file name in the mini-buffer with
1265completion.
1266
1267Keywords:
1268@table @code
6f7f063d 1269@vindex must-match@r{ keyword}
6bf7aab6
DL
1270@item :must-match
1271If this is set to non-nil, only existing file names will be allowed in
1272the minibuffer.
1273@end table
1274@end deffn
1275
1276@deffn Widget directory
1277Allows you to edit a directory name in an editable field.
1278Similar to the @code{file} widget.
1279@end deffn
1280
1281@deffn Widget symbol
1282Allows you to edit a lisp symbol in an editable field.
1283@end deffn
1284
1285@deffn Widget function
1286Allows you to edit a lambda expression, or a function name with completion.
1287@end deffn
1288
1289@deffn Widget variable
1290Allows you to edit a variable name, with completion.
1291@end deffn
1292
1293@deffn Widget integer
1294Allows you to edit an integer in an editable field.
1295@end deffn
1296
1297@deffn Widget number
1298Allows you to edit a number in an editable field.
1299@end deffn
1300
1301@deffn Widget boolean
1302Allows you to edit a boolean. In lisp this means a variable which is
1303either nil meaning false, or non-nil meaning true.
1304@end deffn
1305
1306
1307@node composite, , atoms, Sexp Types
1308@comment node-name, next, previous, up
6f7f063d
EZ
1309@subsection Composite Sexp Widgets
1310@cindex composite sexp widgets
6bf7aab6 1311
6f7f063d 1312The syntax for the composite widget is:
6bf7aab6
DL
1313
1314@example
1315TYPE ::= (NAME [KEYWORD ARGUMENT]... COMPONENT...)
1316@end example
1317
6f7f063d
EZ
1318@noindent
1319where each @var{component} must be a widget type. Each component widget
1320will be displayed in the buffer, and will be editable by the user.
6bf7aab6
DL
1321
1322@deffn Widget cons
6f7f063d
EZ
1323The value of a @code{cons} widget is a cons-cell where the @code{car} is
1324the value of the first component and the @code{cdr} is the value of the
1325second component. There must be exactly two components.
6bf7aab6
DL
1326@end deffn
1327
1328@deffn Widget list
1329The value of a @code{list} widget is a list containing the value of
1330each of its component.
1331@end deffn
1332
1333@deffn Widget vector
1334The value of a @code{vector} widget is a vector containing the value of
1335each of its component.
1336@end deffn
1337
1338The above suffice for specifying fixed size lists and vectors. To get
1339variable length lists and vectors, you can use a @code{choice},
6f7f063d 1340@code{set}, or @code{repeat} widgets together with the @code{:inline}
6bf7aab6
DL
1341keywords. If any component of a composite widget has the @code{:inline}
1342keyword set, its value must be a list which will then be spliced into
1343the composite. For example, to specify a list whose first element must
1344be a file name, and whose remaining arguments should either by the
1345symbol @code{t} or two files, you can use the following widget
1346specification:
1347
1348@example
1349(list file
1350 (choice (const t)
1351 (list :inline t
1352 :value ("foo" "bar")
1353 string string)))
1354@end example
1355
1356The value of a widget of this type will either have the form
6f7f063d 1357@code{(file t)} or @code{(file string string)}.
6bf7aab6
DL
1358
1359This concept of inline is probably hard to understand. It was certainly
6f7f063d 1360hard to implement, so instead of confusing you more by trying to explain
54438eb5 1361it here, I'll just suggest you meditate over it for a while.
6bf7aab6
DL
1362
1363@deffn Widget choice
54438eb5
DL
1364Allows you to edit a sexp which may have one of a fixed set of types.
1365It is currently implemented with the @code{choice-menu} basic widget,
1366and has a similar syntax.
6bf7aab6
DL
1367@end deffn
1368
1369@deffn Widget set
1370Allows you to specify a type which must be a list whose elements all
6f7f063d
EZ
1371belong to given set. The elements of the list are not significant.
1372This is implemented on top of the @code{checklist} basic widget, and has
1373a similar syntax.
6bf7aab6
DL
1374@end deffn
1375
1376@deffn Widget repeat
1377Allows you to specify a variable length list whose members are all of
6f7f063d
EZ
1378the same type. Implemented on top of the @code{editable-list} basic
1379widget, and has a similar syntax.
6bf7aab6
DL
1380@end deffn
1381
1382@node Widget Properties, Defining New Widgets, Sexp Types, Top
1383@comment node-name, next, previous, up
1384@section Properties
6f7f063d
EZ
1385@cindex properties of widgets
1386@cindex widget properties
6bf7aab6
DL
1387
1388You can examine or set the value of a widget by using the widget object
1389that was returned by @code{widget-create}.
1390
1391@defun widget-value widget
1392Return the current value contained in @var{widget}.
1393It is an error to call this function on an uninitialized widget.
1394@end defun
1395
1396@defun widget-value-set widget value
1397Set the value contained in @var{widget} to @var{value}.
1398It is an error to call this function with an invalid @var{value}.
1399@end defun
1400
1401@strong{Important:} You @emph{must} call @code{widget-setup} after
1402modifying the value of a widget before the user is allowed to edit the
1403widget again. It is enough to call @code{widget-setup} once if you
1404modify multiple widgets. This is currently only necessary if the widget
1405contains an editing field, but may be necessary for other widgets in the
1406future.
1407
1408If your application needs to associate some information with the widget
1409objects, for example a reference to the item being edited, it can be
1410done with @code{widget-put} and @code{widget-get}. The property names
1411must begin with a @samp{:}.
1412
1413@defun widget-put widget property value
1414In @var{widget} set @var{property} to @var{value}.
1415@var{property} should be a symbol, while @var{value} can be anything.
1416@end defun
1417
1418@defun widget-get widget property
1419In @var{widget} return the value for @var{property}.
1420@var{property} should be a symbol, the value is what was last set by
1421@code{widget-put} for @var{property}.
1422@end defun
1423
1424@defun widget-member widget property
1425Non-nil if @var{widget} has a value (even nil) for property @var{property}.
1426@end defun
1427
1428Occasionally it can be useful to know which kind of widget you have,
a159375d 1429i.e.@: the name of the widget type you gave when the widget was created.
6bf7aab6
DL
1430
1431@defun widget-type widget
1432Return the name of @var{widget}, a symbol.
1433@end defun
1434
6f7f063d
EZ
1435@cindex active widget
1436@cindex inactive widget
1437@cindex activate a widget
1438@cindex deactivate a widget
6bf7aab6
DL
1439Widgets can be in two states: active, which means they are modifiable by
1440the user, or inactive, which means they cannot be modified by the user.
1441You can query or set the state with the following code:
1442
1443@lisp
1444;; Examine if @var{widget} is active or not.
1445(if (widget-apply @var{widget} :active)
1446 (message "Widget is active.")
1447 (message "Widget is inactive.")
1448
1449;; Make @var{widget} inactive.
1450(widget-apply @var{widget} :deactivate)
1451
1452;; Make @var{widget} active.
1453(widget-apply @var{widget} :activate)
1454@end lisp
1455
54438eb5
DL
1456A widget is inactive if it, or any of its ancestors (found by
1457following the @code{:parent} link), have been deactivated. To make sure
1458a widget is really active, you must therefore activate both it and
6bf7aab6
DL
1459all its ancestors.
1460
1461@lisp
1462(while widget
1463 (widget-apply widget :activate)
1464 (setq widget (widget-get widget :parent)))
1465@end lisp
1466
1467You can check if a widget has been made inactive by examining the value
54438eb5
DL
1468of the @code{:inactive} keyword. If this is non-nil, the widget itself
1469has been deactivated. This is different from using the @code{:active}
1470keyword, in that the latter tells you if the widget @strong{or} any of
1471its ancestors have been deactivated. Do not attempt to set the
6bf7aab6 1472@code{:inactive} keyword directly. Use the @code{:activate}
54438eb5 1473@code{:deactivate} keywords instead.
6bf7aab6
DL
1474
1475
1476@node Defining New Widgets, Widget Browser, Widget Properties, Top
1477@comment node-name, next, previous, up
1478@section Defining New Widgets
6f7f063d
EZ
1479@cindex new widgets
1480@cindex defining new widgets
6bf7aab6 1481
75ba82a9 1482You can define specialized widgets with @code{define-widget}. It allows
6bf7aab6 1483you to create a shorthand for more complex widgets, including specifying
54438eb5 1484component widgets and new default values for the keyword
6bf7aab6
DL
1485arguments.
1486
75ba82a9 1487@defun define-widget name class doc &rest args
6bf7aab6
DL
1488Define a new widget type named @var{name} from @code{class}.
1489
1490@var{name} and class should both be symbols, @code{class} should be one
1491of the existing widget types.
1492
1493The third argument @var{DOC} is a documentation string for the widget.
1494
1495After the new widget has been defined, the following two calls will
1496create identical widgets:
1497
1498@itemize @bullet
1499@item
1500@lisp
1501(widget-create @var{name})
1502@end lisp
1503
1504@item
1505@lisp
1506(apply widget-create @var{class} @var{args})
1507@end lisp
1508@end itemize
1509
1510@end defun
1511
75ba82a9 1512Using @code{define-widget} just stores the definition of the widget type
54438eb5 1513in the @code{widget-type} property of @var{name}, which is what
6bf7aab6
DL
1514@code{widget-create} uses.
1515
6f7f063d 1516If you only want to specify defaults for keywords with no complex
6bf7aab6
DL
1517conversions, you can use @code{identity} as your conversion function.
1518
1519The following additional keyword arguments are useful when defining new
1520widgets:
1521@table @code
6f7f063d 1522@vindex convert-widget@r{ keyword}
6bf7aab6
DL
1523@item :convert-widget
1524Function to convert a widget type before creating a widget of that
1525type. It takes a widget type as an argument, and returns the converted
1526widget type. When a widget is created, this function is called for the
54438eb5 1527widget type and all the widget's parent types, most derived first.
6bf7aab6
DL
1528
1529The following predefined functions can be used here:
1530
1531@defun widget-types-convert-widget widget
1532Convert @code{:args} as widget types in @var{widget}.
1533@end defun
1534
1535@defun widget-value-convert-widget widget
1536Initialize @code{:value} from @code{:args} in @var{widget}.
1537@end defun
1538
4c2f559e
PA
1539@vindex copy@r{ keyword}
1540@item :copy
1541Function to deep copy a widget type. It takes a shallow copy of the
1542widget type as an argument (made by @code{copy-sequence}), and returns a
1543deep copy. The purpose of this is to avoid having different instances
1544of combined widgets share nested attributes.
1545
1546The following predefined functions can be used here:
1547
1548@defun widget-types-copy widget
1549Copy @code{:args} as widget types in @var{widget}.
1550@end defun
1551
6f7f063d 1552@vindex value-to-internal@r{ keyword}
6bf7aab6
DL
1553@item :value-to-internal
1554Function to convert the value to the internal format. The function
1555takes two arguments, a widget and an external value, and returns the
1556internal value. The function is called on the present @code{:value}
1557when the widget is created, and on any value set later with
1558@code{widget-value-set}.
1559
6f7f063d 1560@vindex value-to-external@r{ keyword}
6bf7aab6
DL
1561@item :value-to-external
1562Function to convert the value to the external format. The function
1563takes two arguments, a widget and an internal value, and returns the
6f7f063d 1564external value. The function is called on the present @code{:value}
6bf7aab6
DL
1565when the widget is created, and on any value set later with
1566@code{widget-value-set}.
1567
6f7f063d 1568@vindex create@r{ keyword}
6bf7aab6
DL
1569@item :create
1570Function to create a widget from scratch. The function takes one
54438eb5
DL
1571argument, a widget type, and creates a widget of that type, inserts it
1572in the buffer, and returns a widget object.
6bf7aab6 1573
6f7f063d 1574@vindex delete@r{ keyword}
6bf7aab6
DL
1575@item :delete
1576Function to delete a widget. The function takes one argument, a widget,
1577and should remove all traces of the widget from the buffer.
1578
6f7f063d 1579@vindex value-create@r{ keyword}
6bf7aab6
DL
1580@item :value-create
1581Function to expand the @samp{%v} escape in the format string. It will
54438eb5
DL
1582be called with the widget as its argument and should insert a
1583representation of the widget's value in the buffer.
6bf7aab6 1584
6f7f063d 1585@vindex value-delete@r{ keyword}
6bf7aab6 1586@item :value-delete
54438eb5 1587Should remove the representation of the widget's value from the buffer.
6bf7aab6
DL
1588It will be called with the widget as its argument. It doesn't have to
1589remove the text, but it should release markers and delete nested widgets
54438eb5 1590if such have been used.
6bf7aab6
DL
1591
1592The following predefined function can be used here:
1593
1594@defun widget-children-value-delete widget
1595Delete all @code{:children} and @code{:buttons} in @var{widget}.
1596@end defun
1597
6f7f063d 1598@vindex value-get@r{ keyword}
6bf7aab6
DL
1599@item :value-get
1600Function to extract the value of a widget, as it is displayed in the
1601buffer.
1602
1603The following predefined function can be used here:
1604
1605@defun widget-value-value-get widget
1606Return the @code{:value} property of @var{widget}.
1607@end defun
1608
6f7f063d 1609@vindex format-handler@r{ keyword}
6bf7aab6
DL
1610@item :format-handler
1611Function to handle unknown @samp{%} escapes in the format string. It
6f7f063d
EZ
1612will be called with the widget and the character that follows the
1613@samp{%} as arguments. You can set this to allow your widget to handle
1614non-standard escapes.
6bf7aab6 1615
6f7f063d 1616@findex widget-default-format-handler
6bf7aab6
DL
1617You should end up calling @code{widget-default-format-handler} to handle
1618unknown escape sequences, which will handle the @samp{%h} and any future
1619escape sequences, as well as give an error for unknown escapes.
1620
6f7f063d 1621@vindex action@r{ keyword}
6bf7aab6
DL
1622@item :action
1623Function to handle user initiated events. By default, @code{:notify}
1624the parent.
1625
1626The following predefined function can be used here:
1627
1628@defun widget-parent-action widget &optional event
1629Tell @code{:parent} of @var{widget} to handle the @code{:action}.
1630Optional @var{event} is the event that triggered the action.
1631@end defun
1632
6f7f063d 1633@vindex prompt-value@r{ keyword}
6bf7aab6
DL
1634@item :prompt-value
1635Function to prompt for a value in the minibuffer. The function should
1636take four arguments, @var{widget}, @var{prompt}, @var{value}, and
1637@var{unbound} and should return a value for widget entered by the user.
1638@var{prompt} is the prompt to use. @var{value} is the default value to
54438eb5 1639use, unless @var{unbound} is non-nil, in which case there is no default
6bf7aab6
DL
1640value. The function should read the value using the method most natural
1641for this widget, and does not have to check that it matches.
1642@end table
1643
1644If you want to define a new widget from scratch, use the @code{default}
1645widget as its base.
1646
1647@deffn Widget default
1648Widget used as a base for other widgets.
1649
1650It provides most of the functionality that is referred to as ``by
1651default'' in this text.
1652@end deffn
1653
1654@node Widget Browser, Widget Minor Mode, Defining New Widgets, Top
1655@comment node-name, next, previous, up
1656@section Widget Browser
6f7f063d 1657@cindex widget browser
6bf7aab6
DL
1658
1659There is a separate package to browse widgets. This is intended to help
1660programmers who want to examine the content of a widget. The browser
1661shows the value of each keyword, but uses links for certain keywords
6f7f063d 1662such as @samp{:parent}, which avoids printing cyclic structures.
6bf7aab6 1663
49c24f48
RS
1664@deffn Command widget-browse @var{widget}
1665Create a widget browser for @var{widget}.
1666When called interactively, prompt for @var{widget}.
6bf7aab6
DL
1667@end deffn
1668
49c24f48
RS
1669@deffn Command widget-browse-other-window @var{widget}
1670Create a widget browser for @var{widget} and show it in another window.
1671When called interactively, prompt for @var{widget}.
6bf7aab6
DL
1672@end deffn
1673
49c24f48
RS
1674@deffn Command widget-browse-at @var{pos}
1675Create a widget browser for the widget at @var{pos}.
6bf7aab6
DL
1676When called interactively, use the position of point.
1677@end deffn
1678
1679@node Widget Minor Mode, Utilities, Widget Browser, Top
1680@comment node-name, next, previous, up
1681@section Widget Minor Mode
6f7f063d 1682@cindex widget minor mode
6bf7aab6
DL
1683
1684There is a minor mode for manipulating widgets in major modes that
6f7f063d 1685don't provide any support for widgets themselves. This is mostly
6bf7aab6
DL
1686intended to be useful for programmers doing experiments.
1687
1688@deffn Command widget-minor-mode
1689Toggle minor mode for traversing widgets.
1690With arg, turn widget mode on if and only if arg is positive.
1691@end deffn
1692
1693@defvar widget-minor-mode-keymap
1694Keymap used in @code{widget-minor-mode}.
1695@end defvar
1696
1697@node Utilities, Widget Wishlist, Widget Minor Mode, Top
1698@comment node-name, next, previous, up
1699@section Utilities.
6f7f063d 1700@cindex utility functions for widgets
6bf7aab6
DL
1701
1702@defun widget-prompt-value widget prompt [ value unbound ]
1703Prompt for a value matching @var{widget}, using @var{prompt}.
1704The current value is assumed to be @var{value}, unless @var{unbound} is
1705non-nil.@refill
1706@end defun
1707
1708@defun widget-get-sibling widget
6f7f063d 1709Get the item which @var{widget} is assumed to toggle.
6bf7aab6
DL
1710This is only meaningful for radio buttons or checkboxes in a list.
1711@end defun
1712
6f7f063d 1713@node Widget Wishlist, Index, Utilities, Top
6bf7aab6
DL
1714@comment node-name, next, previous, up
1715@section Wishlist
6f7f063d 1716@cindex todo
6bf7aab6
DL
1717
1718@itemize @bullet
1719@item
1720It should be possible to add or remove items from a list with @kbd{C-k}
1721and @kbd{C-o} (suggested by @sc{rms}).
1722
976e00f1
DL
1723@item
1724The @samp{[INS]} and @samp{[DEL]} buttons should be replaced by a single
1725dash (@samp{-}). The dash should be a button that, when invoked, asks
1726whether you want to add or delete an item (@sc{rms} wanted to git rid of
1727the ugly buttons, the dash is my idea).
1728
6bf7aab6
DL
1729@item
1730The @code{menu-choice} tag should be prettier, something like the abbreviated
1731menus in Open Look.
1732
1733@item
1734Finish @code{:tab-order}.
1735
1736@item
1737Make indentation work with glyphs and proportional fonts.
1738
1739@item
1740Add commands to show overview of object and class hierarchies to the
1741browser.
1742
1743@item
1744Find a way to disable mouse highlight for inactive widgets.
1745
1746@item
1747Find a way to make glyphs look inactive.
1748
976e00f1
DL
1749@item
1750Add @code{property-list} widget.
1751
1752@item
1753Add @code{association-list} widget.
1754
6bf7aab6
DL
1755@item
1756Add @code{key-binding} widget.
1757
1758@item
1759Add @code{widget} widget for editing widget specifications.
1760
1761@item
1762Find clean way to implement variable length list.
1763See @code{TeX-printer-list} for an explanation.
1764
1765@item
1766@kbd{C-h} in @code{widget-prompt-value} should give type specific help.
1767
1768@item
6f7f063d 1769Add a @code{mailto} widget.
6bf7aab6
DL
1770@end itemize
1771
6f7f063d
EZ
1772@node Index, , Widget Wishlist, Top
1773@comment node-name, next, previous, up
1774@unnumbered Index
1775
1776This is an alphabetical listing of all concepts, functions, commands,
1777variables, and widgets described in this manual.
1778@printindex cp
1779
56f7c94a 1780@setchapternewpage odd
6bf7aab6
DL
1781@contents
1782@bye