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.3 2004/11/21 17:57:56 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 () 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-get-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))
423 #'(lambda (value iter)
424 (funcall setter model iter index value -1))))))))
426 (defun tree-model-row-setter (model)
428 (object-data model 'row-setter)
430 ;; This will create any missing column setter
432 for i from 0 below (tree-model-n-columns model)
433 do (tree-model-column-value-setter model i))
434 (let ((setters (object-data model 'column-setters)))
436 (object-data model 'row-setter)
438 (map nil #'(lambda (value setter)
439 (funcall setter value iter))
442 (defun (setf tree-model-column-value) (value model iter column)
443 (funcall (tree-model-column-value-setter model column) value iter)
446 (defun (setf tree-model-row-data) (data model iter)
447 (funcall (tree-model-row-setter model) data iter)
450 (defun %tree-model-set (model iter data)
452 (vector (setf (tree-model-row-data model iter) data))
455 as (column value . rest) = data then rest
456 do (setf (tree-model-column-value model iter column) value)
462 (def-callback-marshal %tree-selection-func (boolean tree-selection tree-model (path (copy-of tree-path)) (path-currently-selected boolean)))
464 (defbinding tree-selection-set-select-function (selection function) nil
465 (selection tree-selection)
466 ((callback %tree-selection-func) pointer)
467 ((register-callback-function function) unsigned-int)
468 ((callback %destroy-user-data) pointer))
470 (defbinding tree-selection-get-selected
471 (selection &optional (iter (make-instance 'tree-iter))) boolean
472 (selection tree-selection)
474 (iter tree-iter :return))
476 (def-callback-marshal %tree-selection-foreach-func (nil tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
478 (defbinding %tree-selection-selected-foreach () nil
479 (tree-selection tree-selection)
480 ((callback %tree-selection-foreach-func) pointer)
481 (callback-id unsigned-int))
483 (defun tree-selection-selected-foreach (selection function)
484 (with-callback-function (id function)
485 (%tree-selection-selected-foreach selection id)))
487 (defbinding tree-selection-get-selected-rows () (glist tree-path)
488 (tree-selection tree-selection)
491 (defbinding tree-selection-count-selected-rows () int
492 (tree-selection tree-selection))
494 (defbinding %tree-selection-select-path () nil
495 (tree-selection tree-selection)
496 (tree-path tree-path))
498 (defbinding %tree-selection-unselect-path () nil
499 (tree-selection tree-selection)
500 (tree-path tree-path))
502 (defbinding %tree-selection-path-is-selected () boolean
503 (tree-selection tree-selection)
504 (tree-path tree-path))
506 (defbinding %tree-selection-select-iter () nil
507 (tree-selection tree-selection)
508 (tree-path tree-path))
510 (defbinding %tree-selection-unselect-iter () nil
511 (tree-selection tree-selection)
512 (tree-path tree-path))
514 (defbinding %tree-selection-iter-is-selected () boolean
515 (tree-selection tree-selection)
516 (tree-path tree-path))
518 (defun tree-selection-select (selection row)
520 (tree-path (%tree-selection-select-path selection row))
521 (tree-iter (%tree-selection-select-iter selection row))))
523 (defun tree-selection-unselect (selection row)
525 (tree-path (%tree-selection-unselect-path selection row))
526 (tree-iter (%tree-selection-unselect-iter selection row))))
528 (defun tree-selection-is-selected-p (selection row)
530 (tree-path (%tree-selection-path-is-selected selection row))
531 (tree-iter (%tree-selection-iter-is-selected selection row))))
533 (defbinding tree-selection-select-all () nil
534 (tree-selection tree-selection))
536 (defbinding tree-selection-unselect-all () nil
537 (tree-selection tree-selection))
539 (defbinding tree-selection-select-range () nil
540 (tree-selection tree-selection)
544 (defbinding tree-selection-unselect-range () nil
545 (tree-selection tree-selection)
553 (defbinding %tree-store-set-column-types () nil
554 (tree-store tree-store)
555 ((length columns) unsigned-int)
556 (columns (vector gtype)))
558 (defmethod initialize-instance ((tree-store tree-store) &key column-types
561 (%tree-store-set-column-types tree-store column-types)
563 (setf (object-data tree-store 'column-names) column-names)))
565 (defmethod column-setter-name ((tree-store tree-store))
566 (declare (ignore tree-store))
567 "gtk_tree_store_set")
569 (defbinding tree-store-remove () boolean
570 (tree-store tree-store)
571 (tree-iter tree-iter))
573 (defbinding %tree-store-insert () nil
574 (tree-store tree-store)
575 (tree-iter tree-iter)
576 (parent (or null tree-iter))
579 (defun tree-store-insert
580 (store parent position &optional data (iter (make-instance 'tree-iter)))
581 (%tree-store-insert store iter parent position)
582 (when data (%tree-model-set store iter data))
585 (defbinding %tree-store-insert-before () nil
586 (tree-store tree-store)
587 (tree-iter tree-iter)
588 (parent (or null tree-iter))
589 (sibling (or null tree-iter)))
591 (defun tree-store-insert-after
592 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
593 (%tree-store-insert-before store iter parent sibling)
594 (when data (%tree-model-set store iter data))
597 (defbinding %tree-store-insert-after () nil
598 (tree-store tree-store)
599 (tree-iter tree-iter)
600 (parent (or null tree-iter))
601 (sibling (or null tree-iter)))
603 (defun tree-store-insert-after
604 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
605 (%tree-store-insert-after store iter parent sibling)
606 (when data (%tree-model-set store iter data))
609 (defbinding %tree-store-prepend () nil
610 (tree-store tree-store)
611 (tree-iter tree-iter)
612 (parent (or null tree-iter)))
614 (defun tree-store-prepend
615 (store parent &optional data (iter (make-instance 'tree-iter)))
616 (%tree-store-prepend store iter parent)
617 (when data (%tree-model-set store iter data))
620 (defbinding %tree-store-append () nil
621 (tree-store tree-store)
622 (tree-iter tree-iter)
623 (parent (or null tree-iter)))
625 (defun tree-store-append
626 (store parent &optional data (iter (make-instance 'tree-iter)))
627 (%tree-store-append store iter parent)
628 (when data (%tree-model-set store iter data))
631 (defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
632 (tree-store tree-store)
633 (tree-iter tree-iter)
634 (descendant tree-iter))
636 (defbinding tree-store-iter-depth () int
637 (tree-store tree-store)
638 (tree-iter tree-iter))
640 (defbinding tree-store-clear () nil
641 (tree-store tree-store))
643 (defbinding tree-store-reorder () nil
644 (tree-store tree-store)
646 (new-order (vector int)))
648 (defbinding tree-store-swap () nil
649 (tree-store tree-store)
653 (defbinding tree-store-move-before () nil
654 (tree-store tree-store)
656 (psoition (or null tree-iter)))
659 (defbinding tree-store-move-after () nil
660 (tree-store tree-store)
662 (psoition tree-iter))
668 (defmethod initialize-instance ((tree-view tree-view) &rest initargs
671 (mapc #'(lambda (column)
672 (tree-view-append-column tree-view column))
673 (get-all initargs :column)))
676 (defbinding tree-view-columns-autosize () nil
677 (tree-view tree-view))
679 (defbinding tree-view-append-column () int
680 (tree-view tree-view)
681 (tree-view-column tree-view-column))
683 (defbinding tree-view-remove-column () int
684 (tree-view tree-view)
685 (tree-view-column tree-view-column))
687 (defbinding tree-view-insert-column (view columnd position) int
689 (column tree-view-column)
690 ((if (eq position :end) -1 position) int))
692 (defbinding tree-view-get-column () tree-view-column
693 (tree-view tree-view)
696 (defbinding tree-view-move-column-after () nil
697 (tree-view tree-view)
698 (column tree-view-column)
699 (base-column (or null tree-view-column)))
701 ;;(defbinding tree-view-set-column drag-function ...)
703 (defbinding tree-view-scroll-to-point () nil
704 (tree-view tree-view)
708 (defbinding tree-view-scroll-to-cell () nil
709 (tree-view tree-view)
710 (path (or null tree-path))
711 (column (or null tree-view-column))
713 (row-align single-float)
714 (col-align single-float))
716 (defbinding tree-view-set-cursor () nil
717 (tree-view tree-view)
719 (focus-column tree-view-column)
720 (start-editing boolean))
722 (defbinding tree-view-set-cursor-on-cell () nil
723 (tree-view tree-view)
725 (focus-column (or null tree-view-column))
726 (focus-cell (or null cell-renderer))
727 (start-editing boolean))
729 (defbinding tree-view-get-cursor () nil
730 (tree-view tree-view)
731 (path tree-path :out )
732 (focus-column tree-view-column :out))
734 (defbinding tree-view-row-activated () nil
735 (tree-view tree-view)
737 (column tree-view-column))
739 (defbinding tree-view-expand-all () nil
740 (tree-view tree-view))
742 (defbinding tree-view-collapse-all () nil
743 (tree-view tree-view))
745 (defbinding tree-view-expand-to-path () nil
746 (tree-view tree-view)
749 (defbinding tree-view-expand-row () nil
750 (tree-view tree-view)
754 (defbinding tree-view-collapse-row () nil
755 (tree-view tree-view)
758 (def-callback-marshal %tree-view-mapping-func (nil tree-view (path (copy-of tree-path))))
760 (defbinding %tree-view-map-expanded-rows () nil
761 (tree-view tree-view)
762 ((callback %tree-view-mapping-func) pointer)
763 (callback-id unsigned-int))
765 (defun map-expanded-rows (function tree-view)
766 (with-callback-function (id function)
767 (%tree-view-map-expanded-rows tree-view id)))
769 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
770 (tree-view tree-view)
773 (defbinding tree-view-get-path-at-pos
774 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
775 (tree-view tree-view)
778 (path tree-path :out)
779 (column tree-view-column :out)
783 (defbinding tree-view-get-cell-area () nil
784 (tree-view tree-view)
785 (path (or null tree-path))
786 (column (or null tree-view-column))
787 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
789 (defbinding tree-view-get-background-area () nil
790 (tree-view tree-view)
791 (path (or null tree-path))
792 (column (or null tree-view-column))
793 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
795 (defbinding tree-view-get-visible-rect () nil
796 (tree-view tree-view)
797 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
799 ;; and many more functions which we'll add later