annotate lisp/button.el @ 72550:666bd542be19

(get_window_cursor_type): Replace BOX cursor on images with a hollow box cursor if image is larger than 32x32 (or the default frame font if that is bigger). Replace any other cursor on images with hollow box cursor, as redisplay doesn't support bar and hbar cursors on images.
author Kim F. Storm <storm@cua.dk>
date Sun, 27 Aug 2006 22:23:07 +0000
parents 3bd95f4f2941
children e3694f1cb928 c5406394f567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42497
4c6b45c79a59 Fix header.
Pavel Janík <Pavel@Janik.cz>
parents: 40595
diff changeset
1 ;;; button.el --- clickable buttons
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
2 ;;
68651
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67836
diff changeset
3 ;; Copyright (C) 2001, 2002, 2003, 2004, 2005,
3bd95f4f2941 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67836
diff changeset
4 ;; 2006 Free Software Foundation, Inc.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
5 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
6 ;; Author: Miles Bader <miles@gnu.org>
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
7 ;; Keywords: extensions
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
8 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
10 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
13 ;; the Free Software Foundation; either version 2, or (at your option)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
14 ;; any later version.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
15 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
20 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 60339
diff changeset
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 60339
diff changeset
24 ;; Boston, MA 02110-1301, USA.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
25
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
26 ;;; Commentary:
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
27 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
28 ;; This package defines functions for inserting and manipulating
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
29 ;; clickable buttons in Emacs buffers, such as might be used for help
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
30 ;; hyperlinks, etc.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
31 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
32 ;; In some ways it duplicates functionality also offered by the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
33 ;; `widget' package, but the button package has the advantage that it
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
34 ;; is (1) much faster, (2) much smaller, and (3) much, much, simpler
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
35 ;; (the code, that is, not the interface).
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
36 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
37 ;; Buttons can either use overlays, in which case the button is
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
38 ;; represented by the overlay itself, or text-properties, in which case
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
39 ;; the button is represented by a marker or buffer-position pointing
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
40 ;; somewhere in the button. In the latter case, no markers into the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
41 ;; buffer are retained, which is important for speed if there are are
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
42 ;; extremely large numbers of buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
43 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
44 ;; Using `define-button-type' to define default properties for buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
45 ;; is not necessary, but it is is encouraged, since doing so makes the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
46 ;; resulting code clearer and more efficient.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
47 ;;
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
48
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
49 ;;; Code:
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
50
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
51
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
52 ;; Globals
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
53
60162
82eaf594d12a (escape-glyph, minibuffer-prompt, button): Add commentary for
Eli Zaretskii <eliz@gnu.org>
parents: 57483
diff changeset
54 ;; Use color for the MS-DOS port because it doesn't support underline.
40337
57f029917c77 (button): Special face definition for MS-DOS terminals.
Eli Zaretskii <eliz@gnu.org>
parents: 39917
diff changeset
55 (defface button '((((type pc) (class color))
57f029917c77 (button): Special face definition for MS-DOS terminals.
Eli Zaretskii <eliz@gnu.org>
parents: 39917
diff changeset
56 (:foreground "lightblue"))
57f029917c77 (button): Special face definition for MS-DOS terminals.
Eli Zaretskii <eliz@gnu.org>
parents: 39917
diff changeset
57 (t :underline t))
49001
85b083d06a17 (defface button): Add group.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 42497
diff changeset
58 "Default face used for buttons."
67836
68ab7e53d86a (button): Put into group `basic-faces'.
Richard M. Stallman <rms@gnu.org>
parents: 67375
diff changeset
59 :group 'basic-faces)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
60
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
61 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
62 (defvar button-map
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
63 (let ((map (make-sparse-keymap)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
64 (define-key map "\r" 'push-button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
65 (define-key map [mouse-2] 'push-button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
66 map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
67 "Keymap used by buttons.")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
68
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
69 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
70 (defvar button-buffer-map
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
71 (let ((map (make-sparse-keymap)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
72 (define-key map [?\t] 'forward-button)
67375
77493abd2418 (button-buffer-map): Bind M-TAB to `backward-button'.
Juri Linkov <juri@jurta.org>
parents: 64762
diff changeset
73 (define-key map "\e\t" 'backward-button)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
74 (define-key map [backtab] 'backward-button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
75 map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
76 "Keymap useful for buffers containing buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
77 Mode-specific keymaps may want to use this as their parent keymap.")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
78
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
79 ;; Default properties for buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
80 (put 'default-button 'face 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
81 (put 'default-button 'mouse-face 'highlight)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
82 (put 'default-button 'keymap button-map)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
83 (put 'default-button 'type 'button)
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
84 ;; action may be either a function to call, or a marker to go to
39703
a093c43d935c (button-nop): Function removed.
Miles Bader <miles@gnu.org>
parents: 39676
diff changeset
85 (put 'default-button 'action 'ignore)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
86 (put 'default-button 'help-echo "mouse-2, RET: Push this button")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
87 ;; Make overlay buttons go away if their underlying text is deleted.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
88 (put 'default-button 'evaporate t)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
89 ;; Prevent insertions adjacent to the text-property buttons from
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
90 ;; inheriting its properties.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
91 (put 'default-button 'rear-nonsticky t)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
92 ;; Text property buttons don't have a `button' property of their own, so
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
93 ;; they inherit this.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
94 (put 'default-button 'button t)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
95
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
96 ;; A `category-symbol' property for the default button type
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
97 (put 'button 'button-category-symbol 'default-button)
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
98
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
99
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
100 ;; Button types (which can be used to hold default properties for buttons)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
101
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
102 ;; Because button-type properties are inherited by buttons using the
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
103 ;; special `category' property (implemented by both overlays and
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
104 ;; text-properties), we need to store them on a symbol to which the
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
105 ;; `category' properties can point. Instead of using the symbol that's
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
106 ;; the name of each button-type, however, we use a separate symbol (with
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
107 ;; `-button' appended, and uninterned) to store the properties. This is
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
108 ;; to avoid name clashes.
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
109
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
110 ;; [this is an internal function]
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
111 (defsubst button-category-symbol (type)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
112 "Return the symbol used by button-type TYPE to store properties.
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
113 Buttons inherit them by setting their `category' property to that symbol."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
114 (or (get type 'button-category-symbol)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
115 (error "Unknown button type `%s'" type)))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
116
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
117 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
118 (defun define-button-type (name &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
119 "Define a `button type' called NAME.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
120 The remaining arguments form a sequence of PROPERTY VALUE pairs,
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
121 specifying properties to use as defaults for buttons with this type
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
122 \(a button's type may be set by giving it a `type' property when
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
123 creating the button, using the :type keyword argument).
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
124
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
125 In addition, the keyword argument :supertype may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
126 button-type from which NAME inherits its default property values
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
127 \(however, the inheritance happens only when NAME is defined; subsequent
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
128 changes to a supertype are not reflected in its subtypes)."
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
129 (let ((catsym (make-symbol (concat (symbol-name name) "-button")))
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
130 (super-catsym
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
131 (button-category-symbol
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
132 (or (plist-get properties 'supertype)
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
133 (plist-get properties :supertype)
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
134 'button))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
135 ;; Provide a link so that it's easy to find the real symbol.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
136 (put name 'button-category-symbol catsym)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
137 ;; Initialize NAME's properties using the global defaults.
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
138 (let ((default-props (symbol-plist super-catsym)))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
139 (while default-props
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
140 (put catsym (pop default-props) (pop default-props))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
141 ;; Add NAME as the `type' property, which will then be returned as
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
142 ;; the type property of individual buttons.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
143 (put catsym 'type name)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
144 ;; Add the properties in PROPERTIES to the real symbol.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
145 (while properties
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
146 (let ((prop (pop properties)))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
147 (when (eq prop :supertype)
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
148 (setq prop 'supertype))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
149 (put catsym prop (pop properties))))
40595
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
150 ;; Make sure there's a `supertype' property
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
151 (unless (get catsym 'supertype)
3ba2b666d7e1 (define-button-type): Make sure every user-defined button type has a supertype.
Miles Bader <miles@gnu.org>
parents: 40337
diff changeset
152 (put catsym 'supertype 'button))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
153 name))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
154
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
155 (defun button-type-put (type prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
156 "Set the button-type TYPE's PROP property to VAL."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
157 (put (button-category-symbol type) prop val))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
158
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
159 (defun button-type-get (type prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
160 "Get the property of button-type TYPE named PROP."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
161 (get (button-category-symbol type) prop))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
162
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
163 (defun button-type-subtype-p (type supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
164 "Return t if button-type TYPE is a subtype of SUPERTYPE."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
165 (or (eq type supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
166 (and type
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
167 (button-type-subtype-p (button-type-get type 'supertype)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
168 supertype))))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
169
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
170
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
171 ;; Button properties and other attributes
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
172
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
173 (defun button-start (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
174 "Return the position at which BUTTON starts."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
175 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
176 (overlay-start button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
177 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
178 (or (previous-single-property-change (1+ button) 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
179 (point-min))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
180
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
181 (defun button-end (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
182 "Return the position at which BUTTON ends."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
183 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
184 (overlay-end button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
185 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
186 (or (next-single-property-change button 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
187 (point-max))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
188
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
189 (defun button-get (button prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
190 "Get the property of button BUTTON named PROP."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
191 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
192 (overlay-get button prop)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
193 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
194 (get-text-property button prop)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
195
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
196 (defun button-put (button prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
197 "Set BUTTON's PROP property to VAL."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
198 ;; Treat some properties specially.
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
199 (cond ((memq prop '(type :type))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
200 ;; We translate a `type' property a `category' property, since
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
201 ;; that's what's actually used by overlays/text-properties for
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
202 ;; inheriting properties.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
203 (setq prop 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
204 (setq val (button-category-symbol val)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
205 ((eq prop 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
206 ;; Disallow updating the `category' property directly.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
207 (error "Button `category' property may not be set directly")))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
208 ;; Add the property.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
209 (if (overlayp button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
210 (overlay-put button prop val)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
211 ;; Must be a text-property button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
212 (put-text-property
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
213 (or (previous-single-property-change (1+ button) 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
214 (point-min))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
215 (or (next-single-property-change button 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
216 (point-max))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
217 prop val)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
218
39676
9e8365caa0ee (button-activate): USE-MOUSE-ACTION is optional.
Miles Bader <miles@gnu.org>
parents: 39668
diff changeset
219 (defsubst button-activate (button &optional use-mouse-action)
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
220 "Call BUTTON's action property.
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
221 If USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
222 instead of its normal action; if the button has no mouse-action,
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
223 the normal action is used instead."
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
224 (let ((action (or (and use-mouse-action (button-get button 'mouse-action))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
225 (button-get button 'action))))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
226 (if (markerp action)
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
227 (save-selected-window
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
228 (select-window (display-buffer (marker-buffer action)))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
229 (goto-char action)
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
230 (recenter 0))
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
231 (funcall action button))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
232
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
233 (defun button-label (button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
234 "Return BUTTON's text label."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
235 (buffer-substring-no-properties (button-start button) (button-end button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
236
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
237 (defsubst button-type (button)
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
238 "Return BUTTON's button-type."
39916
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
239 (button-get button 'type))
5827976776b9 *** empty log message ***
Miles Bader <miles@gnu.org>
parents: 39716
diff changeset
240
39716
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
241 (defun button-has-type-p (button type)
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
242 "Return t if BUTTON has button-type TYPE, or one of TYPE's subtypes."
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
243 (button-type-subtype-p (button-get button 'type) type))
66d3b28583a0 (define-button-type): Respect any `supertype' property.
Miles Bader <miles@gnu.org>
parents: 39703
diff changeset
244
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
245
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
246 ;; Creating overlay buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
247
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
248 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
249 (defun make-button (beg end &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
250 "Make a button from BEG to END in the current buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
251 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
252 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
253 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
254 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
255 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
256
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
257 Also see `make-text-button', `insert-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
258 (let ((overlay (make-overlay beg end nil t nil)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
259 (while properties
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
260 (button-put overlay (pop properties) (pop properties)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
261 ;; Put a pointer to the button in the overlay, so it's easy to get
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
262 ;; when we don't actually have a reference to the overlay.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
263 (overlay-put overlay 'button overlay)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
264 ;; If the user didn't specify a type, use the default.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
265 (unless (overlay-get overlay 'category)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
266 (overlay-put overlay 'category 'default-button))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
267 ;; OVERLAY is the button, so return it
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
268 overlay))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
269
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
270 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
271 (defun insert-button (label &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
272 "Insert a button with the label LABEL.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
273 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
274 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
275 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
276 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
277 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
278
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
279 Also see `insert-text-button', `make-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
280 (apply #'make-button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
281 (prog1 (point) (insert label))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
282 (point)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
283 properties))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
284
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
285
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
286 ;; Creating text-property buttons
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
287
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
288 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
289 (defun make-text-button (beg end &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
290 "Make a button from BEG to END in the current buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
291 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
292 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
293 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
294 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
295 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
296
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
297 This function is like `make-button', except that the button is actually
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
298 part of the text instead of being a property of the buffer. Creating
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
299 large numbers of buttons can also be somewhat faster using
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
300 `make-text-button'.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
301
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
302 Also see `insert-text-button'."
60339
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
303 (let ((type-entry
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
304 (or (plist-member properties 'type)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
305 (plist-member properties :type))))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
306 ;; Disallow setting the `category' property directly.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
307 (when (plist-get properties 'category)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
308 (error "Button `category' property may not be set directly"))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
309 (if (null type-entry)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
310 ;; The user didn't specify a `type' property, use the default.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
311 (setq properties (cons 'category (cons 'default-button properties)))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
312 ;; The user did specify a `type' property. Translate it into a
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
313 ;; `category' property, which is what's actually used by
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
314 ;; text-properties for inheritance.
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
315 (setcar type-entry 'category)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
316 (setcar (cdr type-entry)
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
317 (button-category-symbol (car (cdr type-entry))))))
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
318 ;; Now add all the text properties at once
3cd3e3cf3529 Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-145
Miles Bader <miles@gnu.org>
parents: 60162
diff changeset
319 (add-text-properties beg end properties)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
320 ;; Return something that can be used to get at the button.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
321 beg)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
322
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
323 ;;;###autoload
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
324 (defun insert-text-button (label &rest properties)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
325 "Insert a button with the label LABEL.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
326 The remaining arguments form a sequence of PROPERTY VALUE pairs,
39917
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
327 specifying properties to add to the button.
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
328 In addition, the keyword argument :type may be used to specify a
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
329 button-type from which to inherit other properties; see
eb6a85173992 Doc fixes.
Miles Bader <miles@gnu.org>
parents: 39916
diff changeset
330 `define-button-type'.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
331
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
332 This function is like `insert-button', except that the button is
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
333 actually part of the text instead of being a property of the buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
334 Creating large numbers of buttons can also be somewhat faster using
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
335 `insert-text-button'.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
336
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
337 Also see `make-text-button'."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
338 (apply #'make-text-button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
339 (prog1 (point) (insert label))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
340 (point)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
341 properties))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
342
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
343
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
344 ;; Finding buttons in a buffer
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
345
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
346 (defun button-at (pos)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
347 "Return the button at position POS in the current buffer, or nil."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
348 (let ((button (get-char-property pos 'button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
349 (if (or (overlayp button) (null button))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
350 button
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
351 ;; Must be a text-property button; return a marker pointing to it.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
352 (copy-marker pos t))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
353
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
354 (defun next-button (pos &optional count-current)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
355 "Return the next button after position POS in the current buffer.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
356 If COUNT-CURRENT is non-nil, count any button at POS in the search,
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
357 instead of starting at the next button."
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
358 (unless count-current
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
359 ;; Search for the next button boundary.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
360 (setq pos (next-single-char-property-change pos 'button)))
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
361 (and (< pos (point-max))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
362 (or (button-at pos)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
363 ;; We must have originally been on a button, and are now in
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
364 ;; the inter-button space. Recurse to find a button.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
365 (next-button pos))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
366
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
367 (defun previous-button (pos &optional count-current)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
368 "Return the Nth button before position POS in the current buffer.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
369 If COUNT-CURRENT is non-nil, count any button at POS in the search,
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
370 instead of starting at the next button."
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
371 (unless count-current
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
372 (setq pos (previous-single-char-property-change pos 'button)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
373 (and (> pos (point-min))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
374 (or (button-at (1- pos))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
375 ;; We must have originally been on a button, and are now in
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
376 ;; the inter-button space. Recurse to find a button.
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
377 (previous-button pos))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
378
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
379
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
380 ;; User commands
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
381
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
382 (defun push-button (&optional pos use-mouse-action)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
383 "Perform the action specified by a button at location POS.
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
384 POS may be either a buffer position or a mouse-event. If
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
385 USE-MOUSE-ACTION is non-nil, invoke the button's mouse-action
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
386 instead of its normal action; if the button has no mouse-action,
57483
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
387 the normal action is used instead. The action may be either a
12ad045f7911 (button-activate): Allow a marker to display as an action.
Daniel Pfeiffer <occitan@esperanto.org>
parents: 52401
diff changeset
388 function to call or a marker to display.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
389 POS defaults to point, except when `push-button' is invoked
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
390 interactively as the result of a mouse-event, in which case, the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
391 mouse event is used.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
392 If there's no button at POS, do nothing and return nil, otherwise
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
393 return t."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
394 (interactive
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
395 (list (if (integerp last-command-event) (point) last-command-event)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
396 (if (and (not (integerp pos)) (eventp pos))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
397 ;; POS is a mouse event; switch to the proper window/buffer
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
398 (let ((posn (event-start pos)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
399 (with-current-buffer (window-buffer (posn-window posn))
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
400 (push-button (posn-point posn) t)))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
401 ;; POS is just normal position
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
402 (let ((button (button-at (or pos (point)))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
403 (if (not button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
404 nil
39655
6aeeb8a310af (next-button, previous-button): Respect `skip' property.
Miles Bader <miles@gnu.org>
parents: 39643
diff changeset
405 (button-activate button use-mouse-action)
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
406 t))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
407
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
408 (defun forward-button (n &optional wrap display-message)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
409 "Move to the Nth next button, or Nth previous button if N is negative.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
410 If N is 0, move to the start of any button at point.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
411 If WRAP is non-nil, moving past either end of the buffer continues from the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
412 other end.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
413 If DISPLAY-MESSAGE is non-nil, the button's help-echo string is displayed.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
414 Any button with a non-nil `skip' property is skipped over.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
415 Returns the button found."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
416 (interactive "p\nd\nd")
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
417 (let (button)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
418 (if (zerop n)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
419 ;; Move to start of current button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
420 (if (setq button (button-at (point)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
421 (goto-char (button-start button)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
422 ;; Move to Nth next button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
423 (let ((iterator (if (> n 0) #'next-button #'previous-button))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
424 (wrap-start (if (> n 0) (point-min) (point-max))))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
425 (setq n (abs n))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
426 (setq button t) ; just to start the loop
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
427 (while (and (> n 0) button)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
428 (setq button (funcall iterator (point)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
429 (when (and (not button) wrap)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
430 (setq button (funcall iterator wrap-start t)))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
431 (when button
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
432 (goto-char (button-start button))
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
433 (unless (button-get button 'skip)
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
434 (setq n (1- n)))))))
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
435 (if (null button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
436 (error (if wrap "No buttons!" "No more buttons"))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
437 (let ((msg (and display-message (button-get button 'help-echo))))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
438 (when msg
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
439 (message "%s" msg)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
440 button)))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
441
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
442 (defun backward-button (n &optional wrap display-message)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
443 "Move to the Nth previous button, or Nth next button if N is negative.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
444 If N is 0, move to the start of any button at point.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
445 If WRAP is non-nil, moving past either end of the buffer continues from the
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
446 other end.
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
447 If DISPLAY-MESSAGE is non-nil, the button's help-echo string is displayed.
39668
1666965880cc (next-button, previous-button): Remove N and WRAP parameters.
Miles Bader <miles@gnu.org>
parents: 39655
diff changeset
448 Any button with a non-nil `skip' property is skipped over.
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
449 Returns the button found."
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
450 (interactive "p\nd\nd")
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
451 (forward-button (- n) wrap display-message))
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
452
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
453
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
454 (provide 'button)
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
455
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49001
diff changeset
456 ;;; arch-tag: 5f2c7627-413b-4097-b282-630f89d9c5e9
39643
3159dbc2f268 Initial checkin.
Miles Bader <miles@gnu.org>
parents:
diff changeset
457 ;;; button.el ends here