Update of /project/mcclim/cvsroot/mcclim/Drei In directory clnet:/tmp/cvs-serv18243/Drei
Modified Files: drei-redisplay.lisp views.lisp Log Message: Reintroduce early support for long lines (and horizontal scrolling) in Drei. Still doesn't deal properly with cursors, and is very eager at scrolling back.
--- /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/15 09:35:27 1.33 +++ /project/mcclim/cvsroot/mcclim/Drei/drei-redisplay.lisp 2008/01/15 14:08:19 1.34 @@ -547,14 +547,17 @@ (funcall (drawing-options-function (stroke-drawing-options stroke)) stream view stroke cursor-x cursor-y #'stroke-drawing-fn nil)))
-(defun draw-stroke (stream view stroke cursor-x cursor-y) - "Draw `stroke' on `stream' with a baseline at +(defun draw-stroke (pane view stroke cursor-x cursor-y) + "Draw `stroke' on `pane' with a baseline at `cursor-y'. Drawing starts at the horizontal offset `cursor-x'. Stroke must thus have updated dimensional -informational. Nothing will be done unless `stroke' is dirty." +information. Nothing will be done unless `stroke' is dirty." (when (stroke-dirty stroke) + (when (> (x2 (stroke-dimensions stroke)) + (bounding-rectangle-width pane)) + (change-space-requirements pane :width (x2 (stroke-dimensions stroke)))) (funcall (drawing-options-function (stroke-drawing-options stroke)) - stream view stroke cursor-x cursor-y #'stroke-drawing-fn t))) + pane view stroke cursor-x cursor-y #'stroke-drawing-fn t)))
(defun end-line (line x1 y1 line-width line-height) "End the addition of strokes to `line' for now, and update the @@ -565,7 +568,7 @@ (x2 dimensions) (+ x1 line-width) (y2 dimensions) (+ y1 line-height))))
-(defun end-line-cleaning-up (stream line line-x1 line-y1 +(defun end-line-cleaning-up (view pane line line-x1 line-y1 line-width line-height) "End the addition of strokes to `line' for now, and update the dimensions of `line'. Update all undisplayed lines to have no @@ -575,6 +578,9 @@ (end-line line line-x1 line-y1 line-width line-height) (with-accessors ((line-x1 x1) (line-y1 y1) (line-x2 x2) (line-y2 y2)) (line-dimensions line) + (setf (max-line-width view) + (max (max-line-width view) + (dimensions-width (line-dimensions line)))) ;; If a has a lesser height than the line, clear from the top of ;; the line stroke to the top of the stroke, to avoid artifacts ;; left over from previous redisplays. @@ -583,7 +589,7 @@ (with-accessors ((stroke-x1 x1) (stroke-y1 y1) (stroke-x2 x2) (stroke-y2 y2)) stroke-dimensions (when (> line-height (dimensions-height stroke-dimensions)) - (clear-rectangle* stream stroke-x1 line-y1 + (clear-rectangle* pane stroke-x1 line-y1 stroke-x2 stroke-y1))))) ;; Reset the dimensions of undisplayed lines. (do-undisplayed-line-strokes (stroke line) @@ -645,7 +651,7 @@ for stroke = (aref (line-strokes line) stroke-index) for stroke-dimensions = (stroke-dimensions stroke) do (draw-stroke pane view stroke (x1 stroke-dimensions) baseline) - finally (progn (end-line-cleaning-up pane line orig-x-offset cursor-y + finally (progn (end-line-cleaning-up view pane line orig-x-offset cursor-y line-width line-height) (incf (displayed-lines-count view)) (return (values pump-state line-height))))))) @@ -882,6 +888,54 @@ (when (> br-height (bounding-rectangle-height stream)) (change-space-requirements stream :height br-height))))
+(defmethod bounding-rectangle* ((view drei-buffer-view)) + "Return the bounding rectangle of the visual appearance of +`view' as four values, just as `bounding-rectangle*'. Will return +0, 0, 0, 0 when `view' has not been redisplayed." + (if (zerop (displayed-lines-count view)) + (values 0 0 0 0) + (let ((first-line (aref (displayed-lines view) 0)) + (last-line (last-displayed-line view)) + (max-x2 0)) + (do-displayed-lines (line view) + (setf max-x2 (max max-x2 + (x2 (line-dimensions line))))) + (values (x1 (line-dimensions first-line)) + (y1 (line-dimensions first-line)) + max-x2 + (y2 (line-dimensions last-line)))))) + +(defmethod bounding-rectangle-width ((view drei-buffer-view)) + (multiple-value-bind (x1 y1 x2) + (bounding-rectangle* view) + (declare (ignore y1)) + (- x2 x1))) + +(defun drei-bounding-rectangle* (drei-instance) + "Return the bounding rectangle of the visual appearance of +`drei-instance' as four values, just as +`bounding-rectangle*'. Takes the cursors of `drei-instance' into +account." + (multiple-value-bind (x1 y1 x2 y2) + (view-bounding-rectangle* (view drei-instance)) + (dolist (cursor (cursors drei-instance)) + (multiple-value-bind (cursor-x1 cursor-y1 cursor-x2 cursor-y2) + (bounding-rectangle* cursor) + (unless (= cursor-x1 cursor-y1 cursor-x2 cursor-y2 0) + (setf x1 (min x1 cursor-x1) + y1 (min y1 cursor-y1) + x2 (max x2 cursor-x2) + y2 (max y2 cursor-y2))))) + (values x1 y1 x2 y2))) + +(defun drei-bounding-rectangle-width (drei-instance) + "Return the width of the bounding rectangle of `drei-instance', +calculated by `drei-bounding-rectangle*'." + (multiple-value-bind (x1 y1 x2) + (drei-bounding-rectangle* drei-instance) + (declare (ignore y1)) + (- x2 x1))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Drei area redisplay. @@ -903,13 +957,14 @@ (height (+ ascent descent))) (multiple-value-bind (x1 y1 x2 y2) (call-next-method) - (values x1 y1 (max x2 (+ x1 style-width) - (cond ((numberp min-width) - (+ x1 min-width)) - ;; Must be T, then. - ((pane-viewport pane) - (+ x1 (bounding-rectangle-width (pane-viewport-region pane)))) - (t 0))) + (values x1 y1 + (max x2 (+ x1 style-width) + (cond ((numberp min-width) + (+ x1 min-width)) + ;; Must be T, then. + ((pane-viewport pane) + (+ x1 (bounding-rectangle-width (pane-viewport-region pane)))) + (t 0))) (max y2 (+ y1 height)))))))
;; XXX: Full redraw for every replay, should probably use the `region' @@ -949,25 +1004,21 @@ (defun display-drei-area (drei) (with-accessors ((stream editor-pane) (view view)) drei (replay drei stream) - (with-bounding-rectangle* (dx1 dy1 dx2 dy2) drei - (declare (ignore dx1 dy1 dy2)) - (when (point-cursor drei) - (with-bounding-rectangle* (x1 y1 x2 y2) (point-cursor drei) - (apply #'change-space-requirements stream (when (> x2 dx2) - (list :width x2))) - (when (pane-viewport stream) - (let* ((viewport (pane-viewport stream)) - (viewport-height (bounding-rectangle-height viewport)) - (viewport-width (bounding-rectangle-width viewport)) - (viewport-region (pane-viewport-region stream))) - ;; Scroll if point went outside the visible area. - (when (and (active drei) - (pane-viewport stream) - (not (and (region-contains-position-p viewport-region x2 y2) - (region-contains-position-p viewport-region x1 y1)))) - (scroll-extent stream - (max 0 (- x2 viewport-width)) - (max 0 (- y2 viewport-height))))))))))) + (when (point-cursor drei) + (with-bounding-rectangle* (x1 y1 x2 y2) (point-cursor drei) + (when (pane-viewport stream) + (let* ((viewport (pane-viewport stream)) + (viewport-height (bounding-rectangle-height viewport)) + (viewport-width (bounding-rectangle-width viewport)) + (viewport-region (pane-viewport-region stream))) + ;; Scroll if point went outside the visible area. + (when (and (active drei) + (pane-viewport stream) + (not (and (region-contains-position-p viewport-region x2 y2) + (region-contains-position-p viewport-region x1 y1)))) + (scroll-extent stream + (max 0 (- x2 viewport-width)) + (max 0 (- y2 viewport-height))))))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; @@ -1019,7 +1070,7 @@ has `view'."))
(defmethod fix-pane-viewport ((pane drei-pane) (view drei-view)) - (let* ((output-width (bounding-rectangle-width (stream-current-output-record pane))) + (let* ((output-width (bounding-rectangle-width view)) (viewport (pane-viewport pane)) (viewport-width (and viewport (bounding-rectangle-width viewport))) (pane-width (bounding-rectangle-width pane))) --- /project/mcclim/cvsroot/mcclim/Drei/views.lisp 2008/01/15 07:43:05 1.19 +++ /project/mcclim/cvsroot/mcclim/Drei/views.lisp 2008/01/15 14:08:19 1.20 @@ -532,7 +532,12 @@ :type integer :documentation "The number of lines in the views `displayed-lines' array that are actually live, that -is, used for display right now.")) +is, used for display right now.") + (%max-line-width :accessor max-line-width + :initform 0 + :type integer + :documentation "The width of the longest +displayed line in device units.")) (:metaclass modual-class) (:documentation "A view that contains a `drei-buffer' object. The buffer is displayed on a simple line-by-line basis, @@ -562,13 +567,6 @@ (setf (fill-pointer string) 0) string))
-(defmethod observer-notified ((view drei-buffer-view) (buffer drei-buffer) - changed-region) - (dotimes (i (displayed-lines-count view)) - (let ((line (line-information view i))) - (when (<= (car changed-region) (line-end-offset line)) - (invalidate-line-strokes line :modified t))))) - (defclass drei-syntax-view (drei-buffer-view) ((%syntax :accessor syntax :documentation "An instance of the syntax class used