+ (point-min)))
+ (top (window-start (selected-window))))
+ (if (and (not h)
+ (< top point)
+ (not mime-preview-scroll-full-screen))
+ (progn (goto-char point)
+ (recenter (* -1 next-screen-context-lines)))
+ (condition-case nil
+ (scroll-down h)
+ (beginning-of-buffer
+ (goto-char (point-min))))))))
+
+(defun mime-preview-next-line-entity (&optional lines)
+ "Scroll up one line (or prefix LINES lines).
+If LINES is negative, scroll down LINES lines."
+ (interactive "p")
+ (mime-preview-scroll-up-entity (or lines 1)))
+
+(defun mime-preview-previous-line-entity (&optional lines)
+ "Scrroll down one line (or prefix LINES lines).
+If LINES is negative, scroll up LINES lines."
+ (interactive "p")
+ (mime-preview-scroll-down-entity (or lines 1)))
+
+(defun mime-preview-entity-boundary (&optional point)
+ (or point
+ (setq point (point)))
+ (and (eq point (point-max))
+ (setq point (1- (point-max))))
+ (let ((entity (get-text-property point 'mime-view-entity))
+ (start (previous-single-property-change (1+ point) 'mime-view-entity
+ nil (point-min)))
+ (end point)
+ done)
+ (while (and (mime-entity-children entity)
+ (not done))
+ (if (mime-view-children-is-invisible
+ (get-text-property point 'mime-view-situation))
+ (setq done t)
+ ;; If the part is shown, search the last part.
+ (let ((child (car (last (mime-entity-children entity)))))
+ (while (not (eq (get-text-property point 'mime-view-entity) child))
+ (setq point (next-single-property-change point 'mime-view-entity)))
+ (setq entity child))))
+ (setq end (next-single-property-change point 'mime-view-entity
+ nil (point-max)))
+ (cons start end)))
+
+(defun mime-preview-toggle-header (&optional show)
+ "Toggle display of entity header.
+When prefix is given, it always displays the header."
+ (interactive "P")
+ (let ((inhibit-read-only t)
+ (mime-view-force-inline-types t)
+ (position (mime-preview-entity-boundary))
+ entity header-is-visible situation)
+ (setq entity (get-text-property (car position) 'mime-view-entity)
+ situation (get-text-property (car position) 'mime-view-situation))
+ (setq header-is-visible (mime-view-header-is-visible situation))
+ (save-excursion
+ (delete-region (car position) (cdr position))
+ (if (or show (not header-is-visible))
+ (mime-display-entity
+ entity
+ (del-alist '*entity-button
+ (put-alist '*header 'visible
+ situation)))
+ (mime-display-entity
+ entity
+ (put-alist '*entity-button
+ 'visible
+ (put-alist '*header 'invisible
+ situation)))))))
+
+(defun mime-preview-toggle-all-header (&optional show)
+ "Toggle display of entity header.
+When prefix is given, it always displays the header."
+ (interactive "P")
+ (let ((inhibit-read-only t)
+ (mime-view-force-inline-types t)
+ (position (mime-preview-entity-boundary))
+ entity header-is-visible situation)
+ (setq entity (get-text-property (car position) 'mime-view-entity)
+ situation (get-text-property (car position) 'mime-view-situation))
+ (setq header-is-visible (mime-view-header-is-visible situation))
+ (save-excursion
+ (delete-region (car position) (cdr position))
+ (if (or show (not header-is-visible))
+ (mime-display-entity
+ entity
+ (del-alist '*entity-button
+ (del-alist '*header
+ (del-alist '*header-presentation-method
+ situation))))
+ (mime-display-entity
+ entity
+ (put-alist
+ '*entity-button
+ 'visible
+ (put-alist
+ '*header 'invisible
+ (put-alist '*header-presentation-method
+ #'(lambda (entity situation)
+ (mime-insert-header
+ entity nil '(".*")))
+ situation))))))))
+
+(defun mime-preview-toggle-content (&optional show)
+ "Toggle display of entity body.
+When prefix is given, it always displays the content."
+ (interactive "P")
+ (let ((inhibit-read-only t)
+ (mime-view-force-inline-types t)
+ (position (mime-preview-entity-boundary))
+ entity situation)
+ (setq entity (get-text-property (car position) 'mime-view-entity)
+ situation (get-text-property (car position) 'mime-view-situation))
+ (setq situation
+ (if (mime-entity-children entity)
+ ;; Entity body is always invisible for composite types.
+ (if (or show (mime-view-children-is-invisible situation))
+ (del-alist
+ '*entity-button
+ (put-alist '*children 'visible situation))
+ (put-alist
+ '*entity-button 'visible
+ (put-alist '*children 'invisible situation)))
+ (if (or show (not (mime-view-body-is-visible situation)))
+ (del-alist
+ '*entity-button
+ (put-alist '*body 'visible situation))
+ (put-alist
+ '*entity-button 'visible
+ (put-alist '*body 'invisible situation)))))
+ (save-excursion
+ (delete-region (car position) (cdr position))
+ (mime-display-entity entity situation))))
+
+(defun mime-preview-toggle-button (&optional show)
+ "Toggle display of entity button.
+When prefix is given, it always displays the content."
+ (interactive "P")
+ (let ((inhibit-read-only t)
+ (mime-view-force-inline-types t)
+ (position (mime-preview-entity-boundary))
+ entity situation button-is-visible)
+ (setq entity (get-text-property (car position) 'mime-view-entity)
+ situation (get-text-property (car position) 'mime-view-situation)
+ button-is-visible (mime-view-button-is-visible situation))
+ (save-excursion
+ (delete-region (car position) (cdr position))
+ (if (or show (not button-is-visible))
+ (mime-display-entity entity
+ (put-alist '*entity-button
+ 'visible situation))
+ (mime-display-entity entity
+ (put-alist '*entity-button
+ 'invisible situation))))))