| 1 | ;;; widget.el --- a library of user interface components |
| 2 | ;; |
| 3 | ;; Copyright (C) 1996-1997, 2001-2014 Free Software Foundation, Inc. |
| 4 | ;; |
| 5 | ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> |
| 6 | ;; Keywords: help, extensions, faces, hypermedia |
| 7 | ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ |
| 8 | ;; Package: emacs |
| 9 | |
| 10 | ;; This file is part of GNU Emacs. |
| 11 | |
| 12 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
| 13 | ;; it under the terms of the GNU General Public License as published by |
| 14 | ;; the Free Software Foundation, either version 3 of the License, or |
| 15 | ;; (at your option) any later version. |
| 16 | |
| 17 | ;; GNU Emacs is distributed in the hope that it will be useful, |
| 18 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 19 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 20 | ;; GNU General Public License for more details. |
| 21 | |
| 22 | ;; You should have received a copy of the GNU General Public License |
| 23 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
| 24 | |
| 25 | ;;; Commentary: |
| 26 | ;; |
| 27 | ;; The widget library is partially documented in the `widget' Info |
| 28 | ;; file. |
| 29 | ;; |
| 30 | ;; This file only contains the code needed to define new widget types. |
| 31 | ;; Everything else is autoloaded from `wid-edit.el'. |
| 32 | |
| 33 | ;;; Code: |
| 34 | |
| 35 | ;; Doing this is unnecessary in Emacs 20. Kept as dummy in case |
| 36 | ;; external libraries call it. We save a kb or two of purespace by |
| 37 | ;; dummying-out such definitions generally. |
| 38 | (defmacro define-widget-keywords (&rest _keys) |
| 39 | ;; ;; Don't use backquote, since that makes trouble trying to |
| 40 | ;; ;; re-bootstrap from just the .el files. |
| 41 | ;; (list 'eval-and-compile |
| 42 | ;; (list 'let (list (list 'keywords (list 'quote keys))) |
| 43 | ;; (list 'while 'keywords |
| 44 | ;; (list 'or (list 'boundp (list 'car 'keywords)) |
| 45 | ;; (list 'set (list 'car 'keywords) (list 'car 'keywords))) |
| 46 | ;; (list 'setq 'keywords (list 'cdr 'keywords))))) |
| 47 | ) |
| 48 | |
| 49 | ;;(define-widget-keywords :documentation-indent |
| 50 | ;; :complete-function :complete :button-overlay |
| 51 | ;; :field-overlay |
| 52 | ;; :documentation-shown :button-prefix |
| 53 | ;; :button-suffix :mouse-down-action :glyph-up :glyph-down :glyph-inactive |
| 54 | ;; :prompt-internal :prompt-history :prompt-match |
| 55 | ;; :prompt-value :deactivate :active |
| 56 | ;; :inactive :activate :sibling-args :delete-button-args |
| 57 | ;; :insert-button-args :append-button-args :button-args |
| 58 | ;; :tag-glyph :off-glyph :on-glyph :valid-regexp |
| 59 | ;; :secret :sample-face :sample-face-get :case-fold |
| 60 | ;; :create :convert-widget :format :value-create :offset :extra-offset |
| 61 | ;; :tag :doc :from :to :args :value :action |
| 62 | ;; :value-set :value-delete :match :parent :delete :menu-tag-get |
| 63 | ;; :value-get :choice :void :menu-tag :on :off :on-type :off-type |
| 64 | ;; :notify :entry-format :button :children :buttons :insert-before |
| 65 | ;; :delete-at :format-handler :widget :value-pos :value-to-internal |
| 66 | ;; :indent :size :value-to-external :validate :error :directory |
| 67 | ;; :must-match :type-error :value-inline :inline :match-inline :greedy |
| 68 | ;; :button-face-get :button-face :value-face :keymap :entry-from |
| 69 | ;; :entry-to :help-echo :documentation-property :tab-order) |
| 70 | |
| 71 | (put 'define-widget 'doc-string-elt 3) ;`declare' doesn't work in functions. |
| 72 | (defun define-widget (name class doc &rest args) |
| 73 | "Define a new widget type named NAME from CLASS. |
| 74 | |
| 75 | NAME and CLASS should both be symbols, CLASS should be one of the |
| 76 | existing widget types, or nil to create the widget from scratch. |
| 77 | |
| 78 | After the new widget has been defined, the following two calls will |
| 79 | create identical widgets: |
| 80 | |
| 81 | * (widget-create NAME) |
| 82 | |
| 83 | * (apply 'widget-create CLASS ARGS) |
| 84 | |
| 85 | The third argument DOC is a documentation string for the widget." |
| 86 | (put name 'widget-type (cons class args)) |
| 87 | (put name 'widget-documentation (purecopy doc)) |
| 88 | name) |
| 89 | |
| 90 | ;; This is used by external widget code (in W3, at least). |
| 91 | (defalias 'widget-plist-member 'plist-member) |
| 92 | |
| 93 | ;;; The End. |
| 94 | |
| 95 | (provide 'widget) |
| 96 | |
| 97 | ;;; widget.el ends here |