diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/ediff/ediff-tbar.el	Mon Aug 13 08:49:20 2007 +0200
@@ -0,0 +1,371 @@
+;;; ediff-tbar.el --- A toolbar for Ediff control buffer
+
+;; Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+
+;; Author: Marc Paquette <marcpa@cam.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Code:
+	 
+(provide 'ediff-tbar)
+
+;; compiler pacifier
+(defvar toolbar-icon-directory)
+
+(eval-when-compile
+  (let ((load-path (cons (expand-file-name ".") load-path)))
+    (or (featurep 'ediff-init)
+	(load "ediff-init.el" nil nil 'nosuffix))
+    (or (featurep 'ediff-util)
+	(load "ediff-util.el" nil nil 'nosuffix))
+    ))
+;; end pacifier
+
+(require 'ediff-init)
+
+(defvar ediff-use-toolbar-p nil
+  "If t, Ediff will use a toolbar for the control frame.
+This has an effect only if your emacs supports Toolbars.
+Currently, XEmacs does, but not Emacs.
+Do not change the value of this variable interactively.
+This should be done only via the menu bar or by executing
+`ediff-toggle-use-toolbar'.")
+
+(defvar ediff-toolbar-height 21
+  "The height of the Ediff toolbar.
+The value must match the actual size of the toolbar icons.")
+
+(defvar ediff-toolbar-width 200.0
+  "The width of the Ediff toolbar.
+The value must match the actual width of the toolbar.
+Here's an example:
+    There are 10 buttons, each 15 pixels large, and the shadows occupy 2
+   pixels each side, and the last button is right-justified (so we reserve
+   about 30 pixels for fill space) = 200 pixels.")
+
+(defun ediff-has-toolbar-support-p ()
+  (and ediff-xemacs-p
+       (featurep 'toolbar)
+       (console-on-window-system-p)))
+       
+(defun ediff-use-toolbar-p ()
+  (and (ediff-has-toolbar-support-p)	;Can it do it ?
+       ediff-use-toolbar-p))		;Does the user want it ?
+
+;; Here the toolbar width is not the same width talked about in XEmacs
+;; lispref info documentation : it is the minimal width needed by
+;; ediff's toolbar to display all buttons, for an horizontal toolbar.
+;; Ideally, we would query the toolbar for the width of each button
+;; and add them, but I didn't find query functions in the doc on
+;; toolbars.  Therefore, I use a static number of pixels that should
+;; be adjusted if the toolbar gets more or loses some buttons. --marcpa
+(defun ediff-compute-toolbar-width ()
+  (if (not (ediff-use-toolbar-p))
+      0
+    (ceiling (/ ediff-toolbar-width (font-instance-width (face-font-instance 'default))))))
+
+(defvar ediff-toolbar-next-icon
+   (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	(if (featurep 'xpm) "ediff-next.xpm" "ediff-next.xbm")
+	toolbar-icon-directory)))
+  "Next difference icon in toolbar.")
+
+(defvar ediff-toolbar-previous-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	(if (featurep 'xpm) "ediff-prev.xpm" "ediff-prev.xbm")
+	toolbar-icon-directory)))
+  "Previous difference icon in toolbar.")
+
+(defvar ediff-toolbar-A-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	;; UP
+	(if (featurep 'xpm) "ediff-A-up.xpm" "ediff-A-up.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DOWN
+	(if (featurep 'xpm) "ediff-A-up.xpm" "ediff-A-up.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DISABLED
+	(if (featurep 'xpm) "ediff-A-xx.xpm" "ediff-A-up.xbm")
+	toolbar-icon-directory)
+       ))
+  "Select diff A icon in toolbar.")
+
+(defvar ediff-toolbar-B-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	;; UP
+	(if (featurep 'xpm) "ediff-B-up.xpm" "ediff-B-up.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DOWN
+	(if (featurep 'xpm) "ediff-B-up.xpm" "ediff-B-up.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DISABLED
+	(if (featurep 'xpm) "ediff-B-xx.xpm" "ediff-B-up.xbm")
+	toolbar-icon-directory)
+       ))
+  "Select diff B icon in toolbar.")
+
+(defvar ediff-toolbar-toggle-split-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	;; UP
+	(if (featurep 'xpm)
+	    "ediff-toggle-split-up.xpm" "ediff-toggle-split-up.xbm")
+	toolbar-icon-directory)
+       ))
+  "Toggle split mode between side-to-side and one-on-top-of-another.")
+
+(defvar ediff-toolbar-save-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	;; UP
+	(if (featurep 'xpm) "ediff-save.xpm" "ediff-save.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DOWN
+	(if (featurep 'xpm) "ediff-save.xpm" "ediff-save.xbm")
+	toolbar-icon-directory)
+       (expand-file-name
+	;; DISABLED
+	(if (featurep 'xpm) "ediff-save-xx.xpm" "ediff-save-xx.xbm")
+	toolbar-icon-directory)
+       ))
+  "Save merge buffer.")
+
+(defvar ediff-toolbar-quit-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	(if (featurep 'xpm) "ediff-quit.xpm" "ediff-quit.xbm")
+	toolbar-icon-directory)))
+  "Exit Ediff session.")
+
+(defvar ediff-toolbar-help-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	(if (featurep 'xpm) "ediff-help.xpm" "ediff-help.xbm")
+	toolbar-icon-directory)))
+  "Show Ediff help.")
+
+(defvar ediff-toolbar-refresh-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	(if (featurep 'xpm) "ediff-update.xpm" "ediff-update.xbm")
+	toolbar-icon-directory)))
+  "Refresh Ediff display (aka recenter).")
+
+(defvar ediff-toolbar-refine-icon
+  (if (featurep 'toolbar)
+      (toolbar-make-button-list
+       (expand-file-name
+	;; UP
+	(if (featurep 'xpm) "ediff-refine.xpm" "ediff-refine.xbm")
+	toolbar-icon-directory)
+       ))
+  "Refine current difference region by computing fine diffs.")
+
+(defun ediff-toolbar-previous-difference ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-previous-difference 1)))
+
+(defun ediff-toolbar-next-difference ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-next-difference 1)))
+
+(defun ediff-toolbar-select/copy-A ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (cond ((or (ediff-merge-job)
+	       (ediff-merge-with-ancestor-job))
+	   (ediff-copy-A-to-C nil))
+	  (t 
+	   (ediff-copy-A-to-B nil)))))
+
+(defun ediff-toolbar-select/copy-B ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (cond ((or (ediff-merge-job)
+	       (ediff-merge-with-ancestor-job))
+	   (ediff-copy-B-to-C nil))
+	  (t 
+	   (ediff-copy-B-to-A nil)))))
+
+(defun ediff-toolbar-toggle-split ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-toggle-split)))
+
+
+(defun ediff-toolbar-save ()
+  (interactive)
+  (ediff-barf-if-not-control-buffer)
+  (if (ediff-merge-job)
+      (ediff-maybe-save-and-delete-merge 'save-and-continue)
+    ;; 2-way or 3-way compare: save modified buffers
+    (mapcar (function
+	     (lambda (type)
+	       (let ((ebuf (ediff-get-buffer type)))
+		 (and (ediff-buffer-live-p ebuf)
+		      (ediff-eval-in-buffer ebuf
+			(and (buffer-modified-p)
+			     (save-buffer)))))))
+	    '(A B C))))
+
+
+(defun ediff-toolbar-quit ()
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-quit nil)))
+
+(defun ediff-toolbar-help ()
+  (interactive)
+  (ediff-toggle-help))
+
+(defun ediff-toolbar-refresh ()
+  "Recenter"
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-recenter)))
+
+(defun ediff-toolbar-refine ()
+  "Refine current difference region by computing fine diffs."
+  (interactive)
+  (let ((ediff-grab-mouse nil))
+    (ediff-make-or-kill-fine-diffs 'make-them)))
+
+(defun ediff-toolbar-refine-needed-p ()
+  (and (> ediff-current-difference 0)
+       (> ediff-auto-refine-limit
+	  (- (ediff-get-diff-posn 'A 'end ediff-current-difference)
+	     (ediff-get-diff-posn 'A 'beg ediff-current-difference)))))
+
+(defvar ediff-toolbar
+  (if (featurep 'toolbar)
+      '([ediff-toolbar-refine-icon
+	 ediff-toolbar-refine
+	 t
+	 ;;; The toolbar is not automatically refreshed (in 19.14)
+	 ;;; when :activep changes state. 
+	 ;;(ediff-toolbar-refine-needed-p)
+	 "Refine current difference region by computing fine diffs."]
+	[ediff-toolbar-previous-icon
+	 ediff-toolbar-previous-difference
+	 t
+	 "Go to the previous difference."]
+	[ediff-toolbar-next-icon
+	 ediff-toolbar-next-difference
+	 t
+	 "Advance to the next difference."]
+	[ediff-toolbar-A-icon
+	 ediff-toolbar-select/copy-A
+	 (not (ediff-3way-comparison-job))
+	 "Select/Copy difference A."]
+	[ediff-toolbar-B-icon
+	 ediff-toolbar-select/copy-B
+	 (not (ediff-3way-comparison-job))
+	 "Select/Copy difference B."]
+	[ediff-toolbar-save-icon
+	 ediff-toolbar-save
+	 t
+	 "Save buffers modified in this session."]
+	[ediff-toolbar-refresh-icon
+	 ediff-toolbar-refresh
+	 t
+	 "Refresh Ediff display (aka recenter)."]
+ 	[ediff-toolbar-toggle-split-icon
+	  ediff-toolbar-toggle-split
+	  t
+	 "Toggle split mode between side-to-side and one-on-top-of-another."]
+	[ediff-toolbar-help-icon
+	 ediff-toolbar-help
+	 t
+	 "Toggle short/long help."]
+	nil
+ 	[ediff-toolbar-quit-icon
+ 	 ediff-toolbar-quit
+ 	 t
+ 	 "Quit this ediff session."]
+	)))
+
+(defvar ediff-toolbar-3way
+  (if (featurep 'toolbar)
+      '([ediff-toolbar-refine-icon
+	 ediff-toolbar-refine
+	 t
+	 ;;; The toolbar is not automatically refreshed (in 19.14)
+	 ;;; when :activep changes state. 
+	 ;;(ediff-toolbar-refine-needed-p)
+	 "Refine current difference region by computing fine diffs."]
+	[ediff-toolbar-previous-icon
+	 ediff-toolbar-previous-difference
+	 t
+	 "Go to the previous difference."]
+	[ediff-toolbar-next-icon
+	 ediff-toolbar-next-difference
+	 t
+	 "Advance to the next difference."]
+	[ediff-toolbar-save-icon
+	 ediff-toolbar-save
+	 t
+	 "Save buffers modified in this session."]
+	[ediff-toolbar-refresh-icon
+	 ediff-toolbar-refresh
+	 t
+	 "Refresh Ediff display (aka recenter)."]
+ 	[ediff-toolbar-toggle-split-icon
+	  ediff-toolbar-toggle-split
+	  t
+	 "Toggle split mode between side-to-side and one-on-top-of-another."]
+	[ediff-toolbar-help-icon
+	 ediff-toolbar-help
+	 t
+	 "Toggle short/long help."]
+	nil
+ 	[ediff-toolbar-quit-icon
+ 	 ediff-toolbar-quit
+ 	 t
+ 	 "Quit this ediff session."]
+	)))
+
+
+
+;;; Local Variables:
+;;; eval: (put 'ediff-defvar-local 'lisp-indent-hook 'defun)
+;;; eval: (put 'ediff-eval-in-buffer 'lisp-indent-hook 1)
+;;; eval: (put 'ediff-eval-in-buffer 'edebug-form-spec '(form body))
+;;; End:
+
+;;; ediff-tbar.el ends here