Function: org-mouse-move-tree

org-mouse-move-tree is an interactive and byte-compiled function defined in org-mouse.el.gz.

Signature

(org-mouse-move-tree EVENT)

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/org/org-mouse.el.gz
(defun org-mouse-move-tree (event)
  ;; todo: handle movements between different buffers
  (interactive "e")
  (save-excursion
    (let* ((start (org-mouse-make-marker (event-start event)))
	   (end (org-mouse-make-marker (event-end event)))
	   (sbuf (marker-buffer start))
	   (ebuf (marker-buffer end)))

      (when (and sbuf ebuf)
	(set-buffer sbuf)
	(goto-char start)
	(org-back-to-heading)
	(if (and (eq sbuf ebuf)
		 (equal
		  (point)
		  (save-excursion (goto-char end) (org-back-to-heading) (point))))
	    ;; if the same line then promote/demote
	    (if (>= end start) (org-demote-subtree) (org-promote-subtree))
	  ;; if different lines then move
	  (org-cut-subtree)

	  (set-buffer ebuf)
	  (goto-char end)
	  (org-back-to-heading)
	  (when  (and (eq sbuf ebuf)
		      (equal
		       (point)
		       (save-excursion (goto-char start)
				       (org-back-to-heading) (point))))
	    (progn (org-end-of-subtree nil t)
		   (unless (eobp) (backward-char)))
	    (end-of-line)
	    (if (eobp) (newline) (forward-char)))

	  (when (looking-at org-outline-regexp)
	    (let ((level (- (match-end 0) (match-beginning 0))))
	      (when (> end (match-end 0))
		(progn (org-end-of-subtree nil t)
		       (unless (eobp) (backward-char)))
		(end-of-line)
		(if (eobp) (newline) (forward-char))
		(setq level (1+ level)))
	      (org-paste-subtree level)
	      (save-excursion
		(progn (org-end-of-subtree nil t)
		       (unless (eobp) (backward-char)))
		(when (bolp) (delete-char -1))))))))))