comparison lisp/overlay.el @ 219:262b8bb4a523 r20-4b8

Import from CVS: tag r20-4b8
author cvs
date Mon, 13 Aug 2007 10:09:35 +0200
parents
children
comparison
equal deleted inserted replaced
218:c9f226976f56 219:262b8bb4a523
1 ;;; overlay.el --- overlay support.
2
3 ;; Copyright (C) 1997 Free Software Foundation, Inc.
4
5 ;; Author: Joe Nuspl <nuspl@sequent.com>
6 ;; Maintainer: XEmacs Development Team (in <hniksic@srce.hr> incarnation)
7 ;; Keywords: internal
8
9 ;; This file is part of XEmacs.
10
11 ;; XEmacs is free software; you can redistribute it and/or modify it
12 ;; under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; any later version.
15
16 ;; XEmacs is distributed in the hope that it will be useful, but
17 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 ;; General Public License for more details.
20
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with XEmacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
24 ;; Boston, MA 02111-1307, USA.
25
26 ;;; Synched up with: Not in FSF.
27
28 ;;; Commentary:
29
30 ;; Unlike the text-properties interface, these functions are in fact
31 ;; totally useless in XEmacs. They are a more or less straightforward
32 ;; interface to the much better extent API, provided exclusively for
33 ;; GNU Emacs compatibility. If you notice an incompatibility not
34 ;; mentioned below, be sure to mention it. Anyways, you should really
35 ;; not use this.
36
37 ;; Known incompatibilities with the FSF interface:
38
39 ;; 1. There is not an `overlay' type. Any extent with non-nil
40 ;; 'overlay property is considered an "overlay".
41 ;;
42 ;; 2. Some features of FSF overlays have not been implemented in
43 ;; extents (or are unneeded). Specifically, those are the
44 ;; following special properties: window, insert-in-front-hooks,
45 ;; insert-behind-hooks, and modification-hooks. Some of these will
46 ;; probably be implemented for extents in the future.
47 ;;
48 ;; 3. In FSF, beginning and end of an overlay are markers, which means
49 ;; that you can use `insert-before-markers' to change insertion
50 ;; property of overlay. It will not work in this emulation, and we
51 ;; have no plans of providing it.
52 ;;
53 ;; 4. The `overlays-in' and `overlays-at' functions in some cases
54 ;; don't work as they should. To be fixed RSN.
55 ;;
56 ;; 5. Finally, setting or modification of overlay properties specific
57 ;; to extents will have unusual results. While (overlay-put
58 ;; overlay 'start-open t) does nothing under FSF, it has a definite
59 ;; effect under XEmacs. This is solved by simply avoiding such
60 ;; names (see `set-extent-property' for a list).
61
62 ;; Some functions were broken; fixed-up by Hrvoje Niksic, June 1997.
63
64
65 ;;; Code:
66
67 (defun overlayp (object)
68 "Return t if OBJECT is an overlay."
69 (and (extentp object)
70 (extent-property object 'overlay)))
71
72 (defun make-overlay (beg end &optional buffer front-advance rear-advance)
73 "Create a new overlay with range BEG to END in BUFFER.
74 If omitted, BUFFER defaults to the current buffer.
75 BEG and END may be integers or markers.
76 The fourth arg FRONT-ADVANCE, if non-nil, makes the
77 front delimiter advance when text is inserted there.
78 The fifth arg REAR-ADVANCE, if non-nil, makes the
79 rear delimiter advance when text is inserted there."
80 (if (null buffer)
81 (setq buffer (current-buffer))
82 (check-argument-type 'bufferp buffer))
83 (when (> beg end)
84 (setq beg (prog1 end (setq end beg))))
85
86 (let ((overlay (make-extent beg end buffer)))
87 (set-extent-property overlay 'overlay t)
88 (if front-advance
89 (set-extent-property overlay 'start-open t)
90 (set-extent-property overlay 'start-closed t))
91 (if rear-advance
92 (set-extent-property overlay 'end-closed t)
93 (set-extent-property overlay 'end-open t))
94
95 overlay))
96
97 (defun move-overlay (overlay beg end &optional buffer)
98 "Set the endpoints of OVERLAY to BEG and END in BUFFER.
99 If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now.
100 If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current
101 buffer."
102 (check-argument-type 'overlayp overlay)
103 (if (null buffer)
104 (setq buffer (extent-object overlay)))
105 (if (null buffer)
106 (setq buffer (current-buffer)))
107 (check-argument-type 'bufferp buffer)
108 (and (= beg end)
109 (extent-property overlay 'evaporate)
110 (delete-overlay overlay))
111 (when (> beg end)
112 (setq beg (prog1 end (setq end beg))))
113 (set-extent-endpoints overlay beg end buffer)
114 overlay)
115
116 (defun delete-overlay (overlay)
117 "Delete the overlay OVERLAY from its buffer."
118 (check-argument-type 'overlayp overlay)
119 (detach-extent overlay)
120 nil)
121
122 (defun overlay-start (overlay)
123 "Return the position at which OVERLAY starts."
124 (check-argument-type 'overlayp overlay)
125 (extent-start-position overlay))
126
127 (defun overlay-end (overlay)
128 "Return the position at which OVERLAY ends."
129 (check-argument-type 'overlayp overlay)
130 (extent-end-position overlay))
131
132 (defun overlay-buffer (overlay)
133 "Return the buffer OVERLAY belongs to."
134 (check-argument-type 'overlayp overlay)
135 (extent-object overlay))
136
137 (defun overlay-properties (overlay)
138 "Return a list of the properties on OVERLAY.
139 This is a copy of OVERLAY's plist; modifying its conses has no effect on
140 OVERLAY."
141 (check-argument-type 'overlayp overlay)
142 (extent-properties overlay))
143
144 (defun overlays-at (pos)
145 "Return a list of the overlays that contain position POS."
146 (overlays-in pos pos))
147
148 (defun overlays-in (beg end)
149 "Return a list of the overlays that overlap the region BEG ... END.
150 Overlap means that at least one character is contained within the overlay
151 and also contained within the specified region.
152 Empty overlays are included in the result if they are located at BEG
153 or between BEG and END."
154 (mapcar-extents #'identity nil nil beg end
155 'all-extents-closed-open 'overlay))
156
157 (defun next-overlay-change (pos)
158 "Return the next position after POS where an overlay starts or ends.
159 If there are no more overlay boundaries after POS, return (point-max)."
160 (let ((next (point-max))
161 tmp)
162 (map-extents
163 (lambda (overlay ignore)
164 (when (or (and (< (setq tmp (extent-start-position overlay)) next)
165 (> tmp pos))
166 (and (< (setq tmp (extent-end-position overlay)) next)
167 (> tmp pos)))
168 (setq next tmp))
169 nil)
170 nil pos nil nil 'all-extents-closed-open 'overlay)
171 next))
172
173 (defun previous-overlay-change (pos)
174 "Return the previous position before POS where an overlay starts or ends.
175 If there are no more overlay boundaries before POS, return (point-min)."
176 (let ((prev (point-min))
177 tmp)
178 (map-extents
179 (lambda (overlay ignore)
180 (when (or (and (> (setq tmp (extent-end-position overlay)) prev)
181 (< tmp pos))
182 (and (> (setq tmp (extent-start-position overlay)) prev)
183 (< tmp pos)))
184 (setq prev tmp))
185 nil)
186 nil nil pos nil 'all-extents-closed-open 'overlay)
187 prev))
188
189 (defun overlay-lists ()
190 "Return a pair of lists giving all the overlays of the current buffer.
191 The car has all the overlays before the overlay center;
192 the cdr has all the overlays after the overlay center.
193 Recentering overlays moves overlays between these lists.
194 The lists you get are copies, so that changing them has no effect.
195 However, the overlays you get are the real objects that the buffer uses."
196 (or (boundp 'xemacs-internal-overlay-center-pos)
197 (overlay-recenter (1+ (/ (- (point-max) (point-min)) 2))))
198 (let ((pos xemacs-internal-overlay-center-pos)
199 before after)
200 (map-extents (lambda (overlay ignore)
201 (if (> pos (extent-end-position overlay))
202 (push overlay before)
203 (push overlay after))
204 nil)
205 nil nil nil nil 'all-extents-closed-open 'overlay)
206 (cons (nreverse before) (nreverse after))))
207
208 (defun overlay-recenter (pos)
209 "Recenter the overlays of the current buffer around position POS."
210 (set (make-local-variable 'xemacs-internal-overlay-center-pos) pos))
211
212 (defun overlay-get (overlay prop)
213 "Get the property of overlay OVERLAY with property name PROP."
214 (check-argument-type 'overlayp overlay)
215 (let ((value (extent-property overlay prop))
216 category)
217 (if (and (null value)
218 (setq category (extent-property overlay 'category)))
219 (get category prop)
220 value)))
221
222 (defun overlay-put (overlay prop value)
223 "Set one property of overlay OVERLAY: give property PROP value VALUE."
224 (check-argument-type 'overlayp overlay)
225 (cond ((eq prop 'evaporate)
226 (set-extent-property overlay 'detachable value))
227 ((eq prop 'before-string)
228 (set-extent-property overlay 'begin-glyph
229 (make-glyph (vector 'string :data value))))
230 ((eq prop 'after-string)
231 (set-extent-property overlay 'end-glyph
232 (make-glyph (vector 'string :data value))))
233 ((eq prop 'local-map)
234 (set-extent-property overlay 'keymap value))
235 ((memq prop '(window insert-in-front-hooks insert-behind-hooks
236 modification-hooks))
237 (error "cannot support overlay '%s property under XEmacs"
238 prop)))
239 (set-extent-property overlay prop value))
240
241 (provide 'overlay)
242
243 ;;; overlay.el ends here