diff options
| -rw-r--r-- | lisp/wid-edit.el | 93 |
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. | |||
| 757 | Optional ARGS are extra keyword arguments for TYPE." | 757 | Optional 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 |