--- /dev/null
+This is Info file ../info/widget.info, produced by Makeinfo version
+1.68 from the input file widget.texi.
+
+INFO-DIR-SECTION XEmacs Editor
+START-INFO-DIR-ENTRY
+* Widgets: (widget). The Emacs Widget Library.
+END-INFO-DIR-ENTRY
+
+\1f
+File: widget.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir)
+
+The Emacs Widget Library
+************************
+
+* Menu:
+
+* Introduction::
+* User Interface::
+* Programming Example::
+* Setting Up the Buffer::
+* Basic Types::
+* Sexp Types::
+* Widget Properties::
+* Defining New Widgets::
+* Widget Browser::
+* Widget Minor Mode::
+* Utilities::
+* Widget Wishlist::
+
+\1f
+File: widget.info, Node: Introduction, Next: User Interface, Prev: Top, Up: Top
+
+Introduction
+============
+
+ Most graphical user interface toolkits, such as Motif and XView,
+provide a number of standard user interface controls (sometimes known as
+`widgets' or `gadgets'). Emacs doesn't really support anything like
+this, except for an incredible powerful text "widget". On the other
+hand, Emacs does provide the necessary primitives to implement many
+other widgets within a text buffer. The `widget' package simplifies
+this task.
+
+ The basic widgets are:
+
+`link'
+ Areas of text with an associated action. Intended for hypertext
+ links embedded in text.
+
+`push-button'
+ Like link, but intended for stand-alone buttons.
+
+`editable-field'
+ An editable text field. It can be either variable or fixed length.
+
+`menu-choice'
+ Allows the user to choose one of multiple options from a menu, each
+ option is itself a widget. Only the selected option will be
+ visible in the buffer.
+
+`radio-button-choice'
+ Allows the user to choose one of multiple options by activating
+ radio buttons. The options are implemented as widgets. All
+ options will be visible in the buffer.
+
+`item'
+ A simple constant widget intended to be used in the `menu-choice'
+ and `radio-button-choice' widgets.
+
+`choice-item'
+ An button item only intended for use in choices. When invoked,
+ the user will be asked to select another option from the choice
+ widget.
+
+`toggle'
+ A simple `on'/`off' switch.
+
+`checkbox'
+ A checkbox (`[ ]'/`[X]').
+
+`editable-list'
+ Create an editable list. The user can insert or delete items in
+ the list. Each list item is itself a widget.
+
+ Now of what possible use can support for widgets be in a text editor?
+I'm glad you asked. The answer is that widgets are useful for
+implementing forms. A "form" in emacs is a buffer where the user is
+supposed to fill out a number of fields, each of which has a specific
+meaning. The user is not supposed to change or delete any of the text
+between the fields. Examples of forms in Emacs are the `forms' package
+(of course), the customize buffers, the mail and news compose modes,
+and the HTML form support in the `w3' browser.
+
+ The advantages for a programmer of using the `widget' package to
+implement forms are:
+
+ 1. More complex field than just editable text are supported.
+
+ 2. You can give the user immediate feedback if he enters invalid data
+ in a text field, and sometimes prevent entering invalid data.
+
+ 3. You can have fixed sized fields, thus allowing multiple field to be
+ lined up in columns.
+
+ 4. It is simple to query or set the value of a field.
+
+ 5. Editing happens in buffer, not in the mini-buffer.
+
+ 6. Packages using the library get a uniform look, making them easier
+ for the user to learn.
+
+ 7. As support for embedded graphics improve, the widget library will
+ extended to support it. This means that your code using the widget
+ library will also use the new graphic features by automatic.
+
+ In order to minimize the code that is loaded by users who does not
+create any widgets, the code has been split in two files:
+
+`widget.el'
+ This will declare the user variables, define the function
+ `widget-define', and autoload the function `widget-create'.
+
+`wid-edit.el'
+ Everything else is here, there is no reason to load it explicitly,
+ as it will be autoloaded when needed.
+
+\1f
+File: widget.info, Node: User Interface, Next: Programming Example, Prev: Introduction, Up: Top
+
+User Interface
+==============
+
+ A form consist of read only text for documentation and some fields,
+where each the fields contain two parts, as tag and a value. The tags
+are used to identify the fields, so the documentation can refer to the
+foo field, meaning the field tagged with `Foo'. Here is an example form:
+
+ Here is some documentation.
+
+ Name: My Name *Choose*: This option
+ Address: Some Place
+ In some City
+ Some country.
+
+ See also _other work_ for more information.
+
+ Numbers: count to three below
+ [INS] [DEL] One
+ [INS] [DEL] Eh, two?
+ [INS] [DEL] Five!
+ [INS]
+
+ Select multiple:
+
+ [X] This
+ [ ] That
+ [X] Thus
+
+ Select one:
+
+ (*) One
+ ( ) Another One.
+ ( ) A Final One.
+
+ [Apply Form] [Reset Form]
+
+ The top level widgets in is example are tagged `Name', `Choose',
+`Address', `_other work_', `Numbers', `Select multiple', `Select one',
+`[Apply Form]', and `[Reset Form]'. There are basically two thing the
+user can do within a form, namely editing the editable text fields and
+activating the buttons.
+
+Editable Text Fields
+--------------------
+
+ In the example, the value for the `Name' is most likely displayed in
+an editable text field, and so are values for each of the members of
+the `Numbers' list. All the normal Emacs editing operations are
+available for editing these fields. The only restriction is that each
+change you make must be contained within a single editable text field.
+For example, capitalizing all text from the middle of one field to the
+middle of another field is prohibited.
+
+ Editing text fields are created by the `editable-field' widget.
+
+ The editing text fields are highlighted with the `widget-field-face'
+face, making them easy to find.
+
+ - Face: widget-field-face
+ Face used for other editing fields.
+
+Buttons
+-------
+
+ Some portions of the buffer have an associated "action", which can
+be "invoked" by a standard key or mouse command. These portions are
+called "buttons". The default commands for activating a button are:
+
+`<RET>'
+ - Command: widget-button-press POS &optional EVENT
+ Invoke the button at POS, defaulting to point. If point is
+ not located on a button, invoke the binding in
+ `widget-global-map' (by default the global map).
+
+`mouse-2'
+ - Command: widget-button-click EVENT
+ Invoke the button at the location of the mouse pointer. If
+ the mouse pointer is located in an editable text field,
+ invoke the binding in `widget-global-map' (by default the
+ global map).
+
+ There are several different kind of buttons, all of which are
+present in the example:
+
+*The Option Field Tags.*
+ When you invoke one of these buttons, you will be asked to choose
+ between a number of different options. This is how you edit an
+ option field. Option fields are created by the `menu-choice'
+ widget. In the example, `Choose' is an option field tag.
+
+*The `[INS]' and `[DEL]' buttons.*
+ Activating these will insert or delete elements from a editable
+ list. The list is created by the `editable-list' widget.
+
+*Embedded Buttons.*
+ The `_other work_' is an example of an embedded button. Embedded
+ buttons are not associated with a fields, but can serve any
+ purpose, such as implementing hypertext references. They are
+ usually created by the `link' widget.
+
+*The `[ ]' and `[X]' buttons.*
+ Activating one of these will convert it to the other. This is
+ useful for implementing multiple-choice fields. You can create it
+ wit
+
+*The `( )' and `(*)' buttons.*
+ Only one radio button in a `radio-button-choice' widget can be
+ selected at any time. When you invoke one of the unselected radio
+ buttons, it will be selected and the previous selected radio
+ button will become unselected.
+
+*The `[Apply Form]' `[Reset Form]' buttons.*
+ These are explicit buttons made with the `push-button' widget.
+ The main difference from the `link' widget is that the buttons are
+ will be displayed as GUI buttons when possible. enough.
+
+ To make them easier to locate, buttons are emphasized in the buffer.
+
+ - Face: widget-button-face
+ Face used for buttons.
+
+ - User Option: widget-mouse-face
+ Face used for buttons when the mouse pointer is above it.
+
+Navigation
+----------
+
+ You can use all the normal Emacs commands to move around in a form
+buffer, plus you will have these additional commands:
+
+`<TAB>'
+ - Command: widget-forward &optional COUNT
+ Move point COUNT buttons or editing fields forward.
+
+`<M-TAB>'
+ - Command: widget-backward &optional COUNT
+ Move point COUNT buttons or editing fields backward.
+
+\1f
+File: widget.info, Node: Programming Example, Next: Setting Up the Buffer, Prev: User Interface, Up: Top
+
+Programming Example
+===================
+
+ Here is the code to implement the user interface example (see *Note
+User Interface::).
+
+ (require 'widget)
+
+ (eval-when-compile
+ (require 'wid-edit))
+
+ (defvar widget-example-repeat)
+
+ (defun widget-example ()
+ "Create the widgets from the Widget manual."
+ (interactive)
+ (kill-buffer (get-buffer-create "*Widget Example*"))
+ (switch-to-buffer (get-buffer-create "*Widget Example*"))
+ (kill-all-local-variables)
+ (make-local-variable 'widget-example-repeat)
+ (widget-insert "Here is some documentation.\n\nName: ")
+ (widget-create 'editable-field
+ :size 13
+ "My Name")
+ (widget-create 'menu-choice
+ :tag "Choose"
+ :value "This"
+ :help-echo "Choose me, please!"
+ :notify (lambda (widget &rest ignore)
+ (message "%s is a good choice!"
+ (widget-value widget)))
+ '(item :tag "This option" :value "This")
+ '(choice-item "That option")
+ '(editable-field :menu-tag "No option" "Thus option"))
+ (widget-insert "Address: ")
+ (widget-create 'editable-field
+ "Some Place\nIn some City\nSome country.")
+ (widget-insert "\nSee also ")
+ (widget-create 'link
+ :notify (lambda (&rest ignore)
+ (widget-value-set widget-example-repeat
+ '("En" "To" "Tre"))
+ (widget-setup))
+ "other work")
+ (widget-insert " for more information.\n\nNumbers: count to three below\n")
+ (setq widget-example-repeat
+ (widget-create 'editable-list
+ :entry-format "%i %d %v"
+ :notify (lambda (widget &rest ignore)
+ (let ((old (widget-get widget
+ ':example-length))
+ (new (length (widget-value widget))))
+ (unless (eq old new)
+ (widget-put widget ':example-length new)
+ (message "You can count to %d." new))))
+ :value '("One" "Eh, two?" "Five!")
+ '(editable-field :value "three")))
+ (widget-insert "\n\nSelect multiple:\n\n")
+ (widget-create 'checkbox t)
+ (widget-insert " This\n")
+ (widget-create 'checkbox nil)
+ (widget-insert " That\n")
+ (widget-create 'checkbox
+ :notify (lambda (&rest ignore) (message "Tickle"))
+ t)
+ (widget-insert " Thus\n\nSelect one:\n\n")
+ (widget-create 'radio-button-choice
+ :value "One"
+ :notify (lambda (widget &rest ignore)
+ (message "You selected %s"
+ (widget-value widget)))
+ '(item "One") '(item "Another One.") '(item "A Final One."))
+ (widget-insert "\n")
+ (widget-create 'push-button
+ :notify (lambda (&rest ignore)
+ (if (= (length (widget-value widget-example-repeat))
+ 3)
+ (message "Congratulation!")
+ (error "Three was the count!")))
+ "Apply Form")
+ (widget-insert " ")
+ (widget-create 'push-button
+ :notify (lambda (&rest ignore)
+ (widget-example))
+ "Reset Form")
+ (widget-insert "\n")
+ (use-local-map widget-keymap)
+ (widget-setup))
+
+\1f
+File: widget.info, Node: Setting Up the Buffer, Next: Basic Types, Prev: Programming Example, Up: Top
+
+Setting Up the Buffer
+=====================
+
+ Widgets are created with `widget-create', which returns a "widget"
+object. This object can be queried and manipulated by other widget
+functions, until it is deleted with `widget-delete'. After the widgets
+have been created, `widget-setup' must be called to enable them.
+
+ - Function: widget-create TYPE [ KEYWORD ARGUMENT ]...
+ Create and return a widget of type TYPE. The syntax for the TYPE
+ argument is described in *Note Basic Types::.
+
+ The keyword arguments can be used to overwrite the keyword
+ arguments that are part of TYPE.
+
+ - Function: widget-delete WIDGET
+ Delete WIDGET and remove it from the buffer.
+
+ - Function: widget-setup
+ Setup a buffer to support widgets.
+
+ This should be called after creating all the widgets and before
+ allowing the user to edit them.
+
+
+ If you want to insert text outside the widgets in the form, the
+recommended way to do that is with `widget-insert'.
+
+ - Function: widget-insert
+ Insert the arguments, either strings or characters, at point. The
+ inserted text will be read only.
+
+ There is a standard widget keymap which you might find useful.
+
+ - Const: widget-keymap
+ A keymap with the global keymap as its parent.
+ <TAB> and `C-<TAB>' are bound to `widget-forward' and
+ `widget-backward', respectively. `<RET>' and `mouse-2' are bound
+ to `widget-button-press' and `widget-button-'.
+
+ - Variable: widget-global-map
+ Keymap used by `widget-button-press' and `widget-button-click'
+ when not on a button. By default this is `global-map'.
+
+\1f
+File: widget.info, Node: Basic Types, Next: Sexp Types, Prev: Setting Up the Buffer, Up: Top
+
+Basic Types
+===========
+
+ The syntax of a type specification is given below:
+
+ NAME ::= (NAME [KEYWORD ARGUMENT]... ARGS)
+ | NAME
+
+ Where, NAME is a widget name, KEYWORD is the name of a property,
+ARGUMENT is the value of the property, and ARGS are interpreted in a
+widget specific way.
+
+ There following keyword arguments that apply to all widgets:
+
+`:value'
+ The initial value for widgets of this type.
+
+`:format'
+ This string will be inserted in the buffer when you create a
+ widget. The following `%' escapes are available:
+
+ `%['
+ `%]'
+ The text inside will be marked as a button.
+
+ By default, the text will be shown in `widget-button-face',
+ and surrounded by brackets.
+
+ - User Option: widget-button-prefix
+ String to prefix buttons.
+
+ - User Option: widget-button-suffix
+ String to suffix buttons.
+
+ `%{'
+ `%}'
+ The text inside will be displayed with the face specified by
+ `:sample-face'.
+
+ `%v'
+ This will be replaces with the buffer representation of the
+ widgets value. What this is depends on the widget type.
+
+ `%d'
+ Insert the string specified by `:doc' here.
+
+ `%h'
+ Like `%d', with the following modifications: If the
+ documentation string is more than one line, it will add a
+ button which will toggle between showing only the first line,
+ and showing the full text. Furthermore, if there is no
+ `:doc' property in the widget, it will instead examine the
+ `:documentation-property' property. If it is a lambda
+ expression, it will be called with the widget's value as an
+ argument, and the result will be used as the documentation
+ text.
+
+ `%t'
+ Insert the string specified by `:tag' here, or the `princ'
+ representation of the value if there is no tag.
+
+ `%%'
+ Insert a literal `%'.
+
+`:button-face'
+ Face used to highlight text inside %[ %] in the format.
+
+`:button-prefix'
+`:button-suffix'
+ Text around %[ %] in the format.
+
+ These can be
+ *nil*
+ No text is inserted.
+
+ *a string*
+ The string is inserted literally.
+
+ *a symbol*
+ The value of the symbol is expanded according to this table.
+
+`:doc'
+ The string inserted by the `%d' escape in the format string.
+
+`:tag'
+ The string inserted by the `%t' escape in the format string.
+
+`:tag-glyph'
+ Name of image to use instead of the string specified by `:tag' on
+ Emacsen that supports it.
+
+`:help-echo'
+ Message displayed whenever you move to the widget with either
+ `widget-forward' or `widget-backward'.
+
+`:indent'
+ An integer indicating the absolute number of spaces to indent
+ children of this widget.
+
+`:offset'
+ An integer indicating how many extra spaces to add to the widget's
+ grandchildren compared to this widget.
+
+`:extra-offset'
+ An integer indicating how many extra spaces to add to the widget's
+ children compared to this widget.
+
+`:notify'
+ A function called each time the widget or a nested widget is
+ changed. The function is called with two or three arguments. The
+ first argument is the widget itself, the second argument is the
+ widget that was changed, and the third argument is the event
+ leading to the change, if any.
+
+`:menu-tag'
+ Tag used in the menu when the widget is used as an option in a
+ `menu-choice' widget.
+
+`:menu-tag-get'
+ Function used for finding the tag when the widget is used as an
+ option in a `menu-choice' widget. By default, the tag used will
+ be either the `:menu-tag' or `:tag' property if present, or the
+ `princ' representation of the `:value' property if not.
+
+`:match'
+ Should be a function called with two arguments, the widget and a
+ value, and returning non-nil if the widget can represent the
+ specified value.
+
+`:validate'
+ A function which takes a widget as an argument, and return nil if
+ the widgets current value is valid for the widget. Otherwise, it
+ should return the widget containing the invalid data, and set that
+ widgets `:error' property to a string explaining the error.
+
+ The following predefined function can be used:
+
+ - Function: widget-children-validate WIDGET
+ All the `:children' of WIDGET must be valid.
+
+`:tab-order'
+ Specify the order in which widgets are traversed with
+ `widget-forward' or `widget-backward'. This is only partially
+ implemented.
+
+ a. Widgets with tabbing order `-1' are ignored.
+
+ b. (Unimplemented) When on a widget with tabbing order N, go to
+ the next widget in the buffer with tabbing order N+1 or `nil',
+ whichever comes first.
+
+ c. When on a widget with no tabbing order specified, go to the
+ next widget in the buffer with a positive tabbing order, or
+ `nil'
+
+`:parent'
+ The parent of a nested widget (e.g. a `menu-choice' item or an
+ element of a `editable-list' widget).
+
+`:sibling-args'
+ This keyword is only used for members of a `radio-button-choice' or
+ `checklist'. The value should be a list of extra keyword
+ arguments, which will be used when creating the `radio-button' or
+ `checkbox' associated with this item.
+
+ - User Option: widget-glyph-directory
+ Directory where glyphs are found. Widget will look here for a
+ file with the same name as specified for the image, with either a
+ `.xpm' (if supported) or `.xbm' extension.
+
+ - User Option: widget-glyph-enable
+ If non-nil, allow glyphs to appear on displays where they are
+ supported.
+
+* Menu:
+
+* link::
+* url-link::
+* info-link::
+* push-button::
+* editable-field::
+* text::
+* menu-choice::
+* radio-button-choice::
+* item::
+* choice-item::
+* toggle::
+* checkbox::
+* checklist::
+* editable-list::
+* group::
+
+\1f
+File: widget.info, Node: link, Next: url-link, Prev: Basic Types, Up: Basic Types
+
+The `link' Widget
+-----------------
+
+ Syntax:
+
+ TYPE ::= (link [KEYWORD ARGUMENT]... [ VALUE ])
+
+ The VALUE, if present, is used to initialize the `:value' property.
+The value should be a string, which will be inserted in the buffer.
+
+ By default the link will be shown in brackets.
+
+ - User Option: widget-link-prefix
+ String to prefix links.
+
+ - User Option: widget-link-suffix
+ String to suffix links.
+
+\1f
+File: widget.info, Node: url-link, Next: info-link, Prev: link, Up: Basic Types
+
+The `url-link' Widget
+---------------------
+
+ Syntax:
+
+ TYPE ::= (url-link [KEYWORD ARGUMENT]... URL)
+
+ When this link is invoked, the WWW browser specified by
+`browse-url-browser-function' will be called with URL.
+
+\1f
+File: widget.info, Node: info-link, Next: push-button, Prev: url-link, Up: Basic Types
+
+The `info-link' Widget
+----------------------
+
+ Syntax:
+
+ TYPE ::= (info-link [KEYWORD ARGUMENT]... ADDRESS)
+
+ When this link is invoked, the built-in info browser is started on
+ADDRESS.
+
+\1f
+File: widget.info, Node: push-button, Next: editable-field, Prev: info-link, Up: Basic Types
+
+The `push-button' Widget
+------------------------
+
+ Syntax:
+
+ TYPE ::= (push-button [KEYWORD ARGUMENT]... [ VALUE ])
+
+ The VALUE, if present, is used to initialize the `:value' property.
+The value should be a string, which will be inserted in the buffer.
+
+ By default the tag will be shown in brackets.
+
+ - User Option: widget-push-button-prefix
+ String to prefix push buttons.
+
+ - User Option: widget-push-button-suffix
+ String to suffix push buttons.
+
+\1f
+File: widget.info, Node: editable-field, Next: text, Prev: push-button, Up: Basic Types
+
+The `editable-field' Widget
+---------------------------
+
+ Syntax:
+
+ TYPE ::= (editable-field [KEYWORD ARGUMENT]... [ VALUE ])
+
+ The VALUE, if present, is used to initialize the `:value' property.
+The value should be a string, which will be inserted in field. This
+widget will match all string values.
+
+ The following extra properties are recognized.
+
+`:size'
+ The width of the editable field.
+ By default the field will reach to the end of the line.
+
+`:value-face'
+ Face used for highlighting the editable field. Default is
+ `widget-field-face'.
+
+`:secret'
+ Character used to display the value. You can set this to e.g. `?*'
+ if the field contains a password or other secret information. By
+ default, the value is not secret.
+
+`:valid-regexp'
+ By default the `:validate' function will match the content of the
+ field with the value of this attribute. The default value is `""'
+ which matches everything.
+
+`:keymap'
+ Keymap used in the editable field. The default value is
+ `widget-field-keymap', which allows you to use all the normal
+ editing commands, even if the buffers major mode suppress some of
+ them. Pressing return invokes the function specified by `:action'.
+
+\1f
+File: widget.info, Node: text, Next: menu-choice, Prev: editable-field, Up: Basic Types
+
+The `text' Widget
+-----------------
+
+ This is just like `editable-field', but intended for multiline text
+fields. The default `:keymap' is `widget-text-keymap', which does not
+rebind the return key.
+
+\1f
+File: widget.info, Node: menu-choice, Next: radio-button-choice, Prev: text, Up: Basic Types
+
+The `menu-choice' Widget
+------------------------
+
+ Syntax:
+
+ TYPE ::= (menu-choice [KEYWORD ARGUMENT]... TYPE ... )
+
+ The TYPE arguments represents each possible choice. The widgets
+value of will be the value of the chosen TYPE argument. This widget
+will match any value that matches at least one of the specified TYPE
+arguments.
+
+`:void'
+ Widget type used as a fallback when the value does not match any
+ of the specified TYPE arguments.
+
+`:case-fold'
+ Set this to nil if you don't want to ignore case when prompting
+ for a choice through the minibuffer.
+
+`:children'
+ A list whose car is the widget representing the currently chosen
+ type in the buffer.
+
+`:choice'
+ The current chosen type
+
+`:args'
+ The list of types.
+
+\1f
+File: widget.info, Node: radio-button-choice, Next: item, Prev: menu-choice, Up: Basic Types
+
+The `radio-button-choice' Widget
+--------------------------------
+
+ Syntax:
+
+ TYPE ::= (radio-button-choice [KEYWORD ARGUMENT]... TYPE ... )
+
+ The TYPE arguments represents each possible choice. The widgets
+value of will be the value of the chosen TYPE argument. This widget
+will match any value that matches at least one of the specified TYPE
+arguments.
+
+ The following extra properties are recognized.
+
+`:entry-format'
+ This string will be inserted for each entry in the list. The
+ following `%' escapes are available:
+ `%v'
+ Replaced with the buffer representation of the TYPE widget.
+
+ `%b'
+ Replace with the radio button.
+
+ `%%'
+ Insert a literal `%'.
+
+`button-args'
+ A list of keywords to pass to the radio buttons. Useful for
+ setting e.g. the `:help-echo' for each button.
+
+`:buttons'
+ The widgets representing the radio buttons.
+
+`:children'
+ The widgets representing each type.
+
+`:choice'
+ The current chosen type
+
+`:args'
+ The list of types.
+
+ You can add extra radio button items to a `radio-button-choice'
+widget after it has been created with the function
+`widget-radio-add-item'.
+
+ - Function: widget-radio-add-item WIDGET TYPE
+ Add to `radio-button-choice' widget WIDGET a new radio button item
+ of type TYPE.
+
+ Please note that such items added after the `radio-button-choice'
+widget has been created will *not* be properly destructed when you call
+`widget-delete'.
+
+\1f
+File: widget.info, Node: item, Next: choice-item, Prev: radio-button-choice, Up: Basic Types
+
+The `item' Widget
+-----------------
+
+ Syntax:
+
+ ITEM ::= (item [KEYWORD ARGUMENT]... VALUE)
+
+ The VALUE, if present, is used to initialize the `:value' property.
+The value should be a string, which will be inserted in the buffer.
+This widget will only match the specified value.
+
+\1f
+File: widget.info, Node: choice-item, Next: toggle, Prev: item, Up: Basic Types
+
+The `choice-item' Widget
+------------------------
+
+ Syntax:
+
+ ITEM ::= (choice-item [KEYWORD ARGUMENT]... VALUE)
+
+ The VALUE, if present, is used to initialize the `:value' property.
+The value should be a string, which will be inserted in the buffer as a
+button. Activating the button of a `choice-item' is equivalent to
+activating the parent widget. This widget will only match the
+specified value.
+
+\1f
+File: widget.info, Node: toggle, Next: checkbox, Prev: choice-item, Up: Basic Types
+
+The `toggle' Widget
+-------------------
+
+ Syntax:
+
+ TYPE ::= (toggle [KEYWORD ARGUMENT]...)
+
+ The widget has two possible states, `on' and `off', which
+corresponds to a `t' or `nil' value.
+
+ The following extra properties are recognized.
+
+`:on'
+ String representing the `on' state. By default the string `on'.
+
+`:off'
+ String representing the `off' state. By default the string `off'.
+
+`:on-glyph'
+ Name of a glyph to be used instead of the `:on' text string, on
+ emacsen that supports it.
+
+`:off-glyph'
+ Name of a glyph to be used instead of the `:off' text string, on
+ emacsen that supports it.
+
+\1f
+File: widget.info, Node: checkbox, Next: checklist, Prev: toggle, Up: Basic Types
+
+The `checkbox' Widget
+---------------------
+
+ The widget has two possible states, `selected' and `unselected',
+which corresponds to a `t' or `nil' value.
+
+ Syntax:
+
+ TYPE ::= (checkbox [KEYWORD ARGUMENT]...)
+
+\1f
+File: widget.info, Node: checklist, Next: editable-list, Prev: checkbox, Up: Basic Types
+
+The `checklist' Widget
+----------------------
+
+ Syntax:
+
+ TYPE ::= (checklist [KEYWORD ARGUMENT]... TYPE ... )
+
+ The TYPE arguments represents each checklist item. The widgets
+value of will be a list containing the value of each ticked TYPE
+argument. The checklist widget will match a list whose elements all
+matches at least one of the specified TYPE arguments.
+
+ The following extra properties are recognized.
+
+`:entry-format'
+ This string will be inserted for each entry in the list. The
+ following `%' escapes are available:
+ `%v'
+ Replaced with the buffer representation of the TYPE widget.
+
+ `%b'
+ Replace with the checkbox.
+
+ `%%'
+ Insert a literal `%'.
+
+`:greedy'
+ Usually, a checklist will only match if the items are in the exact
+ sequence given in the specification. By setting `:greedy' to
+ non-nil, it will allow the items to come in any sequence.
+ However, if you extract the value they will be in the sequence
+ given in the checklist. I.e. the original sequence is forgotten.
+
+`button-args'
+ A list of keywords to pass to the checkboxes. Useful for setting
+ e.g. the `:help-echo' for each checkbox.
+
+`:buttons'
+ The widgets representing the checkboxes.
+
+`:children'
+ The widgets representing each type.
+
+`:args'
+ The list of types.
+
+\1f
+File: widget.info, Node: editable-list, Next: group, Prev: checklist, Up: Basic Types
+
+The `editable-list' Widget
+--------------------------
+
+ Syntax:
+
+ TYPE ::= (editable-list [KEYWORD ARGUMENT]... TYPE)
+
+ The value is a list, where each member represents one widget of type
+TYPE.
+
+ The following extra properties are recognized.
+
+`:entry-format'
+ This string will be inserted for each entry in the list. The
+ following `%' escapes are available:
+ `%v'
+ This will be replaced with the buffer representation of the
+ TYPE widget.
+
+ `%i'
+ Insert the [INS] button.
+
+ `%d'
+ Insert the [DEL] button.
+
+ `%%'
+ Insert a literal `%'.
+
+`:insert-button-args'
+ A list of keyword arguments to pass to the insert buttons.
+
+`:delete-button-args'
+ A list of keyword arguments to pass to the delete buttons.
+
+`:append-button-args'
+ A list of keyword arguments to pass to the trailing insert button.
+
+`:buttons'
+ The widgets representing the insert and delete buttons.
+
+`:children'
+ The widgets representing the elements of the list.
+
+`:args'
+ List whose car is the type of the list elements.
+
+\1f
+File: widget.info, Node: group, Prev: editable-list, Up: Basic Types
+
+The `group' Widget
+------------------
+
+ This widget simply group other widget together.
+
+ Syntax:
+
+ TYPE ::= (group [KEYWORD ARGUMENT]... TYPE...)
+
+ The value is a list, with one member for each TYPE.
+
+\1f
+File: widget.info, Node: Sexp Types, Next: Widget Properties, Prev: Basic Types, Up: Top
+
+Sexp Types
+==========
+
+ A number of widgets for editing s-expressions (lisp types) are also
+available. These basically fall in the following categories.
+
+* Menu:
+
+* constants::
+* generic::
+* atoms::
+* composite::
+
+\1f
+File: widget.info, Node: constants, Next: generic, Prev: Sexp Types, Up: Sexp Types
+
+The Constant Widgets.
+---------------------
+
+ The `const' widget can contain any lisp expression, but the user is
+prohibited from editing edit it, which is mainly useful as a component
+of one of the composite widgets.
+
+ The syntax for the `const' widget is
+
+ TYPE ::= (const [KEYWORD ARGUMENT]... [ VALUE ])
+
+ The VALUE, if present, is used to initialize the `:value' property
+and can be any s-expression.
+
+ - Widget: const
+ This will display any valid s-expression in an immutable part of
+ the buffer.
+
+ There are two variations of the `const' widget, namely
+`variable-item' and `function-item'. These should contain a symbol
+with a variable or function binding. The major difference from the
+`const' widget is that they will allow the user to see the variable or
+function documentation for the symbol.
+
+ - Widget: variable-item
+ An immutable symbol that is bound as a variable.
+
+ - Widget: function-item
+ An immutable symbol that is bound as a function.
+
+\1f
+File: widget.info, Node: generic, Next: atoms, Prev: constants, Up: Sexp Types
+
+Generic Sexp Widget.
+--------------------
+
+ The `sexp' widget can contain any lisp expression, and allows the
+user to edit it inline in the buffer.
+
+ The syntax for the `sexp' widget is
+
+ TYPE ::= (sexp [KEYWORD ARGUMENT]... [ VALUE ])
+
+ - Widget: sexp
+ This will allow you to edit any valid s-expression in an editable
+ buffer field.
+
+ The `sexp' widget takes the same keyword arguments as the
+ `editable-field' widget.
+
+\1f
+File: widget.info, Node: atoms, Next: composite, Prev: generic, Up: Sexp Types
+
+Atomic Sexp Widgets.
+--------------------
+
+ The atoms are s-expressions that does not consist of other
+s-expressions. A string is an atom, while a list is a composite type.
+You can edit the value of an atom with the following widgets.
+
+ The syntax for all the atoms are
+
+ TYPE ::= (NAME [KEYWORD ARGUMENT]... [ VALUE ])
+
+ The VALUE, if present, is used to initialize the `:value' property
+and must be an expression of the same type as the widget. I.e. the
+string widget can only be initialized with a string.
+
+ All the atom widgets take the same keyword arguments as the
+`editable-field' widget.
+
+ - Widget: string
+ Allows you to edit a string in an editable field.
+
+ - Widget: regexp
+ Allows you to edit a regular expression in an editable field.
+
+ - Widget: character
+ Allows you to enter a character in an editable field.
+
+ - Widget: file
+ Allows you to edit a file name in an editable field. If you invoke
+ the tag button, you can edit the file name in the mini-buffer with
+ completion.
+
+ Keywords:
+ `:must-match'
+ If this is set to non-nil, only existing file names will be
+ allowed in the minibuffer.
+
+ - Widget: directory
+ Allows you to edit a directory name in an editable field. Similar
+ to the `file' widget.
+
+ - Widget: symbol
+ Allows you to edit a lisp symbol in an editable field.
+
+ - Widget: function
+ Allows you to edit a lambda expression, or a function name with
+ completion.
+
+ - Widget: variable
+ Allows you to edit a variable name, with completion.
+
+ - Widget: integer
+ Allows you to edit an integer in an editable field.
+
+ - Widget: number
+ Allows you to edit a number in an editable field.
+
+ - Widget: boolean
+ Allows you to edit a boolean. In lisp this means a variable which
+ is either nil meaning false, or non-nil meaning true.
+
+\1f
+File: widget.info, Node: composite, Prev: atoms, Up: Sexp Types
+
+Composite Sexp Widgets.
+-----------------------
+
+ The syntax for the composite are
+
+ TYPE ::= (NAME [KEYWORD ARGUMENT]... COMPONENT...)
+
+ Where each COMPONENT must be a widget type. Each component widget
+will be displayed in the buffer, and be editable to the user.
+
+ - Widget: cons
+ The value of a `cons' widget is a cons-cell where the car is the
+ value of the first component and the cdr is the value of the second
+ component. There must be exactly two components.
+
+ - Widget: list
+ The value of a `list' widget is a list containing the value of
+ each of its component.
+
+ - Widget: vector
+ The value of a `vector' widget is a vector containing the value of
+ each of its component.
+
+ The above suffice for specifying fixed size lists and vectors. To
+get variable length lists and vectors, you can use a `choice', `set' or
+`repeat' widgets together with the `:inline' keywords. If any
+component of a composite widget has the `:inline' keyword set, its
+value must be a list which will then be spliced into the composite.
+For example, to specify a list whose first element must be a file name,
+and whose remaining arguments should either by the symbol `t' or two
+files, you can use the following widget specification:
+
+ (list file
+ (choice (const t)
+ (list :inline t
+ :value ("foo" "bar")
+ string string)))
+
+ The value of a widget of this type will either have the form `(file
+t)' or `(file string string)'.
+
+ This concept of inline is probably hard to understand. It was
+certainly hard to implement so instead of confuse you more by trying to
+explain it here, I'll just suggest you meditate over it for a while.
+
+ - Widget: choice
+ Allows you to edit a sexp which may have one of fixed set of
+ types. It is currently implemented with the `choice-menu' basic
+ widget, and has a similar syntax.
+
+ - Widget: set
+ Allows you to specify a type which must be a list whose elements
+ all belong to given set. The elements of the list is not
+ significant. This is implemented on top of the `checklist' basic
+ widget, and has a similar syntax.
+
+ - Widget: repeat
+ Allows you to specify a variable length list whose members are all
+ of the same type. Implemented on top of the `editable-list' basic
+ widget, and has a similar syntax.
+
+\1f
+File: widget.info, Node: Widget Properties, Next: Defining New Widgets, Prev: Sexp Types, Up: Top
+
+Properties
+==========
+
+ You can examine or set the value of a widget by using the widget
+object that was returned by `widget-create'.
+
+ - Function: widget-value WIDGET
+ Return the current value contained in WIDGET. It is an error to
+ call this function on an uninitialized widget.
+
+ - Function: widget-value-set WIDGET VALUE
+ Set the value contained in WIDGET to VALUE. It is an error to
+ call this function with an invalid VALUE.
+
+ *Important:* You *must* call `widget-setup' after modifying the
+value of a widget before the user is allowed to edit the widget again.
+It is enough to call `widget-setup' once if you modify multiple
+widgets. This is currently only necessary if the widget contains an
+editing field, but may be necessary for other widgets in the future.
+
+ If your application needs to associate some information with the
+widget objects, for example a reference to the item being edited, it
+can be done with `widget-put' and `widget-get'. The property names
+must begin with a `:'.
+
+ - Function: widget-put WIDGET PROPERTY VALUE
+ In WIDGET set PROPERTY to VALUE. PROPERTY should be a symbol,
+ while VALUE can be anything.
+
+ - Function: widget-get WIDGET PROPERTY
+ In WIDGET return the value for PROPERTY. PROPERTY should be a
+ symbol, the value is what was last set by `widget-put' for
+ PROPERTY.
+
+ - Function: widget-member WIDGET PROPERTY
+ Non-nil if WIDGET has a value (even nil) for property PROPERTY.
+
+ Occasionally it can be useful to know which kind of widget you have,
+i.e. the name of the widget type you gave when the widget was created.
+
+ - Function: widget-type WIDGET
+ Return the name of WIDGET, a symbol.
+
+ Widgets can be in two states: active, which means they are
+modifiable by the user, or inactive, which means they cannot be
+modified by the user. You can query or set the state with the
+following code:
+
+ ;; Examine if WIDGET is active or not.
+ (if (widget-apply WIDGET :active)
+ (message "Widget is active.")
+ (message "Widget is inactive.")
+
+ ;; Make WIDGET inactive.
+ (widget-apply WIDGET :deactivate)
+
+ ;; Make WIDGET active.
+ (widget-apply WIDGET :activate)
+
+ A widget is inactive if itself, or any of its ancestors (found by
+following the `:parent' link) have been deactivated. To make sure a
+widget is really active, you must therefore activate both itself, and
+all its ancestors.
+
+ (while widget
+ (widget-apply widget :activate)
+ (setq widget (widget-get widget :parent)))
+
+ You can check if a widget has been made inactive by examining the
+value of `:inactive' keyword. If this is non-nil, the widget itself has
+been deactivated. This is different from using the `:active' keyword,
+in that the later tell you if the widget *or* any of its ancestors have
+been deactivated. Do not attempt to set the `:inactive' keyword
+directly. Use the `:activate' `:deactivated' keywords instead.
+
+\1f
+File: widget.info, Node: Defining New Widgets, Next: Widget Browser, Prev: Widget Properties, Up: Top
+
+Defining New Widgets
+====================
+
+ You can define specialized widgets with `define-widget'. It allows
+you to create a shorthand for more complex widgets, including specifying
+component widgets and default new default values for the keyword
+arguments.
+
+ - Function: widget-define NAME CLASS DOC &rest ARGS
+ Define a new widget type named NAME from `class'.
+
+ NAME and class should both be symbols, `class' should be one of
+ the existing widget types.
+
+ The third argument DOC is a documentation string for the widget.
+
+ After the new widget has been defined, the following two calls will
+ create identical widgets:
+
+ * (widget-create NAME)
+
+ * (apply widget-create CLASS ARGS)
+
+
+ Using `widget-define' does just store the definition of the widget
+type in the `widget-type' property of NAME, which is what
+`widget-create' uses.
+
+ If you just want to specify defaults for keywords with no complex
+conversions, you can use `identity' as your conversion function.
+
+ The following additional keyword arguments are useful when defining
+new widgets:
+`:convert-widget'
+ Function to convert a widget type before creating a widget of that
+ type. It takes a widget type as an argument, and returns the
+ converted widget type. When a widget is created, this function is
+ called for the widget type and all the widgets parent types, most
+ derived first.
+
+ The following predefined functions can be used here:
+
+ - Function: widget-types-convert-widget WIDGET
+ Convert `:args' as widget types in WIDGET.
+
+ - Function: widget-value-convert-widget WIDGET
+ Initialize `:value' from `:args' in WIDGET.
+
+`:value-to-internal'
+ Function to convert the value to the internal format. The function
+ takes two arguments, a widget and an external value, and returns
+ the internal value. The function is called on the present `:value'
+ when the widget is created, and on any value set later with
+ `widget-value-set'.
+
+`:value-to-external'
+ Function to convert the value to the external format. The function
+ takes two arguments, a widget and an internal value, and returns
+ the internal value. The function is called on the present `:value'
+ when the widget is created, and on any value set later with
+ `widget-value-set'.
+
+`:create'
+ Function to create a widget from scratch. The function takes one
+ argument, a widget type, and create a widget of that type, insert
+ it in the buffer, and return a widget object.
+
+`:delete'
+ Function to delete a widget. The function takes one argument, a
+ widget, and should remove all traces of the widget from the buffer.
+
+`:value-create'
+ Function to expand the `%v' escape in the format string. It will
+ be called with the widget as its argument. Should insert a
+ representation of the widgets value in the buffer.
+
+`:value-delete'
+ Should remove the representation of the widgets value from the
+ buffer. It will be called with the widget as its argument. It
+ doesn't have to remove the text, but it should release markers and
+ delete nested widgets if such has been used.
+
+ The following predefined function can be used here:
+
+ - Function: widget-children-value-delete WIDGET
+ Delete all `:children' and `:buttons' in WIDGET.
+
+`:value-get'
+ Function to extract the value of a widget, as it is displayed in
+ the buffer.
+
+ The following predefined function can be used here:
+
+ - Function: widget-value-value-get WIDGET
+ Return the `:value' property of WIDGET.
+
+`:format-handler'
+ Function to handle unknown `%' escapes in the format string. It
+ will be called with the widget and the escape character as
+ arguments. You can set this to allow your widget to handle
+ non-standard escapes.
+
+ You should end up calling `widget-default-format-handler' to handle
+ unknown escape sequences, which will handle the `%h' and any future
+ escape sequences, as well as give an error for unknown escapes.
+
+`:action'
+ Function to handle user initiated events. By default, `:notify'
+ the parent.
+
+ The following predefined function can be used here:
+
+ - Function: widget-parent-action WIDGET &optional EVENT
+ Tell `:parent' of WIDGET to handle the `:action'.
+ Optional EVENT is the event that triggered the action.
+
+`:prompt-value'
+ Function to prompt for a value in the minibuffer. The function
+ should take four arguments, WIDGET, PROMPT, VALUE, and UNBOUND and
+ should return a value for widget entered by the user. PROMPT is
+ the prompt to use. VALUE is the default value to use, unless
+ UNBOUND is non-nil in which case there are no default value. The
+ function should read the value using the method most natural for
+ this widget, and does not have to check that it matches.
+
+ If you want to define a new widget from scratch, use the `default'
+widget as its base.
+
+ - Widget: default
+ Widget used as a base for other widgets.
+
+ It provides most of the functionality that is referred to as "by
+ default" in this text.
+
+\1f
+File: widget.info, Node: Widget Browser, Next: Widget Minor Mode, Prev: Defining New Widgets, Up: Top
+
+Widget Browser
+==============
+
+ There is a separate package to browse widgets. This is intended to
+help programmers who want to examine the content of a widget. The
+browser shows the value of each keyword, but uses links for certain
+keywords such as `:parent', which avoids printing cyclic structures.
+
+ - Command: widget-browse WIDGET
+ Create a widget browser for WIDGET. When called interactively,
+ prompt for WIDGET.
+
+ - Command: widget-browse-other-window WIDGET
+ Create a widget browser for WIDGET and show it in another window.
+ When called interactively, prompt for WIDGET.
+
+ - Command: widget-browse-at POS
+ Create a widget browser for the widget at POS. When called
+ interactively, use the position of point.
+
+\1f
+File: widget.info, Node: Widget Minor Mode, Next: Utilities, Prev: Widget Browser, Up: Top
+
+Widget Minor Mode
+=================
+
+ There is a minor mode for manipulating widgets in major modes that
+doesn't provide any support for widgets themselves. This is mostly
+intended to be useful for programmers doing experiments.
+
+ - Command: widget-minor-mode
+ Toggle minor mode for traversing widgets. With arg, turn widget
+ mode on if and only if arg is positive.
+
+ - Variable: widget-minor-mode-keymap
+ Keymap used in `widget-minor-mode'.
+
+\1f
+File: widget.info, Node: Utilities, Next: Widget Wishlist, Prev: Widget Minor Mode, Up: Top
+
+Utilities.
+==========
+
+ - Function: widget-prompt-value WIDGET PROMPT [ VALUE UNBOUND ]
+ Prompt for a value matching WIDGET, using PROMPT.
+ The current value is assumed to be VALUE, unless UNBOUND is
+ non-nil.
+
+ - Function: widget-get-sibling WIDGET
+ Get the item WIDGET is assumed to toggle.
+ This is only meaningful for radio buttons or checkboxes in a list.
+
+\1f
+File: widget.info, Node: Widget Wishlist, Prev: Utilities, Up: Top
+
+Wishlist
+========
+
+ * It should be possible to add or remove items from a list with `C-k'
+ and `C-o' (suggested by RMS).
+
+ * The `[INS]' and `[DEL]' buttons should be replaced by a single
+ dash (`-'). The dash should be a button that, when invoked, ask
+ whether you want to add or delete an item (RMS wanted to git rid of
+ the ugly buttons, the dash is my idea).
+
+ * The `menu-choice' tag should be prettier, something like the
+ abbreviated menus in Open Look.
+
+ * Finish `:tab-order'.
+
+ * Make indentation work with glyphs and proportional fonts.
+
+ * Add commands to show overview of object and class hierarchies to
+ the browser.
+
+ * Find a way to disable mouse highlight for inactive widgets.
+
+ * Find a way to make glyphs look inactive.
+
+ * Add `property-list' widget.
+
+ * Add `association-list' widget.
+
+ * Add `key-binding' widget.
+
+ * Add `widget' widget for editing widget specifications.
+
+ * Find clean way to implement variable length list. See
+ `TeX-printer-list' for an explanation.
+
+ * `C-h' in `widget-prompt-value' should give type specific help.
+
+ * A mailto widget.
+
+ * `C-e e' in a fixed size field should go to the end of the text in
+ the field, not the end of the field itself.
+
+ * Use and overlay instead of markers to delimit the widget. Create
+ accessors for the end points.
+
+ * Clicking on documentation links should call `describe-function' or
+ `widget-browse-other-window' and friends directly, instead of going
+ through `apropos'. If more than one function is valid for the
+ symbol, it should pop up a menu.
+
+
+\1f
+Tag Table:
+Node: Top\7f227
+Node: Introduction\7f607
+Node: User Interface\7f4090
+Node: Programming Example\7f8985
+Node: Setting Up the Buffer\7f12302
+Node: Basic Types\7f14019
+Node: link\7f20064
+Node: url-link\7f20578
+Node: info-link\7f20890
+Node: push-button\7f21181
+Node: editable-field\7f21754
+Node: text\7f23093
+Node: menu-choice\7f23391
+Node: radio-button-choice\7f24256
+Node: item\7f25835
+Node: choice-item\7f26223
+Node: toggle\7f26721
+Node: checkbox\7f27446
+Node: checklist\7f27752
+Node: editable-list\7f29196
+Node: group\7f30378
+Node: Sexp Types\7f30665
+Node: constants\7f30978
+Node: generic\7f32057
+Node: atoms\7f32590
+Node: composite\7f34537
+Node: Widget Properties\7f37003
+Node: Defining New Widgets\7f40066
+Node: Widget Browser\7f45366
+Node: Widget Minor Mode\7f46224
+Node: Utilities\7f46781
+Node: Widget Wishlist\7f47262
+\1f
+End Tag Table