Mercurial > hg > xemacs-beta
comparison lisp/prim/menubar.el @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | 0293115a14e9 |
children | 2d532a89d707 |
comparison
equal
deleted
inserted
replaced
69:804d1389bcd6 | 70:131b0175ea99 |
---|---|
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 ;; General Public License for more details. | 16 ;; General Public License for more details. |
17 | 17 |
18 ;; You should have received a copy of the GNU General Public License | 18 ;; You should have received a copy of the GNU General Public License |
19 ;; along with XEmacs; see the file COPYING. If not, write to the | 19 ;; along with XEmacs; see the file COPYING. If not, write to the |
20 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | 20 ;; Free Software Foundation, 59 Temple Place - Suite 330, |
21 ;; Boston, MA 02111-1307, USA. | 21 ;; Boston, MA 02111-1307, USA. |
22 | 22 |
23 ;;; Synched up with: Not in FSF. (Completely divergent from FSF menu-bar.el) | 23 ;;; Synched up with: Not in FSF. (Completely divergent from FSF menu-bar.el) |
24 ;;; Some stuff in FSF menu-bar.el is in x-menubar.el | 24 ;;; Some stuff in FSF menu-bar.el is in x-menubar.el |
25 | 25 |
194 (signal 'error (list (gettext "not a submenu") result)) | 194 (signal 'error (list (gettext "not a submenu") result)) |
195 (signal 'error (list (gettext "no such submenu") (car item-path-list))))) | 195 (signal 'error (list (gettext "no such submenu") (car item-path-list))))) |
196 (cons result parent))))) | 196 (cons result parent))))) |
197 | 197 |
198 (defun add-menu-item-1 (leaf-p menu-path new-item before) | 198 (defun add-menu-item-1 (leaf-p menu-path new-item before) |
199 (if before (setq before (downcase before))) | 199 ;; This code looks like it could be cleaned up some more |
200 (let* ((item-name (if (vectorp new-item) (aref new-item 0) (car new-item))) | 200 ;; Do we really need 6 calls to find-menu-item? |
201 (when before (setq before (downcase before))) | |
202 (let* ((item-name | |
203 (cond ((vectorp new-item) (aref new-item 0)) | |
204 ((consp new-item) (car new-item)) | |
205 (t nil))) | |
201 (menubar current-menubar) | 206 (menubar current-menubar) |
202 (menu (condition-case () | 207 (menu (condition-case () |
203 (car (find-menu-item menubar menu-path)) | 208 (car (find-menu-item menubar menu-path)) |
204 (error nil))) | 209 (error nil))) |
205 (item-found (cond ((not (listp menu)) | 210 (item-found (cond |
206 (signal 'error (list (gettext "not a submenu") | 211 ((null item-name) |
207 menu-path))) | 212 nil) |
208 (menu | 213 ((not (listp menu)) |
209 (find-menu-item (cdr menu) (list item-name))) | 214 (signal 'error (list (gettext "not a submenu") |
210 (t | 215 menu-path))) |
211 (find-menu-item menubar (list item-name))) | 216 (menu |
212 ))) | 217 (find-menu-item (cdr menu) (list item-name))) |
213 (or menubar | 218 (t |
214 (error "`current-menubar' is nil: can't add menus to it.")) | 219 (find-menu-item menubar (list item-name))) |
215 (or menu | 220 ))) |
216 (let ((rest menu-path) | 221 (unless menubar |
217 (so-far menubar)) | 222 (error "`current-menubar' is nil: can't add menus to it.")) |
218 (while rest | 223 (unless menu |
219 ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest))))) | 224 (let ((rest menu-path) |
220 (setq menu | 225 (so-far menubar)) |
221 (if (eq so-far menubar) | 226 (while rest |
222 (car (find-menu-item so-far (list (car rest)))) | 227 ;;; (setq menu (car (find-menu-item (cdr so-far) (list (car rest))))) |
223 (car (find-menu-item (cdr so-far) (list (car rest)))))) | 228 (setq menu |
224 (or menu | 229 (if (eq so-far menubar) |
225 (let ((rest2 so-far)) | 230 (car (find-menu-item so-far (list (car rest)))) |
226 (while (and (cdr rest2) (car (cdr rest2))) | 231 (car (find-menu-item (cdr so-far) (list (car rest)))))) |
227 (setq rest2 (cdr rest2))) | 232 (unless menu |
228 (setcdr rest2 | 233 (let ((rest2 so-far)) |
229 (nconc (list (setq menu (list (car rest)))) | 234 (while (and (cdr rest2) (car (cdr rest2))) |
230 (cdr rest2))))) | 235 (setq rest2 (cdr rest2))) |
231 (setq so-far menu) | 236 (setcdr rest2 |
232 (setq rest (cdr rest))))) | 237 (nconc (list (setq menu (list (car rest)))) |
238 (cdr rest2))))) | |
239 (setq so-far menu) | |
240 (setq rest (cdr rest))))) | |
233 (if (and item-found (car item-found)) | 241 (if (and item-found (car item-found)) |
234 ;; hack the item in place. | 242 ;; hack the item in place. |
235 (if menu | 243 (if menu |
244 ;; Isn't it very bad form to use nsubstitute for side effects? | |
236 (nsubstitute new-item (car item-found) menu) | 245 (nsubstitute new-item (car item-found) menu) |
237 (setq current-menubar (nsubstitute new-item | 246 (setq current-menubar (nsubstitute new-item |
238 (car item-found) | 247 (car item-found) |
239 current-menubar))) | 248 current-menubar))) |
240 ;; OK, we have to add the whole thing... | 249 ;; OK, we have to add the whole thing... |
241 ;; if BEFORE is specified, try to add it there. | 250 ;; if BEFORE is specified, try to add it there. |
242 (or menu (setq menu current-menubar)) | 251 (unless menu (setq menu current-menubar)) |
243 (if before | 252 (when before |
244 (setq before (car (find-menu-item menu (list before))))) | 253 (setq before (car (find-menu-item menu (list before))))) |
245 (let ((rest menu) | 254 (let ((rest menu) |
246 (added-before nil)) | 255 (added-before nil)) |
247 (while rest | 256 (while rest |
248 (if (eq before (car (cdr rest))) | 257 (if (eq before (car (cdr rest))) |
249 (progn | 258 (progn |
250 (setcdr rest (cons new-item (cdr rest))) | 259 (setcdr rest (cons new-item (cdr rest))) |
251 (setq rest nil added-before t)) | 260 (setq rest nil added-before t)) |
252 (setq rest (cdr rest)))) | 261 (setq rest (cdr rest)))) |
253 (if (not added-before) | 262 (when (not added-before) |
254 ;; adding before the first item on the menubar itself is harder | 263 ;; adding before the first item on the menubar itself is harder |
255 (if (and (eq menu menubar) (eq before (car menu))) | 264 (if (and (eq menu menubar) (eq before (car menu))) |
256 (setq menu (cons new-item menu) | 265 (setq menu (cons new-item menu) |
257 current-menubar menu) | 266 current-menubar menu) |
258 ;; otherwise, add the item to the end. | 267 ;; otherwise, add the item to the end. |
259 (nconc menu (list new-item)))))) | 268 (nconc menu (list new-item)))))) |
260 (set-menubar-dirty-flag) | 269 (set-menubar-dirty-flag) |
261 new-item)) | 270 new-item)) |
262 | 271 |
263 (defun add-menu-button (menu-path menu-leaf &optional before) | 272 (defun add-menu-button (menu-path menu-leaf &optional before) |
264 "Add a menu item to some menu, creating the menu first if necessary. | 273 "Add a menu item to some menu, creating the menu first if necessary. |