diff options
| author | Dave Love | 2000-09-19 17:36:49 +0000 |
|---|---|---|
| committer | Dave Love | 2000-09-19 17:36:49 +0000 |
| commit | ec7f4585a222755a8d4383bae24feadd18868ce3 (patch) | |
| tree | 598505dacfb7d068b159d219018714d262e1da55 | |
| parent | fb275c02f5ffa0bb928d0d42b5e16a3000295b9b (diff) | |
| download | emacs-ec7f4585a222755a8d4383bae24feadd18868ce3.tar.gz emacs-ec7f4585a222755a8d4383bae24feadd18868ce3.zip | |
Renamed from toolbar.el. Change `toolbar'
to `tool-bar' generally in symbols. Make some items invisible in
`special' major modes.
(tool-bar-add-item-from-menu): Renamed from
toolbar-like-menu-item. Add arg PROPS.
| -rw-r--r-- | lisp/toolbar/tool-bar.el | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/lisp/toolbar/tool-bar.el b/lisp/toolbar/tool-bar.el new file mode 100644 index 00000000000..0aeb944874c --- /dev/null +++ b/lisp/toolbar/tool-bar.el | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | ;;; tool-bar.el --- Setting up the tool bar | ||
| 2 | ;; | ||
| 3 | ;; Copyright (C) 2000 Free Software Foundation, Inc. | ||
| 4 | ;; | ||
| 5 | ;; Author: Dave Love <fx@gnu.org> | ||
| 6 | ;; Keywords: mouse frames | ||
| 7 | |||
| 8 | ;; This file is part of GNU Emacs. | ||
| 9 | |||
| 10 | ;; GNU Emacs is free software; you can redistribute it and/or modify | ||
| 11 | ;; it under the terms of the GNU General Public License as published by | ||
| 12 | ;; the Free Software Foundation; either version 2, or (at your option) | ||
| 13 | ;; any later version. | ||
| 14 | |||
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, | ||
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 18 | ;; GNU General Public License for more details. | ||
| 19 | |||
| 20 | ;; You should have received a copy of the GNU General Public License | ||
| 21 | ;; along with GNU Emacs; see the file COPYING. If not, write to the | ||
| 22 | ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | ||
| 23 | ;; Boston, MA 02111-1307, USA. | ||
| 24 | |||
| 25 | ;;; Commentary: | ||
| 26 | |||
| 27 | ;; Provides `tool-bar-mode' to control display of the tool -bar and | ||
| 28 | ;; bindings for the global tool bar with convenience functions | ||
| 29 | ;; `tool-bar-add-item' and `tool-bar-add-item-from-menu'. | ||
| 30 | |||
| 31 | ;;; Code: | ||
| 32 | |||
| 33 | ;;;###autoload | ||
| 34 | (define-minor-mode tool-bar-mode | ||
| 35 | "Toggle use of the tool bar. | ||
| 36 | With ARG, display the tool bar if and only if ARG is positive. | ||
| 37 | |||
| 38 | See `tool-bar-add-item' and `tool-bar-add-item-from-menu' for | ||
| 39 | conveniently adding tool bar items." | ||
| 40 | nil nil nil | ||
| 41 | :global t | ||
| 42 | :group 'mouse | ||
| 43 | :group 'frames | ||
| 44 | (let ((lines (if tool-bar-mode 1 0))) | ||
| 45 | ;; Alter existing frames... | ||
| 46 | (mapc (lambda (frame) | ||
| 47 | (modify-frame-parameters frame | ||
| 48 | (list (cons 'tool-bar-lines lines)))) | ||
| 49 | (frame-list)) | ||
| 50 | ;; ...and future ones. | ||
| 51 | (let ((elt (assq 'tool-bar-lines default-frame-alist))) | ||
| 52 | (if elt | ||
| 53 | (setcdr elt lines) | ||
| 54 | (add-to-list 'default-frame-alist (cons 'tool-bar-lines lines)))))) | ||
| 55 | |||
| 56 | (defvar tool-bar-global-map (let ((map (make-sparse-keymap))) | ||
| 57 | (global-set-key [tool-bar] map)) | ||
| 58 | "Keymap for the tool bar in the global map.") | ||
| 59 | |||
| 60 | ;;;###autoload | ||
| 61 | (defun tool-bar-add-item (icon def key &optional map &rest props) | ||
| 62 | "Add an item to the tool bar. | ||
| 63 | ICON names the image, DEF is the key definition and KEY is a symbol | ||
| 64 | for the fake function key in the menu keymap. MAP is the tool bar | ||
| 65 | keymap in which to define the item; it defaults to | ||
| 66 | `tool-bar-global-map'. Remaining arguments PROPS are additional items | ||
| 67 | to add to the menu item specification. See Info node `(elisp)Tool | ||
| 68 | Bar'. Items are added from left to right. | ||
| 69 | |||
| 70 | ICON is the base name of a file cnntaining the image to use. The | ||
| 71 | function will try to use first ICON.xpm, then ICON.xbm using | ||
| 72 | `find-image'. If PROPS contains `:enable', a `disabled' version of | ||
| 73 | the icon is generated automatically using the Laplace algorithm (see | ||
| 74 | Info node `(elisp)Image Descriptors')." | ||
| 75 | (let ((image (find-image `((:type xbm :file ,(concat icon ".xbm")) | ||
| 76 | (:type xpm :file ,(concat icon ".xpm")))))) | ||
| 77 | (when image | ||
| 78 | (unless (image-mask-p image) | ||
| 79 | (setq image (append image '(:mask heuristic)))) | ||
| 80 | (define-key-after (or map tool-bar-global-map) (vector key) | ||
| 81 | `(menu-item ,(symbol-name key) ,def :image ,image ,@props))))) | ||
| 82 | |||
| 83 | (defun tool-bar-add-item-from-menu (command icon &optional map &rest props) | ||
| 84 | "Define tool bar binding for COMMAND using the given ICON in keymap MAP. | ||
| 85 | The binding of COMMAND is looked up in the menu bar in MAP (default | ||
| 86 | `global-map') and modified to add an image specification for ICON, which | ||
| 87 | is looked for as by `tool-bar-add-item'. | ||
| 88 | MAP must contain appropriate keymaps bound to `[menu-bar]' and | ||
| 89 | `[tool-bar]'. | ||
| 90 | PROPS is a list of additional properties to add to the binding." | ||
| 91 | (unless map | ||
| 92 | (setq map global-map)) | ||
| 93 | (let* ((menu-bar-map (lookup-key map [menu-bar])) | ||
| 94 | (keys (where-is-internal command menu-bar-map)) | ||
| 95 | (tb-map (key-binding [tool-bar] map)) | ||
| 96 | (image (find-image `((:type xpm :file ,(concat icon ".xpm")) | ||
| 97 | (:type xbm :file ,(concat icon ".xbm"))))) | ||
| 98 | submap key) | ||
| 99 | (when image | ||
| 100 | ;; We'll pick up the last valid entry in the list of keys if | ||
| 101 | ;; there's more than one. | ||
| 102 | (dolist (k keys) | ||
| 103 | ;; We're looking for a binding of the command in a submap of | ||
| 104 | ;; the menu bar map, so the key sequence must be two or more | ||
| 105 | ;; long. | ||
| 106 | (if (and (vectorp k) | ||
| 107 | (> (length k) 1)) | ||
| 108 | (let ((m (lookup-key menu-bar-map (substring k 0 -1))) | ||
| 109 | ;; Last element in the bound key sequence: | ||
| 110 | (kk (aref k (1- (length k))))) | ||
| 111 | (if (and (keymapp m) | ||
| 112 | (symbolp kk)) | ||
| 113 | (setq submap m | ||
| 114 | key kk))))) | ||
| 115 | (when (and (symbolp submap) (boundp submap)) | ||
| 116 | (setq submap (eval submap))) | ||
| 117 | (define-key-after tb-map (vector key) | ||
| 118 | (append (cdr (assq key (cdr submap))) (list :image image) props))))) | ||
| 119 | |||
| 120 | ;;; Set up some global items. Additions/deletions up for grabs. | ||
| 121 | |||
| 122 | (tool-bar-add-item-from-menu 'save-buffers-kill-emacs "exit") | ||
| 123 | (tool-bar-add-item-from-menu 'find-file "new") | ||
| 124 | (tool-bar-add-item-from-menu 'dired "open") | ||
| 125 | (tool-bar-add-item-from-menu 'kill-this-buffer "close") | ||
| 126 | (tool-bar-add-item-from-menu 'save-buffer "save" nil | ||
| 127 | :visible '(not (eq 'special (get major-mode | ||
| 128 | 'mode-class)))) | ||
| 129 | (tool-bar-add-item-from-menu 'write-file "saveas" nil | ||
| 130 | :visible '(not (eq 'special (get major-mode | ||
| 131 | 'mode-class)))) | ||
| 132 | (tool-bar-add-item-from-menu 'undo "undo" nil | ||
| 133 | :visible '(not (eq 'special (get major-mode | ||
| 134 | 'mode-class)))) | ||
| 135 | (tool-bar-add-item-from-menu 'kill-region "cut" nil | ||
| 136 | :visible '(not (eq 'special (get major-mode | ||
| 137 | 'mode-class)))) | ||
| 138 | (tool-bar-add-item-from-menu 'menu-bar-kill-ring-save "copy") | ||
| 139 | (tool-bar-add-item-from-menu 'yank "paste" nil | ||
| 140 | :visible '(not (eq 'special (get major-mode | ||
| 141 | 'mode-class)))) | ||
| 142 | (tool-bar-add-item-from-menu 'nonincremental-search-forward "search") | ||
| 143 | ;;(tool-bar-add-item-from-menu 'ispell-buffer "spell") | ||
| 144 | |||
| 145 | ;; There's no icon appropriate for News and we need a command rather | ||
| 146 | ;; than a lambda for Read Mail. | ||
| 147 | ;;(tool-bar-add-item-from-menu 'compose-mail "mail_compose") | ||
| 148 | |||
| 149 | (tool-bar-add-item-from-menu 'print-buffer "print") | ||
| 150 | (tool-bar-add-item "preferences" 'customize 'customize nil | ||
| 151 | :help "Edit preferences (customize)") | ||
| 152 | (tool-bar-add-item "help" | ||
| 153 | (lambda () | ||
| 154 | (interactive) | ||
| 155 | (let ((p (mouse-position))) | ||
| 156 | (x-popup-menu (list (list (cadr p) (cddr p)) (car p)) | ||
| 157 | menu-bar-help-menu))) | ||
| 158 | 'help nil :help "Pop up the Help menu") | ||
| 159 | |||
| 160 | (provide 'tool-bar) | ||
| 161 | |||
| 162 | ;;; tool-bar.el ends here | ||