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.2 2004/11/15 19:24:03 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 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 (defbinding %list-store-insert () nil
101 (list-store list-store)
102 (tree-iter tree-iter)
105 (defun list-store-insert
106 (store position &optional data (iter (make-instance 'tree-iter)))
107 (%list-store-insert store iter position)
108 (when data (%tree-model-set store iter data))
111 (defbinding %list-store-insert-before () nil
112 (list-store list-store)
113 (tree-iter tree-iter)
114 (sibling (or null tree-iter)))
116 (defun list-store-insert-before
117 (store sibling &optional data (iter (make-instance 'tree-iter)))
118 (%list-store-insert-before store iter sibling)
119 (when data (%tree-model-set store iter data))
122 (defbinding %list-store-insert-after
123 (list-store &optional sibling (tree-iter (make-instance 'tree-iter))) nil
124 (list-store list-store)
125 (tree-iter tree-iter)
126 (sibling (or null tree-iter)))
128 (defun list-store-insert-after
129 (store sibling &optional data (iter (make-instance 'tree-iter)))
130 (%list-store-insert-after store iter sibling)
131 (when data (%tree-model-set store iter data))
134 (defbinding %list-store-prepend () nil
135 (list-store list-store)
136 (tree-iter tree-iter))
138 (defun list-store-prepend
139 (store &optional data (iter (make-instance 'tree-iter)))
140 (%list-store-prepend store iter)
141 (when data (%tree-model-set store iter data))
144 (defbinding %list-store-append () nil
145 (list-store list-store)
146 (tree-iter tree-iter))
148 (defun list-store-append
149 (store &optional data (iter (make-instance 'tree-iter)))
150 (%list-store-append store iter)
151 (when data (%tree-model-set store iter data))
154 (defbinding list-store-clear () nil
155 (list-store list-store))
157 (defbinding list-store-reorder () nil
158 (list-store list-store)
159 (new-order (vector int)))
161 (defbinding list-store-swap () nil
162 (list-store list-store)
166 (defbinding list-store-move-before () nil
167 (list-store list-store)
169 (psoition (or null tree-iter)))
171 (defbinding list-store-move-after () nil
172 (list-store list-store)
174 (psoition tree-iter))
179 (defbinding %tree-path-free () nil
182 (defbinding %tree-path-get-indices () pointer
185 (defbinding %tree-path-get-depth () int
188 (defun %make-tree-path (path)
189 (let ((c-vector (make-c-vector 'int (length path) path))
190 (location (allocate-memory (+ (size-of 'int) (size-of 'pointer)))))
191 (funcall (writer-function 'int) (length path) location)
192 (funcall (writer-function 'pointer) c-vector location (size-of 'int))
195 (defun %tree-path-to-vector (location &optional (destroy-p t))
197 (map-c-vector 'vector #'identity (%tree-path-get-indices location)
198 'int (%tree-path-get-depth location))
200 (%tree-path-free location))))
202 (eval-when (:compile-toplevel :load-toplevel :execute)
203 (defmethod alien-type ((type (eql 'tree-path)) &rest args)
204 (declare (ignore type args))
205 (alien-type 'pointer))
207 (defmethod size-of ((type (eql 'tree-path)) &rest args)
208 (declare (ignore type args))
211 (defmethod to-alien-form (path (type (eql 'tree-path)) &rest args)
212 (declare (ignore type args))
213 `(%make-tree-path ,path))
215 (defmethod to-alien-function ((type (eql 'tree-path)) &rest args)
216 (declare (ignore type args))
219 (defmethod from-alien-form (location (type (eql 'tree-path)) &rest args)
220 (declare (ignore type args))
221 `(%tree-path-to-vector ,location))
223 (defmethod from-alien-function ((type (eql 'tree-path)) &rest args)
224 (declare (ignore type args))
225 #'%tree-path-to-vector)
227 (defmethod cleanup-form (location (type (eql 'tree-path)) &rest args)
228 (declare (ignore type args))
229 `(%tree-path-free ,location))
231 (defmethod cleanup-function ((type (eql 'tree-path)) &rest args)
232 (declare (ignore type args))
236 (defbinding %tree-row-reference-new () pointer
240 (defmethod initialize-instance ((reference tree-row-reference) &key model path)
241 (declare (ignore initargs))
243 (slot-value reference 'location)
244 (%tree-row-reference-new model path))
247 (defbinding tree-row-reference-get-path () tree-path
248 (reference tree-row-reference))
250 (defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
251 (reference tree-row-reference))
254 (defbinding tree-model-get-column-type () type-number
255 (tree-model tree-model)
258 (defbinding tree-model-get-iter
259 (model path &optional (iter (make-instance 'tree-iter))) boolean
261 (iter tree-iter :return)
264 (defbinding tree-model-get-path () tree-path
265 (tree-model tree-model)
268 (defbinding %tree-model-get-value () nil
269 (tree-model tree-model)
274 (defun tree-model-get-column-value (model iter column)
275 (let ((index (column-index model column)))
276 (with-gvalue (gvalue (tree-model-get-column-type model index))
277 (%tree-model-get-value model iter index gvalue))))
279 (defbinding tree-model-iter-next () boolean
280 (tree-model tree-model)
281 (iter tree-iter :return))
283 (defbinding tree-model-iter-children
284 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
285 (tree-model tree-model)
286 (iter tree-iter :return)
287 (parent (or null tree-iter)))
289 (defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child")
291 (tree-model tree-model)
294 (defbinding tree-model-iter-n-children () int
295 (tree-model tree-model)
298 (defbinding tree-model-iter-nth-child
299 (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
300 (tree-model tree-model)
301 (iter tree-iter :return)
302 (parent (or null tree-iter))
305 (defbinding tree-model-iter-parent
306 (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
307 (tree-model tree-model)
308 (iter tree-iter :return)
311 (defbinding tree-model-get-string-from-iter () string
312 (tree-model tree-model)
315 (def-callback-marshal %tree-model-foreach-func
316 (boolean tree-model tree-path tree-iter))
318 (defbinding %tree-model-foreach () nil
319 (tree-model tree-model)
320 ((callback %tree-model-foreach-func) pointer)
321 (callback-id unsigned-int))
323 (defun tree-model-foreach (model function)
324 (with-callback-function (id function)
325 (%tree-model-foreach model id)))
327 (defbinding tree-model-row-changed () nil
328 (tree-model tree-model)
332 (defbinding tree-model-row-inserted () nil
333 (tree-model tree-model)
337 (defbinding tree-model-row-has-child-toggled () nil
338 (tree-model tree-model)
342 (defbinding tree-model-row-deleted () nil
343 (tree-model tree-model)
347 (defbinding tree-model-rows-reordered () nil
348 (tree-model tree-model)
354 (defun column-types (model columns)
357 (find-type-number (first (mklist column))))
360 (defun column-index (model column)
364 (symbol (position column (object-data model 'column-names)))
365 (string (position column (object-data model 'column-names)
367 (error "~A has no column ~S" model column)))
369 (defun tree-model-column-value-setter (model column)
371 (object-data model 'column-setters)
373 (object-data model 'column-setters)
374 (make-array (tree-model-n-columns model)
375 :initial-element nil)))))
376 (let ((index (column-index model column)))
378 (svref setters index)
380 (svref setters index)
382 (mkbinding (column-setter-name model)
383 nil (type-of model) 'tree-iter 'int
384 (type-from-number (tree-model-get-column-type model index))
386 #'(lambda (value iter)
387 (funcall setter model iter index value -1))))))))
389 (defun tree-model-row-setter (model)
391 (object-data model 'row-setter)
393 ;; This will create any missing column setter
395 for i from 0 below (tree-model-n-columns model)
396 do (tree-model-column-value-setter model i))
397 (let ((setters (object-data model 'column-setters)))
399 (object-data model 'row-setter)
401 (map nil #'(lambda (value setter)
402 (funcall setter value iter))
405 (defun (setf tree-model-column-value) (value model iter column)
406 (funcall (tree-model-column-value-setter model column) value iter)
409 (defun (setf tree-model-row-data) (data model iter)
410 (funcall (tree-model-row-setter model) data iter)
413 (defun %tree-model-set (model iter data)
415 (vector (setf (tree-model-row-data model iter) data))
418 as (column value . rest) = data then rest
419 do (setf (tree-model-column-value model iter column) value)
425 (defbinding %tree-store-set-column-types () nil
426 (tree-store tree-store)
427 ((length columns) unsigned-int)
428 (columns (vector gtype)))
430 (defmethod initialize-instance ((tree-store tree-store) &key column-types
433 (%tree-store-set-column-types tree-store column-types)
435 (setf (object-data tree-store 'column-names) column-names)))
437 (defmethod column-setter-name ((tree-store tree-store))
438 (declare (ignore tree-store))
439 "gtk_tree_store_set")
441 (defbinding tree-store-remove () boolean
442 (tree-store tree-store)
443 (tree-iter tree-iter))
445 (defbinding %tree-store-insert () nil
446 (tree-store tree-store)
447 (tree-iter tree-iter)
448 (parent (or null tree-iter))
451 (defun tree-store-insert
452 (store parent position &optional data (iter (make-instance 'tree-iter)))
453 (%tree-store-insert store iter parent position)
454 (when data (%tree-model-set store iter data))
457 (defbinding %tree-store-insert-before () nil
458 (tree-store tree-store)
459 (tree-iter tree-iter)
460 (parent (or null tree-iter))
461 (sibling (or null tree-iter)))
463 (defun tree-store-insert-after
464 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
465 (%tree-store-insert-before store iter parent sibling)
466 (when data (%tree-model-set store iter data))
469 (defbinding %tree-store-insert-after () nil
470 (tree-store tree-store)
471 (tree-iter tree-iter)
472 (parent (or null tree-iter))
473 (sibling (or null tree-iter)))
475 (defun tree-store-insert-after
476 (store parent sibling &optional data (iter (make-instance 'tree-iter)))
477 (%tree-store-insert-after store iter parent sibling)
478 (when data (%tree-model-set store iter data))
481 (defbinding %tree-store-prepend () nil
482 (tree-store tree-store)
483 (tree-iter tree-iter)
484 (parent (or null tree-iter)))
486 (defun tree-store-prepend
487 (store parent &optional data (iter (make-instance 'tree-iter)))
488 (%tree-store-prepend store iter parent)
489 (when data (%tree-model-set store iter data))
492 (defbinding %tree-store-append () nil
493 (tree-store tree-store)
494 (tree-iter tree-iter)
495 (parent (or null tree-iter)))
497 (defun tree-store-append
498 (store parent &optional data (iter (make-instance 'tree-iter)))
499 (%tree-store-append store iter parent)
500 (when data (%tree-model-set store iter data))
503 (defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
504 (tree-store tree-store)
505 (tree-iter tree-iter)
506 (descendant tree-iter))
508 (defbinding tree-store-iter-depth () int
509 (tree-store tree-store)
510 (tree-iter tree-iter))
512 (defbinding tree-store-clear () nil
513 (tree-store tree-store))
515 (defbinding tree-store-reorder () nil
516 (tree-store tree-store)
518 (new-order (vector int)))
520 (defbinding tree-store-swap () nil
521 (tree-store tree-store)
525 (defbinding tree-store-move-before () nil
526 (tree-store tree-store)
528 (psoition (or null tree-iter)))
531 (defbinding tree-store-move-after () nil
532 (tree-store tree-store)
534 (psoition tree-iter))
540 (defmethod initialize-instance ((tree-view tree-view) &key column)
542 (mapc #'(lambda (column)
543 (tree-view-append-column tree-view column))
544 (get-all initargs :column)))
547 (defbinding tree-view-get-selection () tree-selection
548 (tree-view tree-view))
550 (defbinding tree-view-columns-autosize () nil
551 (tree-view tree-view))
553 (defbinding tree-view-append-column () int
554 (tree-view tree-view)
555 (tree-view-column tree-view-column))
557 (defbinding tree-view-remove-column () int
558 (tree-view tree-view)
559 (tree-view-column tree-view-column))
561 (defbinding tree-view-insert-column (view columnd position) int
563 (column tree-view-column)
564 ((if (eq position :end) -1 position) int))
566 (defbinding tree-view-get-column () tree-view-column
567 (tree-view tree-view)
570 (defbinding tree-view-move-column-after () nil
571 (tree-view tree-view)
572 (column tree-view-column)
573 (base-column (or null tree-view-column)))
575 ;;(defbinding tree-view-set-column drag-function ...)
577 (defbinding tree-view-scroll-to-point () nil
578 (tree-view tree-view)
582 (defbinding tree-view-scroll-to-cell () nil
583 (tree-view tree-view)
584 (path (or null tree-path))
585 (column (or null tree-view-column))
587 (row-align single-float)
588 (col-align single-float))
590 (defbinding tree-view-set-cursor () nil
591 (tree-view tree-view)
593 (focus-column tree-view-column)
594 (start-editing boolean))
596 (defbinding tree-view-set-cursor-on-cell () nil
597 (tree-view tree-view)
599 (focus-column (or null tree-view-column))
600 (focus-cell (or null cell-renderer))
601 (start-editing boolean))
603 (defbinding tree-view-get-cursor () nil
604 (tree-view tree-view)
605 (path tree-path :out )
606 (focus-column tree-view-column :out))
608 (defbinding tree-view-row-activated () nil
609 (tree-view tree-view)
611 (column tree-view-column))
613 (defbinding tree-view-expand-all () nil
614 (tree-view tree-view))
616 (defbinding tree-view-collapse-all () nil
617 (tree-view tree-view))
619 (defbinding tree-view-expand-to-path () nil
620 (tree-view tree-view)
623 (defbinding tree-view-expand-row () nil
624 (tree-view tree-view)
628 (defbinding tree-view-collapse-row () nil
629 (tree-view tree-view)
632 (def-callback-marshal %tree-view-mapping-func (nil tree-view tree-path))
634 (defbinding %tree-view-map-expanded-rows () nil
635 (tree-view tree-view)
636 ((callback %tree-view-mapping-func) pointer)
637 (callback-id unsigned-int))
639 (defun map-expanded-rows (function tree-view)
640 (with-callback-function (id function)
641 (%tree-view-map-expanded-rows tree-view id)))
643 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
644 (tree-view tree-view)
647 (defbinding tree-view-get-path-at-pos
648 (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
649 (tree-view tree-view)
652 (path tree-path :out)
653 (column tree-view-column :out)
657 (defbinding tree-view-get-cell-area () nil
658 (tree-view tree-view)
659 (path (or null tree-path))
660 (column (or null tree-view-column))
661 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
663 (defbinding tree-view-get-background-area () nil
664 (tree-view tree-view)
665 (path (or null tree-path))
666 (column (or null tree-view-column))
667 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
669 (defbinding tree-view-get-visible-rect () nil
670 (tree-view tree-view)
671 ((make-instance 'gdk:rectangle) gdk:rectangle :return))
673 ;; and many more functions which we'll add later