chiark / gitweb /
Updated to reflect current state
[clg] / gtk / gtktree.lisp
1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 1999-2005 Espen S. Johnsen <espen@users.sf.net>
3 ;;
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.
8 ;;
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.
13 ;;
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
17
18 ;; $Id: gtktree.lisp,v 1.7 2005-02-27 19:56:06 espen Exp $
19
20
21 (in-package "GTK")
22
23
24 ;;;; Cell Layout
25
26 (defbinding cell-layout-pack-start () nil
27   (cell-layout cell-layout)
28   (cell cell-renderer)
29   (expand boolean))
30
31 (defbinding cell-layout-pack-end () nil
32   (cell-layout cell-layout)
33   (cell cell-renderer)
34   (expand boolean))
35
36 (defun cell-layout-pack (layout cell &key end expand)
37   (if end
38       (cell-layout-pack-end layout cell expand)
39     (cell-layout-pack-start layout cell expand)))
40
41
42 (defbinding cell-layout-reorder () nil
43   (cell-layout cell-layout)
44   (cell cell-renderer)
45   (position int))
46
47 (defbinding cell-layout-clear () nil
48   (cell-layout cell-layout))
49
50 (defbinding cell-layout-add-attribute 
51     (cell-layout cell attribute column &optional model) nil
52   (cell-layout cell-layout)
53   (cell cell-renderer)
54   ((string-downcase attribute) string)
55   ((if model (column-index model column) column) int))
56
57 (def-callback-marshal %cell-layout-data-func 
58     (nil cell-layout cell-renderer tree-model (copy-of tree-iter)))
59
60 (defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
61   (cell-layout cell-layout)
62   (cell cell-renderer)
63   ((callback %cell-layout-data-func) pointer)
64   ((register-callback-function function) unsigned-int)
65   ((callback user-data-destroy-func) pointer))
66
67 (defbinding cell-layout-clear-attributes () nil
68   (cell-layout cell-layout)
69   (cell cell-renderer))
70
71
72
73 ;;;; List Store
74
75 (defmethod initialize-instance ((list-store list-store) &key column-types
76                                 column-names initial-content)
77   (call-next-method)
78   (%list-store-set-column-types list-store column-types)
79   (when column-names
80     (setf (object-data list-store 'column-names) column-names))
81   (when initial-content
82     (loop
83      with iter = (make-instance 'tree-iter)
84      for row in initial-content
85      do (list-store-append list-store row iter))))
86
87
88 (defmethod column-setter-name ((list-store list-store))
89   (declare (ignore list-store))
90   "gtk_list_store_set")
91
92 (defbinding %list-store-set-column-types () nil
93   (list-store list-store)
94   ((length columns) unsigned-int)
95   (columns (vector gtype)))
96
97 (defbinding %list-store-remove () boolean
98   (list-store list-store)
99   (tree-iter tree-iter))
100
101 (defun list-store-remove (store row)
102   (etypecase row
103     (tree-iter 
104      (%list-store-remove store row))
105     (tree-path 
106      (multiple-value-bind (valid iter) (tree-model-get-iter store row)
107        (if valid
108            (%list-store-remove store iter)
109            (error "~A not poiniting to av valid iterator in ~A" row store))))
110     (tree-row-reference 
111      (let ((path (tree-row-reference-get-path row)))
112        (if path
113            (list-store-remove store path)
114          (error "~A not valid" row))))))
115
116
117 (defbinding %list-store-insert () nil
118   (list-store list-store)
119   (tree-iter tree-iter)
120   (position int))
121
122 (defun list-store-insert
123     (store position &optional data (iter (make-instance 'tree-iter)))
124   (%list-store-insert store iter position)
125   (when data (%tree-model-set store iter data))
126   iter)
127
128 (defbinding %list-store-insert-before () nil
129   (list-store list-store)
130   (tree-iter tree-iter)
131   (sibling (or null tree-iter)))
132
133 (defun list-store-insert-before
134     (store sibling &optional data (iter (make-instance 'tree-iter)))
135   (%list-store-insert-before store iter sibling)
136   (when data (%tree-model-set store iter data))
137   iter)
138
139 (defbinding %list-store-insert-after 
140     (list-store &optional sibling (tree-iter (make-instance 'tree-iter))) nil
141   (list-store list-store)
142   (tree-iter tree-iter)
143   (sibling (or null tree-iter)))
144
145 (defun list-store-insert-after
146     (store sibling &optional data (iter (make-instance 'tree-iter)))
147   (%list-store-insert-after store iter sibling)
148   (when data (%tree-model-set store iter data))
149   iter)
150
151 (defbinding %list-store-prepend () nil
152   (list-store list-store)
153   (tree-iter tree-iter))
154
155 (defun list-store-prepend 
156     (store &optional data (iter (make-instance 'tree-iter)))
157   (%list-store-prepend store iter)
158   (when data (%tree-model-set store iter data))
159   iter)
160
161 (defbinding %list-store-append () nil
162   (list-store list-store)
163   (tree-iter tree-iter))
164
165 (defun list-store-append 
166     (store &optional data (iter (make-instance 'tree-iter)))
167   (%list-store-append store iter)
168   (when data (%tree-model-set store iter data))
169   iter)
170
171 (defbinding list-store-clear () nil
172   (list-store list-store))
173
174 (defbinding list-store-reorder () nil
175   (list-store list-store)
176   (new-order (vector int)))
177
178 (defbinding list-store-swap () nil
179   (list-store list-store)
180   (a tree-iter)
181   (b tree-iter))
182
183 (defbinding list-store-move-before () nil
184   (list-store list-store)
185   (iter tree-iter)
186   (psoition (or null tree-iter)))
187
188 (defbinding list-store-move-after () nil
189   (list-store list-store)
190   (iter tree-iter)
191   (psoition tree-iter))
192
193
194 ;;; Tree Model
195
196 (defbinding %tree-path-free () nil
197   (location pointer))
198
199 (defbinding %tree-path-get-indices () pointer
200   (location pointer))
201
202 (defbinding %tree-path-get-depth () int
203   (location pointer))
204
205 (defun %make-tree-path (path)
206   (let ((c-vector (make-c-vector 'int (length path) path))
207         (location (allocate-memory (+ (size-of 'int) (size-of 'pointer)))))
208     (funcall (writer-function 'int) (length path) location)
209     (funcall (writer-function 'pointer) c-vector location (size-of 'int))
210     location))
211
212 (defun %tree-path-to-vector (location)
213   (let ((indices (%tree-path-get-indices location))
214         (depth (%tree-path-get-depth location)))
215     (if (null-pointer-p indices)
216         #()
217       (map-c-vector 'vector #'identity indices 'int depth))))
218
219 (eval-when (:compile-toplevel :load-toplevel :execute)
220   (defmethod alien-type ((type (eql 'tree-path)) &rest args)
221     (declare (ignore type args))
222     (alien-type 'pointer))
223   
224   (defmethod size-of ((type (eql 'tree-path)) &rest args)
225     (declare (ignore type args))
226     (size-of 'pointer))
227   
228   (defmethod to-alien-form (path (type (eql 'tree-path)) &rest args)
229     (declare (ignore type args))
230     `(%make-tree-path ,path))
231   
232   (defmethod from-alien-form (location (type (eql 'tree-path)) &rest args)
233     (declare (ignore type args))
234     `(let ((location ,location))
235        (prog1
236            (%tree-path-to-vector location)
237          (%tree-path-free location))))
238   
239   (defmethod copy-from-alien-form (location (type (eql 'tree-path)) &rest args)
240     (declare (ignore type args))
241     `(%tree-path-to-vector ,location))
242   
243   (defmethod cleanup-form (location (type (eql 'tree-path)) &rest args)
244     (declare (ignore type args))
245     `(%tree-path-free ,location)))
246
247 (defmethod to-alien-function ((type (eql 'tree-path)) &rest args)
248   (declare (ignore type args))
249   #'%make-tree-path)
250   
251 (defmethod from-alien-function ((type (eql 'tree-path)) &rest args)
252   (declare (ignore type args))
253   #'(lambda (location)
254       (prog1
255           (%tree-path-to-vector location)
256         (%tree-path-free location))))
257
258 (defmethod copy-from-alien-function ((type (eql 'tree-path)) &rest args)
259   (declare (ignore type args))
260   #'%tree-path-to-vector)
261   
262 (defmethod cleanup-function ((type (eql 'tree-path)) &rest args)
263   (declare (ignore type args))
264   #'%tree-path-free)
265
266 (defmethod writer-function ((type (eql 'tree-path)) &rest args)
267   (declare (ignore type args))
268   (let ((writer (writer-function 'pointer)))
269     #'(lambda (path location &optional (offset 0))
270         (funcall writer (%make-tree-path path) location offset))))
271
272 (defmethod reader-function ((type (eql 'tree-path)) &rest args)
273   (declare (ignore type args))
274   (let ((reader (reader-function 'pointer)))
275     #'(lambda (location &optional (offset 0))
276         (%tree-path-to-vector (funcall reader location offset)))))
277
278
279 (defbinding %tree-row-reference-new () pointer
280   (model tree-model)
281   (path tree-path))
282
283 (defmethod initialize-instance ((reference tree-row-reference) &key model path)
284   (setf
285    (slot-value reference 'location)
286    (%tree-row-reference-new model path))
287   (call-next-method))
288
289 (defbinding tree-row-reference-get-path () tree-path
290   (reference tree-row-reference))
291
292 (defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
293   (reference tree-row-reference))
294
295
296 (defbinding tree-model-get-column-type () gtype ;type-number
297   (tree-model tree-model)
298   (index int))
299
300 (defbinding tree-model-get-iter 
301     (model path &optional (iter (make-instance 'tree-iter))) boolean
302   (model tree-model)
303   (iter tree-iter :return)
304   (path tree-path))
305  
306 (defbinding tree-model-get-path () tree-path
307   (tree-model tree-model)
308   (iter tree-iter))
309
310 (defbinding %tree-model-get-value () nil
311   (tree-model tree-model)
312   (iter tree-iter)
313   (column int)
314   (gvalue gvalue))
315
316 (defun tree-model-column-value (model iter column)
317   (let ((index (column-index model column)))
318     (with-gvalue (gvalue)
319       (%tree-model-get-value model iter index gvalue))))
320
321 (defbinding tree-model-iter-next () boolean
322   (tree-model tree-model)
323   (iter tree-iter :return))
324
325 (defbinding tree-model-iter-children 
326     (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
327   (tree-model tree-model)
328   (iter tree-iter :return)
329   (parent (or null tree-iter)))
330
331 (defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child") 
332     () boolean
333   (tree-model tree-model)
334   (iter tree-iter))
335
336 (defbinding tree-model-iter-n-children () int
337   (tree-model tree-model)
338   (iter tree-iter))
339
340 (defbinding tree-model-iter-nth-child
341     (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
342   (tree-model tree-model)
343   (iter tree-iter :return)
344   (parent (or null tree-iter))
345   (n int))
346
347 (defbinding tree-model-iter-parent
348     (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
349   (tree-model tree-model)
350   (iter tree-iter :return)
351   (child tree-iter))
352
353 (def-callback-marshal %tree-model-foreach-func 
354   (boolean tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
355
356 (defbinding %tree-model-foreach () nil
357   (tree-model tree-model)
358   ((callback %tree-model-foreach-func) pointer)
359   (callback-id unsigned-int))
360
361 (defun tree-model-foreach (model function)
362   (with-callback-function (id function)
363     (%tree-model-foreach model id)))
364
365 (defbinding tree-model-row-changed () nil
366   (tree-model tree-model)
367   (path tree-path)
368   (iter tree-iter))
369
370 (defbinding tree-model-row-inserted () nil
371   (tree-model tree-model)
372   (path tree-path)
373   (iter tree-iter))
374
375 (defbinding tree-model-row-has-child-toggled () nil
376   (tree-model tree-model)
377   (path tree-path)
378   (iter tree-iter))
379
380 (defbinding tree-model-row-deleted () nil
381   (tree-model tree-model)
382   (path tree-path)
383   (iter tree-iter))
384
385 (defbinding tree-model-rows-reordered () nil
386   (tree-model tree-model)
387   (path tree-path)
388   (iter tree-iter)
389   (new-order int))
390
391
392 (defun column-types (model columns)
393   (map 'vector 
394        #'(lambda (column)
395            (find-type-number (first (mklist column))))
396        columns))
397                
398 (defun column-index (model column)
399   (or
400    (etypecase column
401      (number column)
402      (symbol (position column (object-data model 'column-names)))
403      (string (position column (object-data model 'column-names)
404                    :test #'string=)))
405    (error "~A has no column ~S" model column)))
406
407 (defun tree-model-column-value-setter (model column)
408   (let ((setters (or
409                   (object-data model 'column-setters)
410                   (setf 
411                    (object-data model 'column-setters)
412                    (make-array (tree-model-n-columns model) 
413                     :initial-element nil)))))
414     (let ((index (column-index model column)))
415     (or
416      (svref setters index)
417      (setf 
418       (svref setters index)
419       (let ((setter 
420              (mkbinding (column-setter-name model)
421               nil (type-of model) 'tree-iter 'int
422 ;             (type-from-number (tree-model-get-column-type model index))
423               (tree-model-get-column-type model index)
424               'int)))
425         #'(lambda (value iter)
426             (funcall setter model iter index value -1))))))))
427
428 (defun tree-model-row-setter (model)
429   (or 
430    (object-data model 'row-setter)
431    (progn
432      ;; This will create any missing column setter
433      (loop 
434       for i from 0 below (tree-model-n-columns model)
435       do (tree-model-column-value-setter model i))
436      (let ((setters (object-data model 'column-setters)))
437        (setf    
438         (object-data model 'row-setter)
439         #'(lambda (row iter)
440             (map nil #'(lambda (value setter)
441                          (funcall setter value iter))
442                  row setters)))))))
443
444 (defun (setf tree-model-column-value) (value model iter column)
445   (funcall (tree-model-column-value-setter model column) value iter)
446   value)
447
448 (defun (setf tree-model-row-data) (data model iter)
449   (funcall (tree-model-row-setter model) data iter)
450   data)
451
452 (defun %tree-model-set (model iter data)
453   (etypecase data
454     (vector (setf (tree-model-row-data model iter) data))
455     (cons 
456      (loop
457       as (column value . rest) = data then rest
458       do (setf (tree-model-column-value model iter column) value)
459       while rest))))
460
461
462 ;;; Tree Selection
463
464 (def-callback-marshal %tree-selection-func (boolean tree-selection tree-model (path (copy-of tree-path)) (path-currently-selected boolean)))
465
466 (defbinding tree-selection-set-select-function (selection function) nil
467   (selection tree-selection)
468   ((callback %tree-selection-func) pointer)
469   ((register-callback-function function) unsigned-int)
470   ((callback user-data-destroy-func) pointer))
471
472 (defbinding tree-selection-get-selected 
473     (selection &optional (iter (make-instance 'tree-iter))) boolean
474   (selection tree-selection)
475   (nil null) 
476   (iter tree-iter :return))
477
478 (def-callback-marshal %tree-selection-foreach-func (nil tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
479
480 (defbinding %tree-selection-selected-foreach () nil
481   (tree-selection tree-selection)
482   ((callback %tree-selection-foreach-func) pointer)
483   (callback-id unsigned-int))
484
485 (defun tree-selection-selected-foreach (selection function)
486   (with-callback-function (id function)
487     (%tree-selection-selected-foreach selection id)))
488
489 (defbinding tree-selection-get-selected-rows () (glist tree-path)
490   (tree-selection tree-selection)
491   (nil null))
492
493 (defbinding tree-selection-count-selected-rows () int
494   (tree-selection tree-selection))
495
496 (defbinding %tree-selection-select-path () nil
497   (tree-selection tree-selection)
498   (tree-path tree-path))
499
500 (defbinding %tree-selection-unselect-path () nil
501   (tree-selection tree-selection)
502   (tree-path tree-path))
503
504 (defbinding %tree-selection-path-is-selected () boolean
505   (tree-selection tree-selection)
506   (tree-path tree-path))
507
508 (defbinding %tree-selection-select-iter () nil
509   (tree-selection tree-selection)
510   (tree-path tree-path))
511
512 (defbinding %tree-selection-unselect-iter () nil
513   (tree-selection tree-selection)
514   (tree-path tree-path))
515
516 (defbinding %tree-selection-iter-is-selected () boolean
517   (tree-selection tree-selection)
518   (tree-path tree-path))
519
520 (defun tree-selection-select (selection row)
521   (etypecase row
522     (tree-path (%tree-selection-select-path selection row))
523     (tree-iter (%tree-selection-select-iter selection row))))
524
525 (defun tree-selection-unselect (selection row)
526   (etypecase row
527     (tree-path (%tree-selection-unselect-path selection row))
528     (tree-iter (%tree-selection-unselect-iter selection row))))
529
530 (defun tree-selection-is-selected-p (selection row)
531   (etypecase row
532     (tree-path (%tree-selection-path-is-selected selection row))
533     (tree-iter (%tree-selection-iter-is-selected selection row))))
534
535 (defbinding tree-selection-select-all () nil
536   (tree-selection tree-selection))
537
538 (defbinding tree-selection-unselect-all () nil
539   (tree-selection tree-selection))
540
541 (defbinding tree-selection-select-range () nil
542   (tree-selection tree-selection)
543   (start tree-path)
544   (end tree-path))
545
546 (defbinding tree-selection-unselect-range () nil
547   (tree-selection tree-selection)
548   (start tree-path)
549   (end tree-path))
550
551
552
553 ;;; Tree Store
554
555 (defbinding %tree-store-set-column-types () nil
556   (tree-store tree-store)
557   ((length columns) unsigned-int)
558   (columns (vector gtype)))
559
560 (defmethod initialize-instance ((tree-store tree-store) &key column-types
561                                 column-names)
562   (call-next-method)
563   (%tree-store-set-column-types tree-store column-types)
564   (when column-names
565     (setf (object-data tree-store 'column-names) column-names)))
566
567 (defmethod column-setter-name ((tree-store tree-store))
568   (declare (ignore tree-store))
569   "gtk_tree_store_set")
570
571 (defbinding tree-store-remove () boolean
572   (tree-store tree-store)
573   (tree-iter tree-iter))
574
575 (defbinding %tree-store-insert () nil
576   (tree-store tree-store)
577   (tree-iter tree-iter)
578   (parent (or null tree-iter))
579   (position int))
580
581 (defun tree-store-insert 
582     (store parent position &optional data (iter (make-instance 'tree-iter)))
583   (%tree-store-insert store iter parent position)
584   (when data (%tree-model-set store iter data))
585   iter)
586
587 (defbinding %tree-store-insert-before () nil
588   (tree-store tree-store)
589   (tree-iter tree-iter)
590   (parent (or null tree-iter))
591   (sibling (or null tree-iter)))
592
593 (defun tree-store-insert-before 
594     (store parent sibling &optional data (iter (make-instance 'tree-iter)))
595   (%tree-store-insert-before store iter parent sibling)
596   (when data (%tree-model-set store iter data))
597   iter)
598
599 (defbinding %tree-store-insert-after () nil
600   (tree-store tree-store)
601   (tree-iter tree-iter)
602   (parent (or null tree-iter))
603   (sibling (or null tree-iter)))
604
605 (defun tree-store-insert-after 
606     (store parent sibling &optional data (iter (make-instance 'tree-iter)))
607   (%tree-store-insert-after store iter parent sibling)
608   (when data (%tree-model-set store iter data))
609   iter)
610
611 (defbinding %tree-store-prepend () nil
612   (tree-store tree-store)
613   (tree-iter tree-iter)
614   (parent (or null tree-iter)))
615
616 (defun tree-store-prepend 
617     (store parent &optional data (iter (make-instance 'tree-iter)))
618   (%tree-store-prepend store iter parent)
619   (when data (%tree-model-set store iter data))
620   iter)
621
622 (defbinding %tree-store-append () nil
623   (tree-store tree-store)
624   (tree-iter tree-iter)
625   (parent (or null tree-iter)))
626
627 (defun tree-store-append 
628     (store parent &optional data (iter (make-instance 'tree-iter)))
629   (%tree-store-append store iter parent)
630   (when data (%tree-model-set store iter data))
631   iter)
632
633 (defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
634   (tree-store tree-store)
635   (tree-iter tree-iter)
636   (descendant tree-iter))
637
638 (defbinding tree-store-iter-depth () int
639   (tree-store tree-store)
640   (tree-iter tree-iter))
641
642 (defbinding tree-store-clear () nil
643   (tree-store tree-store))
644
645 (defbinding tree-store-reorder () nil
646   (tree-store tree-store)
647   (parent tree-iter)
648   (new-order (vector int)))
649
650 (defbinding tree-store-swap () nil
651   (tree-store tree-store)
652   (a tree-iter)
653   (b tree-iter))
654
655 (defbinding tree-store-move-before () nil
656   (tree-store tree-store)
657   (iter tree-iter)
658   (psoition (or null tree-iter)))
659
660
661 (defbinding tree-store-move-after () nil
662   (tree-store tree-store)
663   (iter tree-iter)
664   (psoition tree-iter))
665
666
667
668 ;;; Tree View
669
670 (defmethod initialize-instance ((tree-view tree-view) &rest initargs 
671                                 &key column)
672   (call-next-method)
673   (mapc #'(lambda (column)
674             (tree-view-append-column tree-view column))
675         (get-all initargs :column)))
676
677
678 (defbinding tree-view-columns-autosize () nil
679   (tree-view tree-view))
680
681 (defbinding tree-view-append-column () int
682   (tree-view tree-view)
683   (tree-view-column tree-view-column))
684
685 (defbinding tree-view-remove-column () int
686   (tree-view tree-view)
687   (tree-view-column tree-view-column))
688
689 (defbinding tree-view-insert-column (view column position) int
690   (view tree-view)
691   (column tree-view-column)
692   ((if (eq position :end) -1 position) int))
693
694 (defbinding tree-view-get-column () tree-view-column
695   (tree-view tree-view)
696   (position int))
697
698 (defbinding tree-view-move-column-after () nil
699   (tree-view tree-view)
700   (column tree-view-column)
701   (base-column (or null tree-view-column)))
702
703 ;;(defbinding tree-view-set-column drag-function ...)
704
705 (defbinding tree-view-scroll-to-point () nil
706   (tree-view tree-view)
707   (tree-x int)
708   (tree-y int))
709
710 (defbinding tree-view-scroll-to-cell () nil
711   (tree-view tree-view)
712   (path (or null tree-path))
713   (column (or null tree-view-column))
714   (use-align boolean)
715   (row-align single-float)
716   (col-align single-float))
717
718 (defbinding tree-view-set-cursor () nil
719   (tree-view tree-view)
720   (path tree-path)
721   (focus-column tree-view-column)
722   (start-editing boolean))
723
724 (defbinding tree-view-set-cursor-on-cell () nil
725   (tree-view tree-view)
726   (path tree-path)
727   (focus-column (or null tree-view-column))
728   (focus-cell (or null cell-renderer))
729   (start-editing boolean))
730
731 (defbinding tree-view-get-cursor () nil
732   (tree-view tree-view)
733   (path tree-path :out )
734   (focus-column tree-view-column :out))
735
736 (defbinding tree-view-row-activated () nil
737   (tree-view tree-view)
738   (path tree-path )
739   (column tree-view-column))
740
741 (defbinding tree-view-expand-all () nil
742   (tree-view tree-view))
743
744 (defbinding tree-view-collapse-all () nil
745   (tree-view tree-view))
746
747 (defbinding tree-view-expand-to-path () nil
748   (tree-view tree-view)
749   (path tree-path))
750
751 (defbinding tree-view-expand-row () nil
752   (tree-view tree-view)
753   (path tree-path)
754   (open-all boolean))
755
756 (defbinding tree-view-collapse-row () nil
757   (tree-view tree-view)
758   (path tree-path))
759
760 (def-callback-marshal %tree-view-mapping-func (nil tree-view (path (copy-of tree-path))))
761
762 (defbinding %tree-view-map-expanded-rows () nil
763   (tree-view tree-view)
764   ((callback %tree-view-mapping-func) pointer)
765   (callback-id unsigned-int))
766
767 (defun map-expanded-rows (function tree-view)
768   (with-callback-function (id function)
769     (%tree-view-map-expanded-rows tree-view id)))
770
771 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
772   (tree-view tree-view)
773   (path tree-path))
774
775 (defbinding tree-view-get-path-at-pos 
776     (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
777   (tree-view tree-view)
778   (x int)
779   (y int)
780   (path tree-path :out)
781   (column tree-view-column :out)
782   (cell-x int)
783   (cell-y int))
784
785 (defbinding tree-view-get-cell-area () nil
786   (tree-view tree-view)
787   (path (or null tree-path))
788   (column (or null tree-view-column))
789   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
790
791 (defbinding tree-view-get-background-area () nil
792   (tree-view tree-view)
793   (path (or null tree-path))
794   (column (or null tree-view-column))
795   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
796
797 (defbinding tree-view-get-visible-rect () nil
798   (tree-view tree-view)
799   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
800
801 ;; and many more functions which we'll add later
802
803
804 ;;; Tree View Column
805