1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 1999-2001 Espen S. Johnsen <esj@stud.cs.uit.no>
4 ;; This library is free software; you can redistribute it and/or
5 ;; modify it under the terms of the GNU Lesser General Public
6 ;; License as published by the Free Software Foundation; either
7 ;; version 2 of the License, or (at your option) any later version.
9 ;; This library is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 ;; Lesser General Public License for more details.
14 ;; You should have received a copy of the GNU Lesser General Public
15 ;; License along with this library; if not, write to the Free Software
16 ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 ;; $Id: gtktree.lisp,v 1.4 2004-12-17 00:36:32 espen Exp $
26 (defbinding cell-layout-pack-start () nil
27 (cell-layout cell-layout)
31 (defbinding cell-layout-pack-end () nil
32 (cell-layout cell-layout)
36 (defun cell-layout-pack (layout cell &key end expand)
38 (cell-layout-pack-end layout cell expand)
39 (cell-layout-pack-start layout cell expand)))
42 (defbinding cell-layout-reorder () nil
43 (cell-layout cell-layout)
47 (defbinding cell-layout-clear () nil
48 (cell-layout cell-layout))
50 (defbinding cell-layout-add-attribute (cell-layout cell attribute column) nil
51 (cell-layout cell-layout)
53 ((string-downcase attribute) string)
56 (def-callback-marshal %cell-layout-data-func
57 (nil cell-layout cell-renderer tree-model (copy-of tree-iter)))
59 (defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
60 (cell-layout cell-layout)
62 ((callback %cell-layout-data-func) pointer)
63 ((register-callback-function function) unsigned-int)
64 ((callback %destroy-user-data) pointer))
66 (defbinding cell-layout-clear-attributes () nil
67 (cell-layout cell-layout)
74 (defmethod initialize-instance ((list-store list-store) &key column-types
75 column-names initial-content)
77 (%list-store-set-column-types list-store column-types)
79 (setf (object-data list-store 'column-names) column-names))
82 with iter = (make-instance 'tree-iter)
83 for row in initial-content
84 do (list-store-append list-store row iter))))
87 (defmethod column-setter-name ((list-store list-store))
88 (declare (ignore list-store))
91 (defbinding %list-store-set-column-types () nil
92 (list-store list-store)
93 ((length columns) unsigned-int)
94 (columns (vector gtype)))
96 (defbinding %list-store-remove () boolean
97 (list-store list-store)
98 (tree-iter tree-iter))
100 (defun list-store-remove (store row)
103 (%list-store-remove store row))
105 (multiple-value-bind (valid iter) (tree-model-get-iter store row)
107 (%list-store-remove store iter)
108 (error "~A not poiniting to av valid iterator in ~A" row store))))
110 (let ((path (tree-row-reference-get-path row)))
112 (list-store-remove store path)
113 (error "~A not valid" row))))))
116 (defbinding %list-store-insert () nil
117 (list-store list-store)
118 (tree-iter tree-iter)
121 (defun list-store-insert
122 (store position &optional data (iter (make-instance 'tree-iter)))
123 (%list-store-insert store iter position)
124 (when data (%tree-model-set store iter data))
127 (defbinding %list-store-insert-before () nil
128 (list-store list-store)
129 (tree-iter tree-iter)
130 (sibling (or null tree-iter)))
132 (defun list-store-insert-before
133 (store sibling &optional data (iter (make-instance 'tree-iter)))
134 (%list-store-insert-before store iter sibling)
135 (when data (%tree-model-set store iter data))
138 (defbinding %list-store-insert-after
139 (list-store &optional sibling (tree-iter (make-instance 'tree-iter))) nil
140 (list-store list-store)
141 (tree-iter tree-iter)
142 (sibling (or null tree-iter)))
144 (defun list-store-insert-after
145 (store sibling &optional data (iter (make-instance 'tree-iter)))
146 (%list-store-insert-after store iter sibling)
147 (when data (%tree-model-set store iter data))
150 (defbinding %list-store-prepend () nil
151 (list-store list-store)
152 (tree-iter tree-iter))
154 (defun list-store-prepend
155 (store &optional data (iter (make-instance 'tree-iter)))
156 (%list-store-prepend store iter)
157 (when data (%tree-model-set store iter data))
160 (defbinding %list-store-append () nil
161 (list-store list-store)
162 (tree-iter tree-iter))
164 (defun list-store-append
165 (store &optional data (iter (make-instance 'tree-iter)))
166 (%list-store-append store iter)
167 (when data (%tree-model-set store iter data))
170 (defbinding list-store-clear () nil
171 (list-store list-store))
173 (defbinding list-store-reorder () nil
174 (list-store list-store)
175 (new-order (vector int)))
177 (defbinding list-store-swap () nil
178 (list-store list-store)
182 (defbinding list-store-move-before () nil
183 (list-store list-store)
185 (psoition (or null tree-iter)))
187 (defbinding list-store-move-after () nil
188 (list-store list-store)
190 (psoition tree-iter))
195 (defbinding %tree-path-free () nil
198 (defbinding %tree-path-get-indices () pointer
201 (defbinding %tree-path-get-depth () int
204 (defun %make-tree-path (path)
205 (let ((c-vector (make-c-vector 'int (length path) path))
206 (location (allocate-memory (+ (size-of 'int) (size-of 'pointer)))))
207 (funcall (writer-function 'int) (length path) location)
208 (funcall (writer-function 'pointer) c-vector location (size-of 'int))
211 (defun %tree-path-to-vector (location)
212 (let ((indices (%tree-path-get-indices location))
213 (depth (%tree-path-get-depth location)))
214 (if (null-pointer-p indices)
216 (map-c-vector 'vector #'identity indices 'int depth))))
218 (eval-when (:compile-toplevel :load-toplevel :execute)
219 (defmethod alien-type ((type (eql 'tree-path)) &rest args)
220 (declare (ignore type args))
221 (alien-type 'pointer))
223 (defmethod size-of ((type (eql 'tree-path)) &rest args)
224 (declare (ignore type args))
227 (defmethod to-alien-form (path (type (eql 'tree-path)) &rest args)
228 (declare (ignore type args))
229 `(%make-tree-path ,path))
231 (defmethod from-alien-form (location (type (eql 'tree-path)) &rest args)
232 (declare (ignore type args))
233 `(let ((location ,location))
235 (%tree-path-to-vector location)
236 (%tree-path-free location))))
238 (defmethod copy-from-alien-form (location (type (eql 'tree-path)) &rest args)
239 (declare (ignore type args))
240 `(%tree-path-to-vector ,location))
242 (defmethod cleanup-form (location (type (eql 'tree-path)) &rest args)
243 (declare (ignore type args))
244 `(%tree-path-free ,location)))
246 (defmethod to-alien-function ((type (eql 'tree-path)) &rest args)
247 (declare (ignore type args))
250 (defmethod from-alien-function ((type (eql 'tree-path)) &rest args)
251 (declare (ignore type args))
254 (%tree-path-to-vector location)
255 (%tree-path-free location))))
257 (defmethod copy-from-alien-function ((type (eql 'tree-path)) &rest args)
258 (declare (ignore type args))
259 #'%tree-path-to-vector)
261 (defmethod cleanup-function ((type (eql 'tree-path)) &rest args)
262 (declare (ignore type args))
265 (defmethod writer-function ((type (eql 'tree-path)) &rest args)
266 (declare (ignore type args))
267 (let ((writer (writer-function 'pointer)))
268 #'(lambda (path location &optional (offset 0))
269 (funcall writer (%make-tree-path path) location offset))))
271 (defmethod reader-function ((type (eql 'tree-path)) &rest args)
272 (declare (ignore type args))
273 (let ((reader (reader-function 'pointer)))
274 #'(lambda (location &optional (offset 0))
275 (%tree-path-to-vector (funcall reader location offset)))))
278 (defbinding %tree-row-reference-new () pointer
282 (defmethod initialize-instance ((reference tree-row-reference) &key model path)
284 (slot-value reference 'location)
285 (%tree-row-reference-new model path))
288 (defbinding tree-row-reference-get-path () tree-path
289 (reference tree-row-reference))
291 (defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
292 (reference tree-row-reference))
295 (defbinding tree-model-get-column-type () gtype ;type-number
296 (tree-model tree-model)
299 (defbinding tree-model-get-iter
300 (model path &optional (iter (make-instance 'tree-iter))) boolean
302 (iter tree-iter :return)
305 (defbinding tree-model-get-path () tree-path
306 (tree-model tree-model)
309 (defbinding %tree-model-get-value () nil
310 (tree-model tree-model)
315 (defun tree-model-column-value (model iter column)
316 (let ((index (column-index model column)))
317 (with-gvalue (gvalue (tree-model-get-column-type model index))
318 (%tree-model-get-value model iter index gvalue))))
320 (defbinding tree-model-iter-next () boolean
321 (tree-model tree-model)
322 (iter tree-iter :return))
324 (defbinding tree-model-iter-children
325 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
326 (tree-model tree-model)
327 (iter tree-iter :return)
328 (parent (or null tree-iter)))
330 (defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
332 (tree-model tree-model)
335 (defbinding tree-model-iter-n-children () int
336 (tree-model tree-model)
339 (defbinding tree-model-iter-nth-child
340 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
341 (tree-model tree-model)
342 (iter tree-iter :return)
343 (parent (or null tree-iter))
346 (defbinding tree-model-iter-parent
347 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
348 (tree-model tree-model)
349 (iter tree-iter :return)
352 (def-callback-marshal %tree-model-foreach-func
353 (boolean tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
355 (defbinding %tree-model-foreach () nil
356 (tree-model tree-model)
357 ((callback %tree-model-foreach-func) pointer)
358 (callback-id unsigned-int))
360 (defun tree-model-foreach (model function)
361 (with-callback-function (id function)
362 (%tree-model-foreach model id)))
364 (defbinding tree-model-row-changed () nil
365 (tree-model tree-model)
369 (defbinding tree-model-row-inserted () nil
370 (tree-model tree-model)
374 (defbinding tree-model-row-has-child-toggled () nil
375 (tree-model tree-model)
379 (defbinding tree-model-row-deleted () nil
380 (tree-model tree-model)
384 (defbinding tree-model-rows-reordered () nil
385 (tree-model tree-model)
391 (defun column-types (model columns)
394 (find-type-number (first (mklist column))))
397 (defun column-index (model column)
401 (symbol (position column (object-data model 'column-names)))
402 (string (position column (object-data model 'column-names)
404 (error "~A has no column ~S" model column)))
406 (defun tree-model-column-value-setter (model column)
408 (object-data model 'column-setters)
410 (object-data model 'column-setters)
411 (make-array (tree-model-n-columns model)
412 :initial-element nil)))))
413 (let ((index (column-index model column)))
415 (svref setters index)
417 (svref setters index)
419 (mkbinding (column-setter-name model)
420 nil (type-of model) 'tree-iter 'int
421 ; (type-from-number (tree-model-get-column-type model index))
422 (tree-model-get-column-type model index)
424 #'(lambda (value iter)
425 (funcall setter model iter index value -1))))))))
427 (defun tree-model-row-setter (model)
429 (object-data model 'row-setter)
431 ;; This will create any missing column setter
433 for i from 0 below (tree-model-n-columns model)
434 do (tree-model-column-value-setter model i))
435 (let ((setters (object-data model 'column-setters)))
437 (object-data model 'row-setter)
439 (map nil #'(lambda (value setter)
440 (funcall setter value iter))
443 (defun (setf tree-model-column-value) (value model iter column)
444 (funcall (tree-model-column-value-setter model column) value iter)
447 (defun (setf tree-model-row-data) (data model iter)
448 (funcall (tree-model-row-setter model) data iter)
451 (defun %tree-model-set (model iter data)
453 (vector (setf (tree-model-row-data model iter) data))
456 as (column value . rest) = data then rest
457 do (setf (tree-model-column-value model iter column) value)
463 (def-callback-marshal %tree-selection-func (boolean tree-selection tree-model (path (copy-of tree-path)) (path-currently-selected boolean)))
465 (defbinding tree-selection-set-select-function (selection function) nil
466 (selection tree-selection)
467 ((callback %tree-selection-func) pointer)
468 ((register-callback-function function) unsigned-int)
469 ((callback %destroy-user-data) pointer))
471 (defbinding tree-selection-get-selected
472 (selection &optional (iter (make-instance 'tree-iter))) boolean
473 (selection tree-selection)
475 (iter tree-iter :return))
477 (def-callback-marshal %tree-selection-foreach-func (nil tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
479 (defbinding %tree-selection-selected-foreach () nil
480 (tree-selection tree-selection)
481 ((callback %tree-selection-foreach-func) pointer)
482 (callback-id unsigned-int))
484 (defun tree-selection-selected-foreach (selection function)
485 (with-callback-function (id function)
486 (%tree-selection-selected-foreach selection id)))
488 (defbinding tree-selection-get-selected-rows () (glist tree-path)
489 (tree-selection tree-selection)
492 (defbinding tree-selection-count-selected-rows () int
493 (tree-selection tree-selection))
495 (defbinding %tree-selection-select-path () nil
496 (tree-selection tree-selection)
497 (tree-path tree-path))
499 (defbinding %tree-selection-unselect-path () nil
500 (tree-selection tree-selection)
501 (tree-path tree-path))
503 (defbinding %tree-selection-path-is-selected () boolean
504 (tree-selection tree-selection)
505 (tree-path tree-path))
507 (defbinding %tree-selection-select-iter () nil
508 (tree-selection tree-selection)
509 (tree-path tree-path))
511 (defbinding %tree-selection-unselect-iter () nil
512 (tree-selection tree-selection)
513 (tree-path tree-path))
515 (defbinding %tree-selection-iter-is-selected () boolean
516 (tree-selection tree-selection)
517 (tree-path tree-path))
519 (defun tree-selection-select (selection row)
521 (tree-path (%tree-selection-select-path selection row))
522 (tree-iter (%tree-selection-select-iter selection row))))
524 (defun tree-selection-unselect (selection row)
526 (tree-path (%tree-selection-unselect-path selection row))
527 (tree-iter (%tree-selection-unselect-iter selection row))))
529 (defun tree-selection-is-selected-p (selection row)
531 (tree-path (%tree-selection-path-is-selected selection row))
532 (tree-iter (%tree-selection-iter-is-selected selection row))))
534 (defbinding tree-selection-select-all () nil
535 (tree-selection tree-selection))
537 (defbinding tree-selection-unselect-all () nil
538 (tree-selection tree-selection))
540 (defbinding tree-selection-select-range () nil
541 (tree-selection tree-selection)
545 (defbinding tree-selection-unselect-range () nil
546 (tree-selection tree-selection)
554 (defbinding %tree-store-set-column-types () nil
555 (tree-store tree-store)
556 ((length columns) unsigned-int)
557 (columns (vector gtype)))
559 (defmethod initialize-instance ((tree-store tree-store) &key column-types
562 (%tree-store-set-column-types tree-store column-types)
564 (setf (object-data tree-store 'column-names) column-names)))
566 (defmethod column-setter-name ((tree-store tree-store))
567 (declare (ignore tree-store))
568 "gtk_tree_store_set")
570 (defbinding tree-store-remove () boolean
571 (tree-store tree-store)
572 (tree-iter tree-iter))
574 (defbinding %tree-store-insert () nil
575 (tree-store tree-store)
576 (tree-iter tree-iter)
577 (parent (or null tree-iter))
580 (defun tree-store-insert
581 (store parent position &optional data (iter (make-instance 'tree-iter)))
582 (%tree-store-insert store iter parent position)
583 (when data (%tree-model-set store iter data))
586 (defbinding %tree-store-insert-before () nil
587 (tree-store tree-store)
588 (tree-iter tree-iter)
589 (parent (or null tree-iter))
590 (sibling (or null tree-iter)))
592 (defun tree-store-insert-after
593 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
594 (%tree-store-insert-before store iter parent sibling)
595 (when data (%tree-model-set store iter data))
598 (defbinding %tree-store-insert-after () nil
599 (tree-store tree-store)
600 (tree-iter tree-iter)
601 (parent (or null tree-iter))
602 (sibling (or null tree-iter)))
604 (defun tree-store-insert-after
605 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
606 (%tree-store-insert-after store iter parent sibling)
607 (when data (%tree-model-set store iter data))
610 (defbinding %tree-store-prepend () nil
611 (tree-store tree-store)
612 (tree-iter tree-iter)
613 (parent (or null tree-iter)))
615 (defun tree-store-prepend
616 (store parent &optional data (iter (make-instance 'tree-iter)))
617 (%tree-store-prepend store iter parent)
618 (when data (%tree-model-set store iter data))
621 (defbinding %tree-store-append () nil
622 (tree-store tree-store)
623 (tree-iter tree-iter)
624 (parent (or null tree-iter)))
626 (defun tree-store-append
627 (store parent &optional data (iter (make-instance 'tree-iter)))
628 (%tree-store-append store iter parent)
629 (when data (%tree-model-set store iter data))
632 (defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
633 (tree-store tree-store)
634 (tree-iter tree-iter)
635 (descendant tree-iter))
637 (defbinding tree-store-iter-depth () int
638 (tree-store tree-store)
639 (tree-iter tree-iter))
641 (defbinding tree-store-clear () nil
642 (tree-store tree-store))
644 (defbinding tree-store-reorder () nil
645 (tree-store tree-store)
647 (new-order (vector int)))
649 (defbinding tree-store-swap () nil
650 (tree-store tree-store)
654 (defbinding tree-store-move-before () nil
655 (tree-store tree-store)
657 (psoition (or null tree-iter)))
660 (defbinding tree-store-move-after () nil
661 (tree-store tree-store)
663 (psoition tree-iter))
669 (defmethod initialize-instance ((tree-view tree-view) &rest initargs
672 (mapc #'(lambda (column)
673 (tree-view-append-column tree-view column))
674 (get-all initargs :column)))
677 (defbinding tree-view-columns-autosize () nil
678 (tree-view tree-view))
680 (defbinding tree-view-append-column () int
681 (tree-view tree-view)
682 (tree-view-column tree-view-column))
684 (defbinding tree-view-remove-column () int
685 (tree-view tree-view)
686 (tree-view-column tree-view-column))
688 (defbinding tree-view-insert-column (view columnd position) int
690 (column tree-view-column)
691 ((if (eq position :end) -1 position) int))
693 (defbinding tree-view-get-column () tree-view-column
694 (tree-view tree-view)
697 (defbinding tree-view-move-column-after () nil
698 (tree-view tree-view)
699 (column tree-view-column)
700 (base-column (or null tree-view-column)))
702 ;;(defbinding tree-view-set-column drag-function ...)
704 (defbinding tree-view-scroll-to-point () nil
705 (tree-view tree-view)
709 (defbinding tree-view-scroll-to-cell () nil
710 (tree-view tree-view)
711 (path (or null tree-path))
712 (column (or null tree-view-column))
714 (row-align single-float)
715 (col-align single-float))
717 (defbinding tree-view-set-cursor () nil
718 (tree-view tree-view)
720 (focus-column tree-view-column)
721 (start-editing boolean))
723 (defbinding tree-view-set-cursor-on-cell () nil
724 (tree-view tree-view)
726 (focus-column (or null tree-view-column))
727 (focus-cell (or null cell-renderer))
728 (start-editing boolean))
730 (defbinding tree-view-get-cursor () nil
731 (tree-view tree-view)
732 (path tree-path :out )
733 (focus-column tree-view-column :out))
735 (defbinding tree-view-row-activated () nil
736 (tree-view tree-view)
738 (column tree-view-column))
740 (defbinding tree-view-expand-all () nil
741 (tree-view tree-view))
743 (defbinding tree-view-collapse-all () nil
744 (tree-view tree-view))
746 (defbinding tree-view-expand-to-path () nil
747 (tree-view tree-view)
750 (defbinding tree-view-expand-row () nil
751 (tree-view tree-view)
755 (defbinding tree-view-collapse-row () nil
756 (tree-view tree-view)
759 (def-callback-marshal %tree-view-mapping-func (nil tree-view (path (copy-of tree-path))))
761 (defbinding %tree-view-map-expanded-rows () nil
762 (tree-view tree-view)
763 ((callback %tree-view-mapping-func) pointer)
764 (callback-id unsigned-int))
766 (defun map-expanded-rows (function tree-view)
767 (with-callback-function (id function)
768 (%tree-view-map-expanded-rows tree-view id)))
770 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
771 (tree-view tree-view)
774 (defbinding tree-view-get-path-at-pos
775 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
776 (tree-view tree-view)
779 (path tree-path :out)
780 (column tree-view-column :out)
784 (defbinding tree-view-get-cell-area () nil
785 (tree-view tree-view)
786 (path (or null tree-path))
787 (column (or null tree-view-column))
788 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
790 (defbinding tree-view-get-background-area () nil
791 (tree-view tree-view)
792 (path (or null tree-path))
793 (column (or null tree-view-column))
794 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
796 (defbinding tree-view-get-visible-rect () nil
797 (tree-view tree-view)
798 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
800 ;; and many more functions which we'll add later