
dropfile - Drag and Drop a specified file.
		  				       by Yuuichi Teranishi

How to use:

Put dropfile.exe on your exec-path and put dropfile.el on your load-path.
Then put following setting on your '.emacs'.

(autoload 'dropfile "dropfile")

Press 'ESC' button to cancel the drop.

You can use following API:

FUNCTION
dropfile (file &optional buffer)

Drag and Drop a FILE.
If BUFFER is specified, a file named FILE with BUFFER content is dropped.

How to setup:

;; Display icons using dispicon.el and setup drag starter on SEMI.
(eval-after-load "mime-view"
  '(progn
     (defun mime-entity-dragdrop (name)
       (let ((entity (get-text-property (point) 'mime-view-entity))
	     (workdir (expand-file-name dropfile-work-directory
					dropfile-temporary-directory))
	     outfile)
	 (unless (file-directory-p workdir)
	   (make-directory workdir))    
	 (when entity
	   (mime-write-entity-content
	    entity
	    (setq outfile (expand-file-name name workdir)))
	   (message "") ; empty minibuffer
	   (dropfile outfile))))
     (defun mime-view-entity-title (entity)
       (or (mime-entity-read-field entity 'Content-Description)
	   (mime-entity-read-field entity 'Subject)
	   (let ((file (mime-entity-filename entity)))
	     (when file
	       (propertize
		(concat (dispicon file) file)
		'keymap
		(let ((map (make-sparse-keymap)))
		  (define-key map [down-mouse-1]
		    `(lambda (event)
		       (interactive "e")
		       (save-window-excursion
			 (mouse-set-point event)
			 (mime-entity-dragdrop ,file))))
		  map))))
	   ""))))

;; Display icons using dispicon.el and setup drag starter on Dired.
(eval-after-load "dired"
  '(progn
     (defadvice dired-revert (before dired-revert-remove-overlays activate)
       "Remove overlays."
       (save-excursion
	 (let ((pos (point-min)))
	   (while (not (eq (setq pos (next-overlay-change pos)) (point-max)))
	     (dolist (overlay (overlays-at pos))
	       (delete-overlay overlay))))))
     (defun dired-insert-set-properties (beg end)
       (save-excursion
	 (goto-char beg)
	 (while (< (point) end)
	   (condition-case nil
	       (when (dired-move-to-filename)
		 (let ((beg (point))
		       end file map)
		   (add-text-properties
		    beg
		    (setq end (save-excursion
				(dired-move-to-end-of-filename)
				(point)))
		    '(mouse-face highlight
				 help-echo
				 "mouse-2: visit this file in other window"))
		   (setq file (buffer-substring beg end)
			 file (with-temp-buffer
				(insert (expand-file-name
					 file
					 dired-directory))
				(goto-char (point-min))
				(while (search-forward "/" nil t)
				  (replace-match "\\" nil t))
				(buffer-string))
			 map (make-sparse-keymap))
		   (define-key map [down-mouse-1] `(lambda ()
						     (interactive)
						     (dropfile ,file)))
		   (overlay-put (make-overlay beg end)
				'before-string
				(propertize
				 (dispicon file 'small 16)
				 'keymap map))
		   (put-text-property beg end 'keymap map)))
	     (error nil))
	   (forward-line 1))))))
