Mercurial > hg > xemacs-beta
comparison lisp/w3/widget-edit.el @ 88:821dec489c24 r20-0
Import from CVS: tag r20-0
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:09:59 +0200 |
parents | 364816949b59 |
children |
comparison
equal
deleted
inserted
replaced
87:7df2982f5c17 | 88:821dec489c24 |
---|---|
2 ;; | 2 ;; |
3 ;; Copyright (C) 1996 Free Software Foundation, Inc. | 3 ;; Copyright (C) 1996 Free Software Foundation, Inc. |
4 ;; | 4 ;; |
5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> | 5 ;; Author: Per Abrahamsen <abraham@dina.kvl.dk> |
6 ;; Keywords: extensions | 6 ;; Keywords: extensions |
7 ;; Version: 1.20 | 7 ;; Version: 1.22 |
8 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ | 8 ;; X-URL: http://www.dina.kvl.dk/~abraham/custom/ |
9 | 9 |
10 ;;; Commentary: | 10 ;;; Commentary: |
11 ;; | 11 ;; |
12 ;; See `widget.el'. | 12 ;; See `widget.el'. |
247 ;; newline. | 247 ;; newline. |
248 (put-text-property to (1+ to) 'read-only nil)))) | 248 (put-text-property to (1+ to) 'read-only nil)))) |
249 | 249 |
250 (defun widget-specify-field-update (widget from to) | 250 (defun widget-specify-field-update (widget from to) |
251 ;; Specify editable button for WIDGET between FROM and TO. | 251 ;; Specify editable button for WIDGET between FROM and TO. |
252 (let ((map (or (widget-get widget :keymap) | 252 (let ((map (widget-get widget :keymap)) |
253 widget-keymap)) | 253 (secret (widget-get widget :secret)) |
254 (secret-to to) | |
255 (size (widget-get widget :size)) | |
254 (face (or (widget-get widget :value-face) | 256 (face (or (widget-get widget :value-face) |
255 'widget-field-face))) | 257 'widget-field-face))) |
258 | |
259 (when secret | |
260 (while (and size | |
261 (not (zerop size)) | |
262 (> secret-to from) | |
263 (eq (char-after (1- secret-to)) ?\ )) | |
264 (setq secret-to (1- secret-to))) | |
265 | |
266 (save-excursion | |
267 (goto-char from) | |
268 (while (< (point) secret-to) | |
269 (let ((old (get-text-property (point) 'secret))) | |
270 (when old | |
271 (subst-char-in-region (point) (1+ (point)) secret old))) | |
272 (forward-char)))) | |
273 | |
256 (set-text-properties from to (list 'field widget | 274 (set-text-properties from to (list 'field widget |
257 'read-only nil | 275 'read-only nil |
258 'keymap map | 276 'keymap map |
259 'local-map map | 277 'local-map map |
260 'face face)) | 278 'face face)) |
279 | |
280 (when secret | |
281 (save-excursion | |
282 (goto-char from) | |
283 (while (< (point) secret-to) | |
284 (let ((old (following-char))) | |
285 (subst-char-in-region (point) (1+ (point)) old secret) | |
286 (put-text-property (point) (1+ (point)) 'secret old)) | |
287 (forward-char)))) | |
288 | |
261 (unless (widget-get widget :size) | 289 (unless (widget-get widget :size) |
262 (add-text-properties to (1+ to) (list 'field widget | 290 (add-text-properties to (1+ to) (list 'field widget |
263 'face face | 291 'face face |
264 'local-map map | 292 'local-map map |
265 'keymap map))))) | 293 'keymap map))))) |
459 | 487 |
460 (defvar widget-keymap nil | 488 (defvar widget-keymap nil |
461 "Keymap containing useful binding for buffers containing widgets. | 489 "Keymap containing useful binding for buffers containing widgets. |
462 Recommended as a parent keymap for modes using widgets.") | 490 Recommended as a parent keymap for modes using widgets.") |
463 | 491 |
464 (if widget-keymap | 492 (unless widget-keymap |
465 () | |
466 (setq widget-keymap (make-sparse-keymap)) | 493 (setq widget-keymap (make-sparse-keymap)) |
467 (set-keymap-parent widget-keymap global-map) | |
468 (define-key widget-keymap "\t" 'widget-forward) | 494 (define-key widget-keymap "\t" 'widget-forward) |
469 (define-key widget-keymap "\M-\t" 'widget-backward) | 495 (define-key widget-keymap "\M-\t" 'widget-backward) |
470 (define-key widget-keymap [(shift tab)] 'widget-backward) | 496 (define-key widget-keymap [(shift tab)] 'widget-backward) |
471 (define-key widget-keymap [(shift tab)] 'widget-backward) | 497 (define-key widget-keymap [(shift tab)] 'widget-backward) |
472 (define-key widget-keymap [backtab] 'widget-backward) | 498 (define-key widget-keymap [backtab] 'widget-backward) |
477 (define-key widget-keymap "\C-m" 'widget-button-press)) | 503 (define-key widget-keymap "\C-m" 'widget-button-press)) |
478 | 504 |
479 (defvar widget-global-map global-map | 505 (defvar widget-global-map global-map |
480 "Keymap used for events the widget does not handle themselves.") | 506 "Keymap used for events the widget does not handle themselves.") |
481 (make-variable-buffer-local 'widget-global-map) | 507 (make-variable-buffer-local 'widget-global-map) |
508 | |
509 (defvar widget-field-keymap nil | |
510 "Keymap used inside an editable field.") | |
511 | |
512 (unless widget-field-keymap | |
513 (setq widget-field-keymap (copy-keymap widget-keymap)) | |
514 (define-key widget-field-keymap "\C-m" 'widget-field-activate) | |
515 (set-keymap-parent widget-field-keymap global-map)) | |
516 | |
517 (defvar widget-text-keymap nil | |
518 "Keymap used inside a text field.") | |
519 | |
520 (unless widget-text-keymap | |
521 (setq widget-text-keymap (copy-keymap widget-keymap)) | |
522 (set-keymap-parent widget-text-keymap global-map)) | |
523 | |
524 (defun widget-field-activate (pos &optional event) | |
525 "Activate the ediable field at point." | |
526 (interactive "@d") | |
527 (let* ((field (get-text-property pos 'field))) | |
528 (if field | |
529 (widget-apply field :action event) | |
530 (call-interactively | |
531 (lookup-key widget-global-map (this-command-keys)))))) | |
482 | 532 |
483 (defun widget-button-click (event) | 533 (defun widget-button-click (event) |
484 "Activate button below mouse pointer." | 534 "Activate button below mouse pointer." |
485 (interactive "@e") | 535 (interactive "@e") |
486 (widget-button-press (event-point event) event)) | 536 (widget-button-press (event-point event) event)) |
950 ;;; The `editable-field' Widget. | 1000 ;;; The `editable-field' Widget. |
951 | 1001 |
952 (define-widget 'editable-field 'default | 1002 (define-widget 'editable-field 'default |
953 "An editable text field." | 1003 "An editable text field." |
954 :convert-widget 'widget-item-convert-widget | 1004 :convert-widget 'widget-item-convert-widget |
1005 :keymap widget-field-keymap | |
955 :format "%v" | 1006 :format "%v" |
956 :value "" | 1007 :value "" |
957 :action 'widget-field-action | 1008 :action 'widget-field-action |
958 :value-create 'widget-field-value-create | 1009 :value-create 'widget-field-value-create |
959 :value-delete 'widget-field-value-delete | 1010 :value-delete 'widget-field-value-delete |
1010 (defun widget-field-value-get (widget) | 1061 (defun widget-field-value-get (widget) |
1011 ;; Return current text in editing field. | 1062 ;; Return current text in editing field. |
1012 (let ((from (widget-get widget :value-from)) | 1063 (let ((from (widget-get widget :value-from)) |
1013 (to (widget-get widget :value-to)) | 1064 (to (widget-get widget :value-to)) |
1014 (size (widget-get widget :size)) | 1065 (size (widget-get widget :size)) |
1066 (secret (widget-get widget :secret)) | |
1015 (old (current-buffer))) | 1067 (old (current-buffer))) |
1016 (if (and from to) | 1068 (if (and from to) |
1017 (progn | 1069 (progn |
1018 (set-buffer (marker-buffer from)) | 1070 (set-buffer (marker-buffer from)) |
1019 (setq from (1+ from) | 1071 (setq from (1+ from) |
1021 (while (and size | 1073 (while (and size |
1022 (not (zerop size)) | 1074 (not (zerop size)) |
1023 (> to from) | 1075 (> to from) |
1024 (eq (char-after (1- to)) ?\ )) | 1076 (eq (char-after (1- to)) ?\ )) |
1025 (setq to (1- to))) | 1077 (setq to (1- to))) |
1026 (prog1 (buffer-substring-no-properties from to) | 1078 (let ((result (buffer-substring-no-properties from to))) |
1027 (set-buffer old))) | 1079 (when secret |
1080 (let ((index 0)) | |
1081 (while (< (+ from index) to) | |
1082 (aset result index | |
1083 (get-text-property (+ from index) 'secret)) | |
1084 (setq index (1+ index))))) | |
1085 (set-buffer old) | |
1086 result)) | |
1028 (widget-get widget :value)))) | 1087 (widget-get widget :value)))) |
1029 | 1088 |
1030 (defun widget-field-match (widget value) | 1089 (defun widget-field-match (widget value) |
1031 ;; Match any string. | 1090 ;; Match any string. |
1032 (stringp value)) | 1091 (stringp value)) |
1033 | 1092 |
1034 ;;; The `text' Widget. | 1093 ;;; The `text' Widget. |
1035 | 1094 |
1036 (define-widget 'text 'editable-field | 1095 (define-widget 'text 'editable-field |
1096 :keymap widget-text-keymap | |
1037 "A multiline text area.") | 1097 "A multiline text area.") |
1038 | 1098 |
1039 ;;; The `menu-choice' Widget. | 1099 ;;; The `menu-choice' Widget. |
1040 | 1100 |
1041 (define-widget 'menu-choice 'default | 1101 (define-widget 'menu-choice 'default |