+(defvar wl-message-button-map (make-sparse-keymap))
+
+(defun wl-message-add-button (from to function &optional data)
+ "Create a button between FROM and TO with callback FUNCTION and DATA."
+ (add-text-properties
+ from to
+ (nconc (list 'wl-message-button-callback function)
+ (if data
+ (list 'wl-message-button-data data))))
+ (let ((ov (make-overlay from to)))
+ (overlay-put ov 'mouse-face 'highlight)
+ (overlay-put ov 'local-map wl-message-button-map)
+ (overlay-put ov 'evaporate t)))
+
+(defun wl-message-button-dispatcher (event)
+ "Select the button under point."
+ (interactive "@e")
+ (mouse-set-point event)
+ (let ((callback (get-text-property (point) 'wl-message-button-callback))
+ (data (get-text-property (point) 'wl-message-button-data)))
+ (if callback
+ (funcall callback data)
+ (wl-message-button-dispatcher-internal event))))
+
+(defun wl-message-button-refer-article (data)
+ "Read article specified by Message-ID DATA at point."
+ (switch-to-buffer-other-window
+ wl-message-buffer-cur-summary-buffer)
+ (if (wl-summary-jump-to-msg-by-message-id data)
+ (wl-summary-redisplay)))
+