aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/wid-edit.el93
1 files changed, 60 insertions, 33 deletions
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index c4661ed2331..e28114eeadd 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -757,13 +757,17 @@ button end points.
757Optional ARGS are extra keyword arguments for TYPE." 757Optional ARGS are extra keyword arguments for TYPE."
758 (let ((widget (apply 'widget-convert type :delete 'widget-leave-text args)) 758 (let ((widget (apply 'widget-convert type :delete 'widget-leave-text args))
759 (from (copy-marker from)) 759 (from (copy-marker from))
760 (to (copy-marker to))) 760 (to (copy-marker to))
761 (personality (get-text-property from 'personality)))
761 (set-marker-insertion-type from t) 762 (set-marker-insertion-type from t)
762 (set-marker-insertion-type to nil) 763 (set-marker-insertion-type to nil)
763 (widget-put widget :from from) 764 (widget-put widget :from from)
764 (widget-put widget :to to) 765 (widget-put widget :to to)
765 (when button-from 766 (when button-from
766 (widget-specify-button widget button-from button-to)) 767 (widget-specify-button widget button-from button-to))
768 ;; W3 provides advice for this for Emacspeak's benefit.
769 (if personality
770 (put-text-property from to 'personality personality))
767 widget)) 771 widget))
768 772
769(defun widget-convert-button (type from to &rest args) 773(defun widget-convert-button (type from to &rest args)
@@ -2373,12 +2377,51 @@ Return an alist of (TYPE MATCH)."
2373 ;; Pass notification to parent. 2377 ;; Pass notification to parent.
2374 (widget-apply widget :notify child event)) 2378 (widget-apply widget :notify child event))
2375 2379
2380;;; The `insert/delete-button' Widget.
2381
2382(define-widget 'insert/delete-button 'push-button
2383 "An insert/delete item button for the `editable-list' widget."
2384 :create (lambda (widget)
2385 (let* ((map (make-sparse-keymap))
2386 (parent (widget-get widget :keymap)))
2387 (if parent
2388 (set-keymap-parent map parent))
2389 (define-key map [?\C-k] #'widget-list-item-delete)
2390 (define-key map [?\C-o] #'widget-list-item-insert)
2391 (widget-put widget :keymap map))
2392 (widget-default-create widget))
2393 :tag "+/-"
2394 :help-echo "Insert or delete a new item into the list here"
2395 :action 'widget-insert/delete-button-action)
2396
2397(defun widget-insert/delete-button-action (widget &optional event)
2398 "Ask the parent to insert or delete a new item."
2399 (if (y-or-n-p "Delete this item? (otherwise insert a new one)")
2400 (widget-apply (widget-get widget :parent)
2401 :delete-at (widget-get widget :widget))
2402 (widget-apply (widget-get widget :parent)
2403 :insert-before (widget-get widget :widget))))
2404
2405(defun widget-list-item-insert ()
2406 "Delete the list item widget which is the parent of the widget at point."
2407 (interactive)
2408 (let ((widget (widget-at (point))))
2409 (widget-apply (widget-get widget :parent)
2410 :insert-before (widget-get widget :widget))))
2411
2412(defun widget-list-item-delete ()
2413 "Add a new list item widget after the parent of the widget at point."
2414 (interactive)
2415 (let ((widget (widget-at (point))))
2416 (widget-apply (widget-get widget :parent)
2417 :delete-at (widget-get widget :widget))))
2418
2376;;; The `insert-button' Widget. 2419;;; The `insert-button' Widget.
2377 2420
2378(define-widget 'insert-button 'push-button 2421(define-widget 'insert-button 'push-button
2379 "An insert button for the `editable-list' widget." 2422 "An append item button for the `editable-list' widget."
2380 :tag "INS" 2423 :tag "+"
2381 :help-echo "Insert a new item into the list at this position." 2424 :help-echo "Append a new item to the list"
2382 :action 'widget-insert-button-action) 2425 :action 'widget-insert-button-action)
2383 2426
2384(defun widget-insert-button-action (widget &optional event) 2427(defun widget-insert-button-action (widget &optional event)
@@ -2386,19 +2429,6 @@ Return an alist of (TYPE MATCH)."
2386 (widget-apply (widget-get widget :parent) 2429 (widget-apply (widget-get widget :parent)
2387 :insert-before (widget-get widget :widget))) 2430 :insert-before (widget-get widget :widget)))
2388 2431
2389;;; The `delete-button' Widget.
2390
2391(define-widget 'delete-button 'push-button
2392 "A delete button for the `editable-list' widget."
2393 :tag "DEL"
2394 :help-echo "Delete this item from the list."
2395 :action 'widget-delete-button-action)
2396
2397(defun widget-delete-button-action (widget &optional event)
2398 ;; Ask the parent to insert a new item.
2399 (widget-apply (widget-get widget :parent)
2400 :delete-at (widget-get widget :widget)))
2401
2402;;; The `editable-list' Widget. 2432;;; The `editable-list' Widget.
2403 2433
2404;; (defcustom widget-editable-list-gui nil 2434;; (defcustom widget-editable-list-gui nil
@@ -2412,7 +2442,7 @@ Return an alist of (TYPE MATCH)."
2412 :offset 12 2442 :offset 12
2413 :format "%v%i\n" 2443 :format "%v%i\n"
2414 :format-handler 'widget-editable-list-format-handler 2444 :format-handler 'widget-editable-list-format-handler
2415 :entry-format "%i %d %v" 2445 :entry-format "%- %v"
2416 :menu-tag "editable-list" 2446 :menu-tag "editable-list"
2417 :value-create 'widget-editable-list-value-create 2447 :value-create 'widget-editable-list-value-create
2418 :value-delete 'widget-children-value-delete 2448 :value-delete 'widget-children-value-delete
@@ -2536,7 +2566,7 @@ Return an alist of (TYPE MATCH)."
2536 ;; Create a new entry to the list. 2566 ;; Create a new entry to the list.
2537 (let ((type (nth 0 (widget-get widget :args))) 2567 (let ((type (nth 0 (widget-get widget :args)))
2538;;; (widget-push-button-gui widget-editable-list-gui) 2568;;; (widget-push-button-gui widget-editable-list-gui)
2539 child delete insert) 2569 child ins/del buttons)
2540 (widget-specify-insert 2570 (widget-specify-insert
2541 (save-excursion 2571 (save-excursion
2542 (and (widget-get widget :indent) 2572 (and (widget-get widget :indent)
@@ -2548,14 +2578,11 @@ Return an alist of (TYPE MATCH)."
2548 (delete-backward-char 2) 2578 (delete-backward-char 2)
2549 (cond ((eq escape ?%) 2579 (cond ((eq escape ?%)
2550 (insert ?%)) 2580 (insert ?%))
2551 ((eq escape ?i) 2581 ((eq escape ?-)
2552 (setq insert (apply 'widget-create-child-and-convert 2582 (setq ins/del (apply 'widget-create-child-and-convert
2553 widget 'insert-button 2583 widget 'insert/delete-button
2554 (widget-get widget :insert-button-args)))) 2584 (widget-get widget
2555 ((eq escape ?d) 2585 :insert/delete-button-args))))
2556 (setq delete (apply 'widget-create-child-and-convert
2557 widget 'delete-button
2558 (widget-get widget :delete-button-args))))
2559 ((eq escape ?v) 2586 ((eq escape ?v)
2560 (if conv 2587 (if conv
2561 (setq child (widget-create-child-value 2588 (setq child (widget-create-child-value
@@ -2566,18 +2593,17 @@ Return an alist of (TYPE MATCH)."
2566 (widget-default-get type)))))) 2593 (widget-default-get type))))))
2567 (t 2594 (t
2568 (error "Unknown escape `%c'" escape))))) 2595 (error "Unknown escape `%c'" escape)))))
2569 (widget-put widget 2596 (setq buttons (widget-get widget :buttons))
2570 :buttons (cons delete 2597 (if ins/del
2571 (cons insert 2598 (push ins/del buttons))
2572 (widget-get widget :buttons)))) 2599 (widget-put widget :buttons buttons)
2573 (let ((entry-from (point-min-marker)) 2600 (let ((entry-from (point-min-marker))
2574 (entry-to (point-max-marker))) 2601 (entry-to (point-max-marker)))
2575 (set-marker-insertion-type entry-from t) 2602 (set-marker-insertion-type entry-from t)
2576 (set-marker-insertion-type entry-to nil) 2603 (set-marker-insertion-type entry-to nil)
2577 (widget-put child :entry-from entry-from) 2604 (widget-put child :entry-from entry-from)
2578 (widget-put child :entry-to entry-to))) 2605 (widget-put child :entry-to entry-to)))
2579 (widget-put insert :widget child) 2606 (if ins/del (widget-put ins/del :widget child))
2580 (widget-put delete :widget child)
2581 child)) 2607 child))
2582 2608
2583;;; The `group' Widget. 2609;;; The `group' Widget.
@@ -2988,6 +3014,7 @@ It will read a directory name from the minibuffer when invoked."
2988 "History of input to `widget-variable-prompt-value'.") 3014 "History of input to `widget-variable-prompt-value'.")
2989 3015
2990(define-widget 'variable 'symbol 3016(define-widget 'variable 'symbol
3017 ;; Should complete on variables.
2991 "A Lisp variable." 3018 "A Lisp variable."
2992 :prompt-match 'boundp 3019 :prompt-match 'boundp
2993 :prompt-history 'widget-variable-prompt-value-history 3020 :prompt-history 'widget-variable-prompt-value-history