Update of /project/mcclim/cvsroot/mcclim/Drei In directory clnet:/tmp/cvs-serv12206/Drei
Modified Files: core-commands.lisp drei-redisplay.lisp packages.lisp views.lisp Log Message: Improved support for nonbuffer views, including various bugfixes here and there, used that support to revamp Climacs' typeout panes, which in turn required some ESA changes.
Stability not guaranteed, please test.
--- /project/mcclim/cvsroot/mcclim/Drei/core-commands.lisp 2008/01/17 11:29:55 1.13 +++ /project/mcclim/cvsroot/mcclim/Drei/core-commands.lisp 2008/01/20 19:50:20 1.14 @@ -296,7 +296,7 @@ '((:home :control)))
(define-command (com-page-down :name t :command-table movement-table) () - (page-down (current-view))) + (page-down (editor-pane (drei-instance)) (current-view)))
(set-key 'com-page-down 'movement-table @@ -307,7 +307,7 @@ '((:next)))
(define-command (com-page-up :name t :command-table movement-table) () - (page-up (current-view))) + (page-up (editor-pane (drei-instance)) (current-view)))
(set-key 'com-page-up 'movement-table --- /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/19 12:39:28 1.45 +++ /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/20 19:50:20 1.46 @@ -652,7 +652,7 @@ (maybe-clear last-clear-x (x1 stroke-dimensions)) (setf last-clear-x (x2 stroke-dimensions))) ;; This clears from end of line to the end of the sheet. - finally (maybe-clear (1+ last-clear-x) (bounding-rectangle-width pane)))) + finally (maybe-clear last-clear-x (bounding-rectangle-width pane)))) ;; Now actually draw them in a way that makes sure they all ;; touch the bottom of the line. (loop for stroke-index below (line-stroke-count line) @@ -994,8 +994,9 @@ (with-bounding-rectangle* (old-x1 old-y1 old-x2 old-y2) drei (replay drei stream) (with-bounding-rectangle* (new-x1 new-y1 new-x2 new-y2) drei - (unless (and (= new-x1 old-x1) (= new-y1 old-y2) - (= new-x2 old-x2) (= new-y2 old-y2)) + (unless (or (and (= new-x1 old-x1) (= new-y1 old-y2) + (= new-x2 old-x2) (= new-y2 old-y2)) + (null (output-record-parent drei))) (recompute-extent-for-changed-child (output-record-parent drei) drei old-x1 old-y1 old-x2 old-y2)))) (when (point-cursor drei) @@ -1018,6 +1019,22 @@ ;;; ;;; Drei pane redisplay.
+(defgeneric handle-redisplay (pane view region) + (:documentation "Handle redisplay of `view' upon `pane' (which +is a Drei pane) in the given region. Methods defined on this +function should mark their redisplay information as dirty based +on `region' and call the default method, which will in turn call +`display-drei' on `pane'.") + (:method ((pane drei-pane) (view drei-view) (region region)) + (display-drei pane))) + +(defmethod handle-repaint ((pane drei-pane) region) + (handle-redisplay pane (view pane) region)) + +(defmethod handle-redisplay ((pane drei-pane) (view drei-buffer-view) (region region)) + (invalidate-all-strokes (view pane) :cleared t) + (call-next-method)) + (defun reposition-pane (drei-pane) "Try to put point close to the middle of the pane by moving top half a pane-size up." @@ -1037,14 +1054,15 @@ "Reposition the pane if point is outside the region delimited by the top/bot marks of its view. Returns true if adjustment was needed." - (with-accessors ((buffer buffer) (top top) (bot bot) - (point point)) (view drei-pane) - (when (or (mark< point top) - (mark> point bot)) - (reposition-pane drei-pane) - t))) + (when (typep (view drei-pane) 'point-mark-view) + (with-accessors ((buffer buffer) (top top) (bot bot) + (point point)) (view drei-pane) + (when (or (mark< point top) + (mark> point bot)) + (reposition-pane drei-pane) + t))))
-(defun page-down (view) +(defmethod page-down (pane (view drei-buffer-view)) (with-accessors ((top top) (bot bot)) view (when (mark> (size (buffer bot)) bot) (setf (offset top) (offset bot)) @@ -1052,7 +1070,7 @@ (setf (offset (point view)) (offset top)) (invalidate-all-strokes view))))
-(defun page-up (view) +(defmethod page-up (pane (view drei-buffer-view)) (with-accessors ((top top) (bot bot)) view (when (> (offset top) 0) (setf (offset (point view)) (offset top)) @@ -1096,11 +1114,6 @@ ;; We start all over! (display-drei-pane (pane-frame pane) pane)))))))
-(defmethod handle-repaint ((pane drei-pane) region) - (declare (ignore region)) - (invalidate-all-strokes (view pane) :cleared t) - (redisplay-frame-pane (pane-frame pane) pane)) - (defmethod pane-needs-redisplay :around ((pane drei-pane)) (values (call-next-method) nil))
--- /project/mcclim/cvsroot/mcclim/Drei/packages.lisp 2008/01/19 12:39:28 1.43 +++ /project/mcclim/cvsroot/mcclim/Drei/packages.lisp 2008/01/20 19:50:20 1.44 @@ -216,7 +216,7 @@
;; Views and their facilities. #:drei-view #:modified-p #:no-cursors - #:drei-buffer-view #:buffer #:top #:bot + #:drei-buffer-view #:buffer #:top #:bot #:buffer-view-p #:drei-syntax-view #:syntax #:pump-state-for-offset-with-syntax #:stroke-pump-with-syntax @@ -248,12 +248,14 @@
#:minibuffer
- #:drei #:drei-pane #:drei-gadget-pane #:drei-area + #:drei #:editor-pane + #:drei-pane #:drei-gadget-pane #:drei-area #:handling-drei-conditions #:handle-drei-condition #:execute-drei-command
;; Redisplay engine. #:display-drei-view-contents #:display-drei-view-cursor + #:handle-redisplay #:face #:make-face #:face-ink #:face-style #:drawing-options #:make-drawing-options #:drawing-options-face #:drawing-options-function --- /project/mcclim/cvsroot/mcclim/Drei/views.lisp 2008/01/18 11:00:23 1.23 +++ /project/mcclim/cvsroot/mcclim/Drei/views.lisp 2008/01/20 19:50:20 1.24 @@ -504,6 +504,14 @@ when (and slot-initarg slot-boundp) nconc (list slot-initarg (slot-value view slot-name)))))))
+(defgeneric page-down (pane view) + (:documentation "Scroll `view', which is displayed on `pane', a +page up.")) + +(defgeneric page-up (pane view) + (:documentation "Scroll `view', which is displayed on `pane', a +page up.")) + (defclass drei-buffer-view (drei-view) ((%buffer :accessor buffer :initform (make-instance 'drei-buffer) @@ -574,6 +582,10 @@ (setf (fill-pointer string) 0) string))
+(defun buffer-view-p (view) + "Return true if `view' is a `drei-buffer-view'." + (typep view 'drei-buffer-view)) + (defclass drei-syntax-view (drei-buffer-view) ((%syntax :accessor syntax :documentation "An instance of the syntax class used