[cells-gtk-cvs] CVS update: root/cells-gtk/test-gtk/test-textview.lisp

Peter Denno pdenno at common-lisp.net
Sun Mar 6 17:02:48 UTC 2005


Update of /project/cells-gtk/cvsroot/root/cells-gtk/test-gtk
In directory common-lisp.net:/tmp/cvs-serv22930/root/cells-gtk/test-gtk

Modified Files:
	test-textview.lisp 
Log Message:
Demonstrate text-buffer tags and markup (requires libcellsgtk.so)
Date: Sun Mar  6 18:02:44 2005
Author: pdenno

Index: root/cells-gtk/test-gtk/test-textview.lisp
diff -u root/cells-gtk/test-gtk/test-textview.lisp:1.2 root/cells-gtk/test-gtk/test-textview.lisp:1.3
--- root/cells-gtk/test-gtk/test-textview.lisp:1.2	Sat Feb 26 23:20:19 2005
+++ root/cells-gtk/test-gtk/test-textview.lisp	Sun Mar  6 18:02:44 2005
@@ -1,23 +1,82 @@
 (in-package :test-gtk)
 
+;;; The details of the tag-table and markup slots are, for the time being, 
+;;; not defined by cells-gtk. The demo give an idea how they might be used.
+
 (defmodel test-textview (vbox)
   ((buffer :accessor buffer :initarg :buffer 
 	   :initform (mk-text-buffer 
-		      :text (format nil "~{~a~%~}" (loop for i below 100 collect (format nil "Text view Line ~a" i))))))
+		      :text (format nil "~{~a~%~}" 
+                                    (loop for i below 100 collect (format nil "Text view Line ~a" i)))
+                      :on-modified-changed 
+                      (callback (w e d)
+                        (show-message "Text buffer modified"))
+                      :tag-table (c? (xtv-create-tag-table self)))))
   (:default-initargs
       :kids (list
 	     (mk-scrolled-window 
 	      :kids (list
 		     (mk-text-view 	      
 		      :buffer (c? (buffer (upper self test-textview)))
-                      #+libcellsgtk :populate-popup
-                      #+libcellsgtk 
-                      (c?
-                        (def-populate-adds
-                          (:menu-item :label "My menu item"
-                                      :owner self
-                                      :on-activate 
-                                      (callback (w e d)
-                                        (show-message (format nil "My menu item says = ~A" 
-                                                              (owner self)))))))))))))
+                       #+libcellsgtk :populate-popup
+                       #+libcellsgtk 
+                       (c?
+                         (def-populate-adds
+                           (:menu-item :label "Mark something yellow"
+                                       :owner self
+                                       :on-activate 
+                                       (callback (w e d)
+                                         (let ((buf (buffer (owner self))))
+                                           (setf (markup buf) ; implementation idea... ;^)
+                                                   (list 
+                                                    (make-instance 'color-tag :start 10 :end 20
+                                                                   :name :yellow-background)))
+                                           (apply-markup (first (markup buf)) buf))))))))))))
+                                         
+(defmethod xtv-create-tag-table ((self text-buffer))
+  (let ((ht (make-hash-table)))
+    (flet ((create-tag (name)
+             (setf (gethash name ht)
+                     (gtk-text-buffer-create-tag 
+                      (cgtk::id self)
+                      (string-downcase (symbol-name (gensym)))
+                      (string-downcase (subseq (string name) (1+ (position #\- (string name)))))
+                      (string-downcase (subseq (string name) 0 (position #\- (string name))))
+                      c-null))))
+      (loop for name in '(:red-foreground :red-background :yellow-foreground :yellow-background)
+         do (create-tag name)))
+    ht))
+
+;;; In a real application you might use an xml parser on marked up text 
+;;; by creating 'mark objects' like these. In the demo we just do it in a 
+;;; menu item cb.  
+
+;;; We won't even use this one here, but marks are useful ;^)
+(defclass mark ()
+  ((type :initarg :type)
+   (pos :initarg :pos)
+   (len :initarg :len)
+   (c-ptr :accessor c-ptr :initform nil)))
+
+(defclass color-tag ()
+  ((name :initarg :name)
+   (start :initarg :start)
+   (end :initarg :end)))
+
+(defmethod apply-markup ((tag color-tag) buffer)
+  (with-slots (start end name) tag
+    (assert (gethash name (tag-table buffer)))
+    (let ((buf (cgtk::id buffer)))
+      (with-text-iters (start-iter end-iter)
+        (gtk-text-buffer-get-iter-at-offset buf start-iter start)
+        (gtk-text-buffer-get-iter-at-offset buf end-iter end)
+        (gtk-text-buffer-apply-tag buf (gethash name (tag-table buffer)) start-iter end-iter)))))
+
+(defmethod apply-markup ((mark mark) buffer)
+  (with-slots (pos c-ptr) mark
+    (let ((buf (cgtk::id buffer)))
+      (with-text-iters (iter)
+        (gtk-text-buffer-get-iter-at-offset buf iter pos)
+        (setf c-ptr (gtk-text-buffer-create-mark buf (symbol-name (gensym)) iter t))))))
+
 




More information about the Cells-gtk-cvs mailing list