changeset 36018:b42e0ad4cd7b

(widget-convert-text): Respect personality for Emacspeak. (insert/delete-button): New widget type. (widget-insert/delete-button-action, widget-list-item-insert) (widget-list-item-delete): New functions. (insert-button): Change :tag, :help-echo. (delete-button, widget-delete-button-action): Deleted. (editable-list): Change :entry-format. (widget-editable-list-entry-create): Use ins/del. Process %-, not %i, %d.
author Dave Love <fx@gnu.org>
date Sat, 10 Feb 2001 00:56:28 +0000
parents 4c3b10de9033
children b45dd6332475
files lisp/wid-edit.el
diffstat 1 files changed, 60 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/wid-edit.el	Sat Feb 10 00:10:37 2001 +0000
+++ b/lisp/wid-edit.el	Sat Feb 10 00:56:28 2001 +0000
@@ -757,13 +757,17 @@
 Optional ARGS are extra keyword arguments for TYPE."
   (let ((widget (apply 'widget-convert type :delete 'widget-leave-text args))
 	(from (copy-marker from))
-	(to (copy-marker to)))
+	(to (copy-marker to))
+	(personality (get-text-property from 'personality)))
     (set-marker-insertion-type from t)
     (set-marker-insertion-type to nil)
     (widget-put widget :from from)
     (widget-put widget :to to)
     (when button-from
       (widget-specify-button widget button-from button-to))
+    ;; W3 provides advice for this for Emacspeak's benefit.
+    (if personality
+	(put-text-property from to 'personality personality))
     widget))
 
 (defun widget-convert-button (type from to &rest args)
@@ -2373,12 +2377,51 @@
   ;; Pass notification to parent.
   (widget-apply widget :notify child event))
 
+;;; The `insert/delete-button' Widget.
+
+(define-widget 'insert/delete-button 'push-button
+  "An insert/delete item button for the `editable-list' widget."
+  :create (lambda (widget)
+	    (let* ((map (make-sparse-keymap))
+		   (parent (widget-get widget :keymap)))
+	      (if parent
+		  (set-keymap-parent map parent))
+	      (define-key map [?\C-k] #'widget-list-item-delete)
+	      (define-key map [?\C-o] #'widget-list-item-insert)
+	      (widget-put widget :keymap map))
+	    (widget-default-create widget))
+  :tag "+/-"
+  :help-echo "Insert or delete a new item into the list here"
+  :action 'widget-insert/delete-button-action)
+
+(defun widget-insert/delete-button-action (widget &optional event)
+  "Ask the parent to insert or delete a new item."
+  (if (y-or-n-p "Delete this item? (otherwise insert a new one)")
+      (widget-apply (widget-get widget :parent)
+		    :delete-at (widget-get widget :widget))
+    (widget-apply (widget-get widget :parent)
+		  :insert-before (widget-get widget :widget))))
+
+(defun widget-list-item-insert ()
+  "Delete the list item widget which is the parent of the widget at point."
+  (interactive)
+  (let ((widget (widget-at (point))))
+    (widget-apply (widget-get widget :parent)
+		  :insert-before (widget-get widget :widget))))
+
+(defun widget-list-item-delete ()
+  "Add a new list item widget after the parent of the widget at point."
+  (interactive)
+  (let ((widget (widget-at (point))))
+    (widget-apply (widget-get widget :parent)
+		  :delete-at (widget-get widget :widget))))
+
 ;;; The `insert-button' Widget.
 
 (define-widget 'insert-button 'push-button
-  "An insert button for the `editable-list' widget."
-  :tag "INS"
-  :help-echo "Insert a new item into the list at this position."
+  "An append item button for the `editable-list' widget."
+  :tag "+"
+  :help-echo "Append a new item to the list"
   :action 'widget-insert-button-action)
 
 (defun widget-insert-button-action (widget &optional event)
@@ -2386,19 +2429,6 @@
   (widget-apply (widget-get widget :parent)
 		:insert-before (widget-get widget :widget)))
 
-;;; The `delete-button' Widget.
-
-(define-widget 'delete-button 'push-button
-  "A delete button for the `editable-list' widget."
-  :tag "DEL"
-  :help-echo "Delete this item from the list."
-  :action 'widget-delete-button-action)
-
-(defun widget-delete-button-action (widget &optional event)
-  ;; Ask the parent to insert a new item.
-  (widget-apply (widget-get widget :parent)
-		:delete-at (widget-get widget :widget)))
-
 ;;; The `editable-list' Widget.
 
 ;; (defcustom widget-editable-list-gui nil
@@ -2412,7 +2442,7 @@
   :offset 12
   :format "%v%i\n"
   :format-handler 'widget-editable-list-format-handler
-  :entry-format "%i %d %v"
+  :entry-format "%- %v"
   :menu-tag "editable-list"
   :value-create 'widget-editable-list-value-create
   :value-delete 'widget-children-value-delete
@@ -2536,7 +2566,7 @@
   ;; Create a new entry to the list.
   (let ((type (nth 0 (widget-get widget :args)))
 ;;; 	(widget-push-button-gui widget-editable-list-gui)
-	child delete insert)
+	child ins/del buttons)
     (widget-specify-insert
      (save-excursion
        (and (widget-get widget :indent)
@@ -2548,14 +2578,11 @@
 	 (delete-backward-char 2)
 	 (cond ((eq escape ?%)
 		(insert ?%))
-	       ((eq escape ?i)
-		(setq insert (apply 'widget-create-child-and-convert
-				    widget 'insert-button
-				    (widget-get widget :insert-button-args))))
-	       ((eq escape ?d)
-		(setq delete (apply 'widget-create-child-and-convert
-				    widget 'delete-button
-				    (widget-get widget :delete-button-args))))
+	       ((eq escape ?-)
+		(setq ins/del (apply 'widget-create-child-and-convert
+				     widget 'insert/delete-button
+				     (widget-get widget
+						 :insert/delete-button-args))))
 	       ((eq escape ?v)
 		(if conv
 		    (setq child (widget-create-child-value
@@ -2566,18 +2593,17 @@
 					     (widget-default-get type))))))
 	       (t
 		(error "Unknown escape `%c'" escape)))))
-     (widget-put widget
-		 :buttons (cons delete
-				(cons insert
-				      (widget-get widget :buttons))))
+     (setq buttons (widget-get widget :buttons))
+     (if ins/del
+	 (push ins/del buttons))
+     (widget-put widget :buttons buttons)
      (let ((entry-from (point-min-marker))
 	   (entry-to (point-max-marker)))
        (set-marker-insertion-type entry-from t)
        (set-marker-insertion-type entry-to nil)
        (widget-put child :entry-from entry-from)
        (widget-put child :entry-to entry-to)))
-    (widget-put insert :widget child)
-    (widget-put delete :widget child)
+    (if ins/del (widget-put ins/del :widget child))
     child))
 
 ;;; The `group' Widget.
@@ -2988,6 +3014,7 @@
   "History of input to `widget-variable-prompt-value'.")
 
 (define-widget 'variable 'symbol
+  ;; Should complete on variables.
   "A Lisp variable."
   :prompt-match 'boundp
   :prompt-history 'widget-variable-prompt-value-history