[climacs-cvs] CVS update: climacs/buffer.lisp climacs/buffer.text climacs/packages.lisp

Robert Strandh rstrandh at common-lisp.net
Thu Dec 23 17:24:47 UTC 2004


Update of /project/climacs/cvsroot/climacs
In directory common-lisp.net:/tmp/cvs-serv25441

Modified Files:
	buffer.lisp buffer.text packages.lisp 
Log Message:
Completed the description of the buffer modification protocol.

Implemented the protocol.

Updated the buffer package accordingly.

Date: Thu Dec 23 18:24:45 2004
Author: rstrandh

Index: climacs/buffer.lisp
diff -u climacs/buffer.lisp:1.9 climacs/buffer.lisp:1.10
--- climacs/buffer.lisp:1.9	Thu Dec 23 09:00:33 2004
+++ climacs/buffer.lisp	Thu Dec 23 18:24:44 2004
@@ -34,8 +34,14 @@
 newline characters.  The last object of the buffer is not
 necessarily a newline character."))
 
+(defgeneric low-mark (buffer))
+
+(defgeneric high-mark (buffer))
+
 (defclass standard-buffer (buffer)
-  ((contents :initform (make-instance 'standard-cursorchain)))
+  ((contents :initform (make-instance 'standard-cursorchain))
+   (low-mark :reader low-mark)
+   (high-mark :reader high-mark))
   (:documentation "The Climacs standard buffer [an instantable subclass of buffer]."))
 
 (defgeneric buffer (mark)
@@ -99,6 +105,13 @@
 	   :chain (slot-value (buffer mark) 'contents)
 	   :position offset)))
 
+(defmethod initialize-instance :after ((buffer standard-buffer) &rest args)
+  "Create the low-mark and high-mark"
+  (declare (ignore args))
+  (with-slots (low-mark high-mark) buffer
+     (setf low-mark (make-instance 'standard-left-sticky-mark :buffer buffer))
+     (setf high-mark (make-instance 'standard-right-sticky-mark :buffer buffer))))
+
 (defgeneric clone-mark (mark &optional type)
   (:documentation "Clone a mark.  By default (when type is NIL) the same type of mark is
 returned.  Otherwise type is the name of a class (subclass of the mark
@@ -240,27 +253,6 @@
 (defmethod end-of-buffer-p ((mark mark-mixin))
   (= (offset mark) (size (buffer mark))))
 
-(defgeneric beginning-of-line (mark)
-  (:documentation "Move the mark to the beginning of the line.  The mark will be
- positioned either immediately after the closest preceding newline
- character, or at the beginning of the buffer if no preceding newline
- character exists."))
-
-(defmethod beginning-of-line ((mark mark-mixin))
-  (loop until (or (beginning-of-buffer-p mark)
-		  (eql (object-before mark) #\Newline))
-	do (decf (offset mark))))
-
-(defgeneric end-of-line (mark)
-  (:documentation "Move the mark to the end of the line. The mark will be positioned
-either immediately before the closest following newline character, or
-at the end of the buffer if no following newline character exists."))
-
-(defmethod end-of-line ((mark mark-mixin))
-  (loop until (or (end-of-buffer-p mark)
-		  (eql (object-after mark) #\Newline))
-	do (incf (offset mark))))
-
 (defgeneric beginning-of-line-p (mark)
   (:documentation "Return t if the mark is at the beginning of the line (i.e., if the
 character preceding the mark is a newline character or if the mark is
@@ -279,6 +271,25 @@
   (or (end-of-buffer-p mark)
       (eql (object-after mark) #\Newline)))
 
+(defgeneric beginning-of-line (mark)
+  (:documentation "Move the mark to the beginning of the line.  The mark will be
+ positioned either immediately after the closest preceding newline
+ character, or at the beginning of the buffer if no preceding newline
+ character exists."))
+
+(defmethod beginning-of-line ((mark mark-mixin))
+  (loop until (beginning-of-line-p mark)
+	do (decf (offset mark))))
+
+(defgeneric end-of-line (mark)
+  (:documentation "Move the mark to the end of the line. The mark will be positioned
+either immediately before the closest following newline character, or
+at the end of the buffer if no following newline character exists."))
+
+(defmethod end-of-line ((mark mark-mixin))
+  (loop until (end-of-line-p mark)
+	do (incf (offset mark))))
+
 (defgeneric line-number (mark)
   (:documentation "Return the line number of the mark.  Lines are numbered from zero."))
 
@@ -439,4 +450,32 @@
   (assert (eq (buffer mark1) (buffer mark2)))
   (buffer-sequence (buffer mark1) (offset mark1) (offset mark2)))
 
-
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Buffer modification protocol
+
+(defmethod insert-buffer-object :before ((buffer standard-buffer) offset object)
+  (declare (ignore object))
+  (setf (offset (low-mark buffer))
+	(min (offset (low-mark buffer)) offset))
+  (setf (offset (high-mark buffer))
+	(max (offset (high-mark buffer)) offset)))
+
+(defmethod insert-buffer-sequence :before ((buffer standard-buffer) offset sequence)
+  (declare (ignore sequence))
+  (setf (offset (low-mark buffer))
+	(min (offset (low-mark buffer)) offset))
+  (setf (offset (high-mark buffer))
+	(max (offset (high-mark buffer)) offset)))
+
+(defmethod delete-buffer-range :before ((buffer standard-buffer) offset n)
+  (setf (offset (low-mark buffer))
+	(min (offset (low-mark buffer)) offset))
+  (setf (offset (high-mark buffer))
+	(max (offset (high-mark buffer)) (+ offset n))))
+
+(defgeneric reset-low-high-marks (buffer))
+
+(defmethod reset-low-high-marks ((buffer standard-buffer))
+  (beginning-of-buffer (high-mark buffer))
+  (end-of-buffer (low-mark buffer)))


Index: climacs/buffer.text
diff -u climacs/buffer.text:1.3 climacs/buffer.text:1.4
--- climacs/buffer.text:1.3	Tue Dec 21 17:19:26 2004
+++ climacs/buffer.text	Thu Dec 23 18:24:44 2004
@@ -323,12 +323,13 @@
  of its current value and the position of the modification.
 
  Redisplay code may use these values to determine what part of the
- screen needs to be updated.  At the end of an invocation of
- redisplay, the offset of the low mark is set to the size of the
- buffer, and the offset of the high mark is set to zero.
+ screen needs to be updated.  These values can also be used to update
+ information about syntax highlighting and other cached information.
 
- These values can also be used to update information about syntax
- highlighting and other cached information. 
+reset-low-high-marks buffer                         [generic function]
+
+ Set the high-mark to the beginning of the beginning of the buffer and
+ the low-mark to the end of the buffer. 
 
 The redisplay protocol
 ======================


Index: climacs/packages.lisp
diff -u climacs/packages.lisp:1.6 climacs/packages.lisp:1.7
--- climacs/packages.lisp:1.6	Thu Dec 23 09:00:33 2004
+++ climacs/packages.lisp	Thu Dec 23 18:24:45 2004
@@ -37,7 +37,8 @@
 	   #:delete-buffer-range #:delete-range
 	   #:delete-region
 	   #:buffer-object #:buffer-sequence
-	   #:object-before #:object-after #:region-to-sequence))
+	   #:object-before #:object-after #:region-to-sequence
+	   #:low-mark #:high-mark #:reset-low-high-marks))
 
 (defpackage :climacs-base
   (:use :clim-lisp :climacs-buffer)




More information about the Climacs-cvs mailing list