Mercurial > hg > xemacs-beta
comparison lisp/ediff/ediff-tbar.el @ 16:0293115a14e9 r19-15b91
Import from CVS: tag r19-15b91
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:49:20 +0200 |
parents | |
children | bfd6434d15b3 |
comparison
equal
deleted
inserted
replaced
15:ad457d5f7d04 | 16:0293115a14e9 |
---|---|
1 ;;; ediff-tbar.el --- A toolbar for Ediff control buffer | |
2 | |
3 ;; Copyright (C) 1996, 1997 Free Software Foundation, Inc. | |
4 | |
5 ;; Author: Marc Paquette <marcpa@cam.org> | |
6 | |
7 ;; This file is part of GNU Emacs. | |
8 | |
9 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
10 ;; it under the terms of the GNU General Public License as published by | |
11 ;; the Free Software Foundation; either version 2, or (at your option) | |
12 ;; any later version. | |
13 | |
14 ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 ;; GNU General Public License for more details. | |
18 | |
19 ;; You should have received a copy of the GNU General Public License | |
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
22 ;; Boston, MA 02111-1307, USA. | |
23 | |
24 ;;; Code: | |
25 | |
26 (provide 'ediff-tbar) | |
27 | |
28 ;; compiler pacifier | |
29 (defvar toolbar-icon-directory) | |
30 | |
31 (eval-when-compile | |
32 (let ((load-path (cons (expand-file-name ".") load-path))) | |
33 (or (featurep 'ediff-init) | |
34 (load "ediff-init.el" nil nil 'nosuffix)) | |
35 (or (featurep 'ediff-util) | |
36 (load "ediff-util.el" nil nil 'nosuffix)) | |
37 )) | |
38 ;; end pacifier | |
39 | |
40 (require 'ediff-init) | |
41 | |
42 (defvar ediff-use-toolbar-p nil | |
43 "If t, Ediff will use a toolbar for the control frame. | |
44 This has an effect only if your emacs supports Toolbars. | |
45 Currently, XEmacs does, but not Emacs. | |
46 Do not change the value of this variable interactively. | |
47 This should be done only via the menu bar or by executing | |
48 `ediff-toggle-use-toolbar'.") | |
49 | |
50 (defvar ediff-toolbar-height 21 | |
51 "The height of the Ediff toolbar. | |
52 The value must match the actual size of the toolbar icons.") | |
53 | |
54 (defvar ediff-toolbar-width 200.0 | |
55 "The width of the Ediff toolbar. | |
56 The value must match the actual width of the toolbar. | |
57 Here's an example: | |
58 There are 10 buttons, each 15 pixels large, and the shadows occupy 2 | |
59 pixels each side, and the last button is right-justified (so we reserve | |
60 about 30 pixels for fill space) = 200 pixels.") | |
61 | |
62 (defun ediff-has-toolbar-support-p () | |
63 (and ediff-xemacs-p | |
64 (featurep 'toolbar) | |
65 (console-on-window-system-p))) | |
66 | |
67 (defun ediff-use-toolbar-p () | |
68 (and (ediff-has-toolbar-support-p) ;Can it do it ? | |
69 ediff-use-toolbar-p)) ;Does the user want it ? | |
70 | |
71 ;; Here the toolbar width is not the same width talked about in XEmacs | |
72 ;; lispref info documentation : it is the minimal width needed by | |
73 ;; ediff's toolbar to display all buttons, for an horizontal toolbar. | |
74 ;; Ideally, we would query the toolbar for the width of each button | |
75 ;; and add them, but I didn't find query functions in the doc on | |
76 ;; toolbars. Therefore, I use a static number of pixels that should | |
77 ;; be adjusted if the toolbar gets more or loses some buttons. --marcpa | |
78 (defun ediff-compute-toolbar-width () | |
79 (if (not (ediff-use-toolbar-p)) | |
80 0 | |
81 (ceiling (/ ediff-toolbar-width (font-instance-width (face-font-instance 'default)))))) | |
82 | |
83 (defvar ediff-toolbar-next-icon | |
84 (if (featurep 'toolbar) | |
85 (toolbar-make-button-list | |
86 (expand-file-name | |
87 (if (featurep 'xpm) "ediff-next.xpm" "ediff-next.xbm") | |
88 toolbar-icon-directory))) | |
89 "Next difference icon in toolbar.") | |
90 | |
91 (defvar ediff-toolbar-previous-icon | |
92 (if (featurep 'toolbar) | |
93 (toolbar-make-button-list | |
94 (expand-file-name | |
95 (if (featurep 'xpm) "ediff-prev.xpm" "ediff-prev.xbm") | |
96 toolbar-icon-directory))) | |
97 "Previous difference icon in toolbar.") | |
98 | |
99 (defvar ediff-toolbar-A-icon | |
100 (if (featurep 'toolbar) | |
101 (toolbar-make-button-list | |
102 (expand-file-name | |
103 ;; UP | |
104 (if (featurep 'xpm) "ediff-A-up.xpm" "ediff-A-up.xbm") | |
105 toolbar-icon-directory) | |
106 (expand-file-name | |
107 ;; DOWN | |
108 (if (featurep 'xpm) "ediff-A-up.xpm" "ediff-A-up.xbm") | |
109 toolbar-icon-directory) | |
110 (expand-file-name | |
111 ;; DISABLED | |
112 (if (featurep 'xpm) "ediff-A-xx.xpm" "ediff-A-up.xbm") | |
113 toolbar-icon-directory) | |
114 )) | |
115 "Select diff A icon in toolbar.") | |
116 | |
117 (defvar ediff-toolbar-B-icon | |
118 (if (featurep 'toolbar) | |
119 (toolbar-make-button-list | |
120 (expand-file-name | |
121 ;; UP | |
122 (if (featurep 'xpm) "ediff-B-up.xpm" "ediff-B-up.xbm") | |
123 toolbar-icon-directory) | |
124 (expand-file-name | |
125 ;; DOWN | |
126 (if (featurep 'xpm) "ediff-B-up.xpm" "ediff-B-up.xbm") | |
127 toolbar-icon-directory) | |
128 (expand-file-name | |
129 ;; DISABLED | |
130 (if (featurep 'xpm) "ediff-B-xx.xpm" "ediff-B-up.xbm") | |
131 toolbar-icon-directory) | |
132 )) | |
133 "Select diff B icon in toolbar.") | |
134 | |
135 (defvar ediff-toolbar-toggle-split-icon | |
136 (if (featurep 'toolbar) | |
137 (toolbar-make-button-list | |
138 (expand-file-name | |
139 ;; UP | |
140 (if (featurep 'xpm) | |
141 "ediff-toggle-split-up.xpm" "ediff-toggle-split-up.xbm") | |
142 toolbar-icon-directory) | |
143 )) | |
144 "Toggle split mode between side-to-side and one-on-top-of-another.") | |
145 | |
146 (defvar ediff-toolbar-save-icon | |
147 (if (featurep 'toolbar) | |
148 (toolbar-make-button-list | |
149 (expand-file-name | |
150 ;; UP | |
151 (if (featurep 'xpm) "ediff-save.xpm" "ediff-save.xbm") | |
152 toolbar-icon-directory) | |
153 (expand-file-name | |
154 ;; DOWN | |
155 (if (featurep 'xpm) "ediff-save.xpm" "ediff-save.xbm") | |
156 toolbar-icon-directory) | |
157 (expand-file-name | |
158 ;; DISABLED | |
159 (if (featurep 'xpm) "ediff-save-xx.xpm" "ediff-save-xx.xbm") | |
160 toolbar-icon-directory) | |
161 )) | |
162 "Save merge buffer.") | |
163 | |
164 (defvar ediff-toolbar-quit-icon | |
165 (if (featurep 'toolbar) | |
166 (toolbar-make-button-list | |
167 (expand-file-name | |
168 (if (featurep 'xpm) "ediff-quit.xpm" "ediff-quit.xbm") | |
169 toolbar-icon-directory))) | |
170 "Exit Ediff session.") | |
171 | |
172 (defvar ediff-toolbar-help-icon | |
173 (if (featurep 'toolbar) | |
174 (toolbar-make-button-list | |
175 (expand-file-name | |
176 (if (featurep 'xpm) "ediff-help.xpm" "ediff-help.xbm") | |
177 toolbar-icon-directory))) | |
178 "Show Ediff help.") | |
179 | |
180 (defvar ediff-toolbar-refresh-icon | |
181 (if (featurep 'toolbar) | |
182 (toolbar-make-button-list | |
183 (expand-file-name | |
184 (if (featurep 'xpm) "ediff-update.xpm" "ediff-update.xbm") | |
185 toolbar-icon-directory))) | |
186 "Refresh Ediff display (aka recenter).") | |
187 | |
188 (defvar ediff-toolbar-refine-icon | |
189 (if (featurep 'toolbar) | |
190 (toolbar-make-button-list | |
191 (expand-file-name | |
192 ;; UP | |
193 (if (featurep 'xpm) "ediff-refine.xpm" "ediff-refine.xbm") | |
194 toolbar-icon-directory) | |
195 )) | |
196 "Refine current difference region by computing fine diffs.") | |
197 | |
198 (defun ediff-toolbar-previous-difference () | |
199 (interactive) | |
200 (let ((ediff-grab-mouse nil)) | |
201 (ediff-previous-difference 1))) | |
202 | |
203 (defun ediff-toolbar-next-difference () | |
204 (interactive) | |
205 (let ((ediff-grab-mouse nil)) | |
206 (ediff-next-difference 1))) | |
207 | |
208 (defun ediff-toolbar-select/copy-A () | |
209 (interactive) | |
210 (let ((ediff-grab-mouse nil)) | |
211 (cond ((or (ediff-merge-job) | |
212 (ediff-merge-with-ancestor-job)) | |
213 (ediff-copy-A-to-C nil)) | |
214 (t | |
215 (ediff-copy-A-to-B nil))))) | |
216 | |
217 (defun ediff-toolbar-select/copy-B () | |
218 (interactive) | |
219 (let ((ediff-grab-mouse nil)) | |
220 (cond ((or (ediff-merge-job) | |
221 (ediff-merge-with-ancestor-job)) | |
222 (ediff-copy-B-to-C nil)) | |
223 (t | |
224 (ediff-copy-B-to-A nil))))) | |
225 | |
226 (defun ediff-toolbar-toggle-split () | |
227 (interactive) | |
228 (let ((ediff-grab-mouse nil)) | |
229 (ediff-toggle-split))) | |
230 | |
231 | |
232 (defun ediff-toolbar-save () | |
233 (interactive) | |
234 (ediff-barf-if-not-control-buffer) | |
235 (if (ediff-merge-job) | |
236 (ediff-maybe-save-and-delete-merge 'save-and-continue) | |
237 ;; 2-way or 3-way compare: save modified buffers | |
238 (mapcar (function | |
239 (lambda (type) | |
240 (let ((ebuf (ediff-get-buffer type))) | |
241 (and (ediff-buffer-live-p ebuf) | |
242 (ediff-eval-in-buffer ebuf | |
243 (and (buffer-modified-p) | |
244 (save-buffer))))))) | |
245 '(A B C)))) | |
246 | |
247 | |
248 (defun ediff-toolbar-quit () | |
249 (interactive) | |
250 (let ((ediff-grab-mouse nil)) | |
251 (ediff-quit nil))) | |
252 | |
253 (defun ediff-toolbar-help () | |
254 (interactive) | |
255 (ediff-toggle-help)) | |
256 | |
257 (defun ediff-toolbar-refresh () | |
258 "Recenter" | |
259 (interactive) | |
260 (let ((ediff-grab-mouse nil)) | |
261 (ediff-recenter))) | |
262 | |
263 (defun ediff-toolbar-refine () | |
264 "Refine current difference region by computing fine diffs." | |
265 (interactive) | |
266 (let ((ediff-grab-mouse nil)) | |
267 (ediff-make-or-kill-fine-diffs 'make-them))) | |
268 | |
269 (defun ediff-toolbar-refine-needed-p () | |
270 (and (> ediff-current-difference 0) | |
271 (> ediff-auto-refine-limit | |
272 (- (ediff-get-diff-posn 'A 'end ediff-current-difference) | |
273 (ediff-get-diff-posn 'A 'beg ediff-current-difference))))) | |
274 | |
275 (defvar ediff-toolbar | |
276 (if (featurep 'toolbar) | |
277 '([ediff-toolbar-refine-icon | |
278 ediff-toolbar-refine | |
279 t | |
280 ;;; The toolbar is not automatically refreshed (in 19.14) | |
281 ;;; when :activep changes state. | |
282 ;;(ediff-toolbar-refine-needed-p) | |
283 "Refine current difference region by computing fine diffs."] | |
284 [ediff-toolbar-previous-icon | |
285 ediff-toolbar-previous-difference | |
286 t | |
287 "Go to the previous difference."] | |
288 [ediff-toolbar-next-icon | |
289 ediff-toolbar-next-difference | |
290 t | |
291 "Advance to the next difference."] | |
292 [ediff-toolbar-A-icon | |
293 ediff-toolbar-select/copy-A | |
294 (not (ediff-3way-comparison-job)) | |
295 "Select/Copy difference A."] | |
296 [ediff-toolbar-B-icon | |
297 ediff-toolbar-select/copy-B | |
298 (not (ediff-3way-comparison-job)) | |
299 "Select/Copy difference B."] | |
300 [ediff-toolbar-save-icon | |
301 ediff-toolbar-save | |
302 t | |
303 "Save buffers modified in this session."] | |
304 [ediff-toolbar-refresh-icon | |
305 ediff-toolbar-refresh | |
306 t | |
307 "Refresh Ediff display (aka recenter)."] | |
308 [ediff-toolbar-toggle-split-icon | |
309 ediff-toolbar-toggle-split | |
310 t | |
311 "Toggle split mode between side-to-side and one-on-top-of-another."] | |
312 [ediff-toolbar-help-icon | |
313 ediff-toolbar-help | |
314 t | |
315 "Toggle short/long help."] | |
316 nil | |
317 [ediff-toolbar-quit-icon | |
318 ediff-toolbar-quit | |
319 t | |
320 "Quit this ediff session."] | |
321 ))) | |
322 | |
323 (defvar ediff-toolbar-3way | |
324 (if (featurep 'toolbar) | |
325 '([ediff-toolbar-refine-icon | |
326 ediff-toolbar-refine | |
327 t | |
328 ;;; The toolbar is not automatically refreshed (in 19.14) | |
329 ;;; when :activep changes state. | |
330 ;;(ediff-toolbar-refine-needed-p) | |
331 "Refine current difference region by computing fine diffs."] | |
332 [ediff-toolbar-previous-icon | |
333 ediff-toolbar-previous-difference | |
334 t | |
335 "Go to the previous difference."] | |
336 [ediff-toolbar-next-icon | |
337 ediff-toolbar-next-difference | |
338 t | |
339 "Advance to the next difference."] | |
340 [ediff-toolbar-save-icon | |
341 ediff-toolbar-save | |
342 t | |
343 "Save buffers modified in this session."] | |
344 [ediff-toolbar-refresh-icon | |
345 ediff-toolbar-refresh | |
346 t | |
347 "Refresh Ediff display (aka recenter)."] | |
348 [ediff-toolbar-toggle-split-icon | |
349 ediff-toolbar-toggle-split | |
350 t | |
351 "Toggle split mode between side-to-side and one-on-top-of-another."] | |
352 [ediff-toolbar-help-icon | |
353 ediff-toolbar-help | |
354 t | |
355 "Toggle short/long help."] | |
356 nil | |
357 [ediff-toolbar-quit-icon | |
358 ediff-toolbar-quit | |
359 t | |
360 "Quit this ediff session."] | |
361 ))) | |
362 | |
363 | |
364 | |
365 ;;; Local Variables: | |
366 ;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun) | |
367 ;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1) | |
368 ;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body)) | |
369 ;;; End: | |
370 | |
371 ;;; ediff-tbar.el ends here |