chiark / gitweb /
9b408f5f1c4abf6b17f7f91bca413f2e9d166a03
[clg] / gtk / gtktree.lisp
1 ;; Common Lisp bindings for GTK+ v2.x
2 ;; Copyright 2004-2005 Espen S. Johnsen <espen@users.sf.net>
3 ;;
4 ;; Permission is hereby granted, free of charge, to any person obtaining
5 ;; a copy of this software and associated documentation files (the
6 ;; "Software"), to deal in the Software without restriction, including
7 ;; without limitation the rights to use, copy, modify, merge, publish,
8 ;; distribute, sublicense, and/or sell copies of the Software, and to
9 ;; permit persons to whom the Software is furnished to do so, subject to
10 ;; the following conditions:
11 ;;
12 ;; The above copyright notice and this permission notice shall be
13 ;; included in all copies or substantial portions of the Software.
14 ;;
15 ;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 ;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 ;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 ;; IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 ;; CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23 ;; $Id: gtktree.lisp,v 1.13 2006-02-08 22:21:07 espen Exp $
24
25
26 (in-package "GTK")
27
28
29 ;;;; Cell Layout
30
31 (defbinding cell-layout-pack-start () nil
32   (cell-layout cell-layout)
33   (cell cell-renderer)
34   (expand boolean))
35
36 (defbinding cell-layout-pack-end () nil
37   (cell-layout cell-layout)
38   (cell cell-renderer)
39   (expand boolean))
40
41 (defun cell-layout-pack (layout cell &key end expand)
42   (if end
43       (cell-layout-pack-end layout cell expand)
44     (cell-layout-pack-start layout cell expand)))
45
46
47 (defbinding cell-layout-reorder () nil
48   (cell-layout cell-layout)
49   (cell cell-renderer)
50   (position int))
51
52 (defbinding cell-layout-clear () nil
53   (cell-layout cell-layout))
54
55 (defbinding cell-layout-add-attribute (cell-layout cell attribute column) nil
56   (cell-layout cell-layout)
57   (cell cell-renderer)
58   ((string-downcase attribute) string)
59   (column int))
60
61 (def-callback-marshal %cell-layout-data-func 
62     (nil cell-layout cell-renderer tree-model (copy-of tree-iter)))
63
64 (defbinding cell-layout-set-cell-data-func (cell-layout cell function) nil
65   (cell-layout cell-layout)
66   (cell cell-renderer)
67   (%cell-layout-data-func callback)
68   ((register-callback-function function) unsigned-int)
69   (user-data-destroy-func callback))
70
71 (defbinding cell-layout-clear-attributes () nil
72   (cell-layout cell-layout)
73   (cell cell-renderer))
74
75
76
77 ;;;; List Store
78
79 (defmethod initialize-instance ((list-store list-store) &key column-types
80                                 column-names initial-content)
81   (call-next-method)
82   (%list-store-set-column-types list-store column-types)
83   (when column-names
84     (setf (object-data list-store 'column-names) column-names))
85   (when initial-content
86     (loop
87      with iter = (make-instance 'tree-iter)
88      for row in initial-content
89      do (list-store-append list-store row iter))))
90
91
92 (defmethod column-setter-name ((list-store list-store))
93   (declare (ignore list-store))
94   "gtk_list_store_set")
95
96 (defbinding %list-store-set-column-types () nil
97   (list-store list-store)
98   ((length columns) unsigned-int)
99   (columns (vector gtype)))
100
101 (defbinding %list-store-remove () boolean
102   (list-store list-store)
103   (tree-iter tree-iter))
104
105 (defun list-store-remove (store row)
106   (etypecase row
107     (tree-iter 
108      (%list-store-remove store row))
109     (tree-path 
110      (multiple-value-bind (valid iter) (tree-model-get-iter store row)
111        (if valid
112            (%list-store-remove store iter)
113            (error "~A not poiniting to a valid iterator in ~A" row store))))
114     (tree-row-reference 
115      (let ((path (tree-row-reference-get-path row)))
116        (if path
117            (list-store-remove store path)
118          (error "~A not valid" row))))))
119
120
121 (defbinding %list-store-insert () nil
122   (list-store list-store)
123   (tree-iter tree-iter)
124   (position int))
125
126 (defun list-store-insert
127     (store position &optional data (iter (make-instance 'tree-iter)))
128   (%list-store-insert store iter position)
129   (when data (%tree-model-set store iter data))
130   iter)
131
132 (defbinding %list-store-insert-before () nil
133   (list-store list-store)
134   (tree-iter tree-iter)
135   (sibling (or null tree-iter)))
136
137 (defun list-store-insert-before
138     (store sibling &optional data (iter (make-instance 'tree-iter)))
139   (%list-store-insert-before store iter sibling)
140   (when data (%tree-model-set store iter data))
141   iter)
142
143 (defbinding %list-store-insert-after 
144     (list-store &optional sibling (tree-iter (make-instance 'tree-iter))) nil
145   (list-store list-store)
146   (tree-iter tree-iter)
147   (sibling (or null tree-iter)))
148
149 (defun list-store-insert-after
150     (store sibling &optional data (iter (make-instance 'tree-iter)))
151   (%list-store-insert-after store iter sibling)
152   (when data (%tree-model-set store iter data))
153   iter)
154
155 (defbinding %list-store-prepend () nil
156   (list-store list-store)
157   (tree-iter tree-iter))
158
159 (defun list-store-prepend 
160     (store &optional data (iter (make-instance 'tree-iter)))
161   (%list-store-prepend store iter)
162   (when data (%tree-model-set store iter data))
163   iter)
164
165 (defbinding %list-store-append () nil
166   (list-store list-store)
167   (tree-iter tree-iter))
168
169 (defun list-store-append 
170     (store &optional data (iter (make-instance 'tree-iter)))
171   (%list-store-append store iter)
172   (when data (%tree-model-set store iter data))
173   iter)
174
175 (defbinding list-store-clear () nil
176   (list-store list-store))
177
178 (defbinding list-store-reorder () nil
179   (list-store list-store)
180   (new-order (vector int)))
181
182 (defbinding list-store-swap () nil
183   (list-store list-store)
184   (a tree-iter)
185   (b tree-iter))
186
187 (defbinding list-store-move-before () nil
188   (list-store list-store)
189   (iter tree-iter)
190   (psoition (or null tree-iter)))
191
192 (defbinding list-store-move-after () nil
193   (list-store list-store)
194   (iter tree-iter)
195   (psoition tree-iter))
196
197
198 ;;; Tree Model
199
200 (defbinding %tree-path-free () nil
201   (location pointer))
202
203 (defbinding %tree-path-get-indices () pointer
204   (location pointer))
205
206 (defbinding %tree-path-get-depth () int
207   (location pointer))
208
209 (defun %make-tree-path (path)
210   (let ((c-vector (make-c-vector 'int (length path) path))
211         (location (allocate-memory (+ (size-of 'int) (size-of 'pointer)))))
212     (funcall (writer-function 'int) (length path) location)
213     (funcall (writer-function 'pointer) c-vector location (size-of 'int))
214     location))
215
216 (defun %tree-path-to-vector (location)
217   (let ((indices (%tree-path-get-indices location))
218         (depth (%tree-path-get-depth location)))
219     (if (null-pointer-p indices)
220         #()
221       (map-c-vector 'vector #'identity indices 'int depth))))
222
223 (eval-when (:compile-toplevel :load-toplevel :execute)
224   (defmethod alien-type ((type (eql 'tree-path)) &rest args)
225     (declare (ignore type args))
226     (alien-type 'pointer))
227   
228   (defmethod size-of ((type (eql 'tree-path)) &rest args)
229     (declare (ignore type args))
230     (size-of 'pointer))
231   
232   (defmethod to-alien-form (path (type (eql 'tree-path)) &rest args)
233     (declare (ignore type args))
234     `(%make-tree-path ,path))
235   
236   (defmethod from-alien-form (location (type (eql 'tree-path)) &rest args)
237     (declare (ignore type args))
238     `(let ((location ,location))
239        (prog1
240            (%tree-path-to-vector location)
241          (%tree-path-free location))))
242   
243   (defmethod copy-from-alien-form (location (type (eql 'tree-path)) &rest args)
244     (declare (ignore type args))
245     `(%tree-path-to-vector ,location))
246   
247   (defmethod cleanup-form (location (type (eql 'tree-path)) &rest args)
248     (declare (ignore type args))
249     `(%tree-path-free ,location)))
250
251 (defmethod to-alien-function ((type (eql 'tree-path)) &rest args)
252   (declare (ignore type args))
253   #'%make-tree-path)
254   
255 (defmethod from-alien-function ((type (eql 'tree-path)) &rest args)
256   (declare (ignore type args))
257   #'(lambda (location)
258       (prog1
259           (%tree-path-to-vector location)
260         (%tree-path-free location))))
261
262 (defmethod copy-from-alien-function ((type (eql 'tree-path)) &rest args)
263   (declare (ignore type args))
264   #'%tree-path-to-vector)
265   
266 (defmethod cleanup-function ((type (eql 'tree-path)) &rest args)
267   (declare (ignore type args))
268   #'%tree-path-free)
269
270 (defmethod writer-function ((type (eql 'tree-path)) &rest args)
271   (declare (ignore type args))
272   (let ((writer (writer-function 'pointer)))
273     #'(lambda (path location &optional (offset 0))
274         (funcall writer (%make-tree-path path) location offset))))
275
276 (defmethod reader-function ((type (eql 'tree-path)) &rest args)
277   (declare (ignore type args))
278   (let ((reader (reader-function 'pointer)))
279     #'(lambda (location &optional (offset 0) weak-p)
280         (declare (ignore weak-p))
281         (%tree-path-to-vector (funcall reader location offset)))))
282
283 (defmethod destroy-function ((type (eql 'tree-path)) &rest args)
284   (declare (ignore type args))
285   (let ((reader (reader-function 'pointer)))
286     #'(lambda (location &optional (offset 0))
287         (%tree-path-free (funcall reader location offset)))))
288
289
290 (defbinding %tree-row-reference-new () pointer
291   (model tree-model)
292   (path tree-path))
293
294 (defmethod initialize-instance ((reference tree-row-reference) &key model path)
295   (setf
296    (foreign-location reference)
297    (%tree-row-reference-new model path))
298   (call-next-method))
299
300 (defbinding tree-row-reference-get-path () tree-path
301   (reference tree-row-reference))
302
303 (defbinding (tree-row-reference-valid-p "gtk_tree_row_reference_valid") () boolean
304   (reference tree-row-reference))
305
306
307 (defbinding tree-model-get-column-type () gtype ;type-number
308   (tree-model tree-model)
309   (index int))
310
311 (defbinding tree-model-get-iter 
312     (model path &optional (iter (make-instance 'tree-iter))) boolean
313   (model tree-model)
314   (iter tree-iter :return)
315   (path tree-path))
316  
317 (defbinding tree-model-get-path () tree-path
318   (tree-model tree-model)
319   (iter tree-iter))
320
321 (defbinding %tree-model-get-value () nil
322   (tree-model tree-model)
323   (iter tree-iter)
324   (column int)
325   (gvalue gvalue))
326
327 (defun tree-model-value (model row column)
328   (let ((index (column-index model column))
329         (iter (etypecase row
330                 (tree-iter row)
331                 (tree-path (multiple-value-bind (valid iter)
332                                (tree-model-get-iter model row)
333                              (if valid
334                                  iter
335                                (error "Invalid tree path: ~A" row)))))))
336     (with-gvalue (gvalue)
337       (%tree-model-get-value model iter index gvalue))))
338
339 (defbinding tree-model-iter-next () boolean
340   (tree-model tree-model)
341   (iter tree-iter :return))
342
343 (defbinding tree-model-iter-children 
344     (tree-model parent &optional (iter (make-instance 'tree-iter))) boolean
345   (tree-model tree-model)
346   (iter tree-iter :return)
347   (parent (or null tree-iter)))
348
349 (defbinding (tree-model-iter-has-child-p "gtk_tree_model_iter_has_child") 
350     () boolean
351   (tree-model tree-model)
352   (iter tree-iter))
353
354 (defbinding tree-model-iter-n-children () int
355   (tree-model tree-model)
356   (iter tree-iter))
357
358 (defbinding tree-model-iter-nth-child
359     (tree-model parent n &optional (iter (make-instance 'tree-iter))) boolean
360   (tree-model tree-model)
361   (iter tree-iter :return)
362   (parent (or null tree-iter))
363   (n int))
364
365 (defbinding tree-model-iter-parent
366     (tree-model child &optional (iter (make-instance 'tree-iter))) boolean
367   (tree-model tree-model)
368   (iter tree-iter :return)
369   (child tree-iter))
370
371 (def-callback-marshal %tree-model-foreach-func 
372   (boolean tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
373
374 (defbinding %tree-model-foreach () nil
375   (tree-model tree-model)
376   ((progn %tree-model-foreach-func) callback)
377   (callback-id unsigned-int))
378
379 (defun tree-model-foreach (model function)
380   (with-callback-function (id function)
381     (%tree-model-foreach model id)))
382
383 (defbinding tree-model-row-changed () nil
384   (tree-model tree-model)
385   (path tree-path)
386   (iter tree-iter))
387
388 (defbinding tree-model-row-inserted () nil
389   (tree-model tree-model)
390   (path tree-path)
391   (iter tree-iter))
392
393 (defbinding tree-model-row-has-child-toggled () nil
394   (tree-model tree-model)
395   (path tree-path)
396   (iter tree-iter))
397
398 (defbinding tree-model-row-deleted () nil
399   (tree-model tree-model)
400   (path tree-path)
401   (iter tree-iter))
402
403 (defbinding tree-model-rows-reordered () nil
404   (tree-model tree-model)
405   (path tree-path)
406   (iter tree-iter)
407   (new-order int))
408
409
410 (defun column-types (model columns)
411   (map 'vector 
412        #'(lambda (column)
413            (find-type-number (first (mklist column))))
414        columns))
415                
416 (defun column-index (model column)
417   (or
418    (etypecase column
419      (number column)
420      (symbol (position column (object-data model 'column-names)))
421      (string (position column (object-data model 'column-names)
422                    :test #'string=)))
423    (error "~A has no column ~S" model column)))
424
425 (defun column-name (model index)
426   (svref (object-data model 'column-names) index))
427
428 (defun tree-model-column-value-setter (model column)
429   (let ((setters (or
430                   (object-data model 'column-setters)
431                   (setf 
432                    (object-data model 'column-setters)
433                    (make-array (tree-model-n-columns model) 
434                     :initial-element nil)))))
435     (let ((index (column-index model column)))
436     (or
437      (svref setters index)
438      (setf 
439       (svref setters index)
440       (let ((setter 
441              (mkbinding (column-setter-name model)
442               nil (type-of model) 'tree-iter 'int
443 ;             (type-from-number (tree-model-get-column-type model index))
444               (tree-model-get-column-type model index)
445               'int)))
446         #'(lambda (value iter)
447             (funcall setter model iter index value -1))))))))
448
449 (defun tree-model-row-setter (model)
450   (or 
451    (object-data model 'row-setter)
452    (progn
453      ;; This will create any missing column setter
454      (loop 
455       for i from 0 below (tree-model-n-columns model)
456       do (tree-model-column-value-setter model i))
457      (let ((setters (object-data model 'column-setters)))
458        (setf    
459         (object-data model 'row-setter)
460         #'(lambda (row iter)
461             (map nil #'(lambda (value setter)
462                          (funcall setter value iter))
463                  row setters)))))))
464
465 (defun (setf tree-model-value) (value model row column)
466   (let ((iter (etypecase row
467                 (tree-iter row)
468                 (tree-path (multiple-value-bind (valid iter)
469                                (tree-model-get-iter model row)
470                              (if valid
471                                  iter
472                                (error "Invalid tree path: ~A" row)))))))
473     (funcall (tree-model-column-value-setter model column) value iter)
474     value))
475
476 (defun (setf tree-model-row-data) (data model iter)
477   (funcall (tree-model-row-setter model) data iter)
478   data)
479
480 (defun %tree-model-set (model iter data)
481   (etypecase data
482     (vector (setf (tree-model-row-data model iter) data))
483     (cons 
484      (loop
485       as (column value . rest) = data then rest
486       do (setf (tree-model-value model iter column) value)
487       while rest))))
488
489
490 ;;; Tree Selection
491
492 (def-callback-marshal %tree-selection-func (boolean tree-selection tree-model (path (copy-of tree-path)) (path-currently-selected boolean)))
493
494 (defbinding tree-selection-set-select-function (selection function) nil
495   (selection tree-selection)
496   (%tree-selection-func callback)
497   ((register-callback-function function) unsigned-int)
498   (user-data-destroy-func callback))
499
500 (defbinding tree-selection-get-selected 
501     (selection &optional (iter (make-instance 'tree-iter))) boolean
502   (selection tree-selection)
503   (nil null) 
504   (iter tree-iter :return))
505
506 (def-callback-marshal %tree-selection-foreach-func (nil tree-model (path (copy-of tree-path)) (iter (copy-of tree-iter))))
507
508 (defbinding %tree-selection-selected-foreach () nil
509   (tree-selection tree-selection)
510   ((progn %tree-selection-foreach-func) callback)
511   (callback-id unsigned-int))
512
513 (defun tree-selection-selected-foreach (selection function)
514   (with-callback-function (id function)
515     (%tree-selection-selected-foreach selection id)))
516
517 (defbinding tree-selection-get-selected-rows () (glist tree-path)
518   (tree-selection tree-selection)
519   (nil null))
520
521 (defbinding tree-selection-count-selected-rows () int
522   (tree-selection tree-selection))
523
524 (defbinding %tree-selection-select-path () nil
525   (tree-selection tree-selection)
526   (tree-path tree-path))
527
528 (defbinding %tree-selection-unselect-path () nil
529   (tree-selection tree-selection)
530   (tree-path tree-path))
531
532 (defbinding %tree-selection-path-is-selected () boolean
533   (tree-selection tree-selection)
534   (tree-path tree-path))
535
536 (defbinding %tree-selection-select-iter () nil
537   (tree-selection tree-selection)
538   (tree-path tree-path))
539
540 (defbinding %tree-selection-unselect-iter () nil
541   (tree-selection tree-selection)
542   (tree-path tree-path))
543
544 (defbinding %tree-selection-iter-is-selected () boolean
545   (tree-selection tree-selection)
546   (tree-path tree-path))
547
548 (defun tree-selection-select (selection row)
549   (etypecase row
550     (tree-path (%tree-selection-select-path selection row))
551     (tree-iter (%tree-selection-select-iter selection row))))
552
553 (defun tree-selection-unselect (selection row)
554   (etypecase row
555     (tree-path (%tree-selection-unselect-path selection row))
556     (tree-iter (%tree-selection-unselect-iter selection row))))
557
558 (defun tree-selection-is-selected-p (selection row)
559   (etypecase row
560     (tree-path (%tree-selection-path-is-selected selection row))
561     (tree-iter (%tree-selection-iter-is-selected selection row))))
562
563 (defbinding tree-selection-select-all () nil
564   (tree-selection tree-selection))
565
566 (defbinding tree-selection-unselect-all () nil
567   (tree-selection tree-selection))
568
569 (defbinding tree-selection-select-range () nil
570   (tree-selection tree-selection)
571   (start tree-path)
572   (end tree-path))
573
574 (defbinding tree-selection-unselect-range () nil
575   (tree-selection tree-selection)
576   (start tree-path)
577   (end tree-path))
578
579
580 ;;; Tree Sortable
581
582 (eval-when (:compile-toplevel :load-toplevel :execute)
583   (define-enum-type sort-column (:default -1) (:unsorted -2))
584   (define-enum-type sort-order (:before -1) (:equal 0) (:after 1)))
585
586
587 (def-callback-marshal %tree-iter-compare-func 
588   ((or int sort-order) tree-model (a (copy-of tree-iter)) (b (copy-of tree-iter))))
589
590 (defbinding tree-sortable-sort-column-changed () nil
591   (sortable tree-sortable))
592
593 (defbinding %tree-sortable-get-sort-column-id () boolean
594   (sortable tree-sortable)
595   (column int :out)
596   (order sort-type :out))
597
598 (defun tree-sortable-get-sort-column (sortable)
599   (multiple-value-bind (special-p column order) 
600       (%tree-sortable-get-sort-column-id sortable)
601     (values
602      (if special-p
603          (int-to-sort-order column)
604        (column-name sortable column))
605      order)))
606
607 (defbinding (tree-sortable-set-sort-column 
608              "gtk_tree_sortable_set_sort_column_id") 
609     (sortable column order) nil
610   (sortable tree-sortable)
611   ((etypecase column
612      ((or integer sort-column) column)
613      (symbol (column-index sortable column))) 
614    (or sort-column int))
615   (order sort-type))
616
617 (defbinding %tree-sortable-set-sort-func (sortable column function) nil
618   (sortable tree-sortable)
619   ((column-index sortable column) int)
620   (%tree-iter-compare-func callback)
621   ((register-callback-function function) unsigned-int)
622   (user-data-destroy-func callback))
623
624 (defbinding %tree-sortable-set-default-sort-func () nil
625   (sortable tree-sortable)
626   (compare-func (or null pointer))
627   (callback-id unsigned-int)
628   (destroy-func (or null pointer)))
629
630 (defun tree-sortable-set-sort-func (sortable column function)
631   "Sets the comparison function used when sorting to be FUNCTION. If
632 the current sort column of SORTABLE is the same as COLUMN,
633 then the model will sort using this function."
634   (cond
635    ((and (eq column :default) (not function))
636     (%tree-sortable-set-default-sort-func sortable nil 0 nil))
637    ((eq column :default) 
638     (%tree-sortable-set-default-sort-func sortable 
639      (callback %tree-iter-compare-func)
640      (register-callback-function function)
641      (callback user-data-destroy-func)))
642    ((%tree-sortable-set-sort-func sortable column function))))
643
644 (defbinding tree-sortable-has-default-sort-func-p () boolean
645   (sortable tree-sortable))
646
647
648 ;;; Tree Store
649
650 (defbinding %tree-store-set-column-types () nil
651   (tree-store tree-store)
652   ((length columns) unsigned-int)
653   (columns (vector gtype)))
654
655 (defmethod initialize-instance ((tree-store tree-store) &key column-types
656                                 column-names)
657   (call-next-method)
658   (%tree-store-set-column-types tree-store column-types)
659   (when column-names
660     (setf (object-data tree-store 'column-names) column-names)))
661
662 (defmethod column-setter-name ((tree-store tree-store))
663   (declare (ignore tree-store))
664   "gtk_tree_store_set")
665
666 (defbinding tree-store-remove () boolean
667   (tree-store tree-store)
668   (tree-iter tree-iter))
669
670 (defbinding %tree-store-insert () nil
671   (tree-store tree-store)
672   (tree-iter tree-iter)
673   (parent (or null tree-iter))
674   (position int))
675
676 (defun tree-store-insert 
677     (store parent position &optional data (iter (make-instance 'tree-iter)))
678   (%tree-store-insert store iter parent position)
679   (when data (%tree-model-set store iter data))
680   iter)
681
682 (defbinding %tree-store-insert-before () nil
683   (tree-store tree-store)
684   (tree-iter tree-iter)
685   (parent (or null tree-iter))
686   (sibling (or null tree-iter)))
687
688 (defun tree-store-insert-before 
689     (store parent sibling &optional data (iter (make-instance 'tree-iter)))
690   (%tree-store-insert-before store iter parent sibling)
691   (when data (%tree-model-set store iter data))
692   iter)
693
694 (defbinding %tree-store-insert-after () nil
695   (tree-store tree-store)
696   (tree-iter tree-iter)
697   (parent (or null tree-iter))
698   (sibling (or null tree-iter)))
699
700 (defun tree-store-insert-after 
701     (store parent sibling &optional data (iter (make-instance 'tree-iter)))
702   (%tree-store-insert-after store iter parent sibling)
703   (when data (%tree-model-set store iter data))
704   iter)
705
706 (defbinding %tree-store-prepend () nil
707   (tree-store tree-store)
708   (tree-iter tree-iter)
709   (parent (or null tree-iter)))
710
711 (defun tree-store-prepend 
712     (store parent &optional data (iter (make-instance 'tree-iter)))
713   (%tree-store-prepend store iter parent)
714   (when data (%tree-model-set store iter data))
715   iter)
716
717 (defbinding %tree-store-append () nil
718   (tree-store tree-store)
719   (tree-iter tree-iter)
720   (parent (or null tree-iter)))
721
722 (defun tree-store-append 
723     (store parent &optional data (iter (make-instance 'tree-iter)))
724   (%tree-store-append store iter parent)
725   (when data (%tree-model-set store iter data))
726   iter)
727
728 (defbinding (tree-store-is-ancestor-p "gtk_tree_store_is_ancestor") () boolean
729   (tree-store tree-store)
730   (tree-iter tree-iter)
731   (descendant tree-iter))
732
733 (defbinding tree-store-iter-depth () int
734   (tree-store tree-store)
735   (tree-iter tree-iter))
736
737 (defbinding tree-store-clear () nil
738   (tree-store tree-store))
739
740 (defbinding tree-store-reorder () nil
741   (tree-store tree-store)
742   (parent tree-iter)
743   (new-order (vector int)))
744
745 (defbinding tree-store-swap () nil
746   (tree-store tree-store)
747   (a tree-iter)
748   (b tree-iter))
749
750 (defbinding tree-store-move-before () nil
751   (tree-store tree-store)
752   (iter tree-iter)
753   (psoition (or null tree-iter)))
754
755
756 (defbinding tree-store-move-after () nil
757   (tree-store tree-store)
758   (iter tree-iter)
759   (psoition tree-iter))
760
761
762
763 ;;; Tree View
764
765 (defmethod initialize-instance ((tree-view tree-view) &rest initargs 
766                                 &key column)
767   (call-next-method)
768   (mapc #'(lambda (column)
769             (tree-view-append-column tree-view column))
770         (get-all initargs :column)))
771
772
773 (defbinding tree-view-columns-autosize () nil
774   (tree-view tree-view))
775
776 (defbinding tree-view-append-column () int
777   (tree-view tree-view)
778   (tree-view-column tree-view-column))
779
780 (defbinding tree-view-remove-column () int
781   (tree-view tree-view)
782   (tree-view-column tree-view-column))
783
784 (defbinding tree-view-insert-column (view column position) int
785   (view tree-view)
786   (column tree-view-column)
787   ((if (eq position :end) -1 position) int))
788
789 (defbinding tree-view-get-column () tree-view-column
790   (tree-view tree-view)
791   (position int))
792
793 (defbinding tree-view-move-column-after () nil
794   (tree-view tree-view)
795   (column tree-view-column)
796   (base-column (or null tree-view-column)))
797
798 ;;(defbinding tree-view-set-column drag-function ...)
799
800 (defbinding tree-view-scroll-to-point () nil
801   (tree-view tree-view)
802   (tree-x int)
803   (tree-y int))
804
805 (defbinding tree-view-scroll-to-cell () nil
806   (tree-view tree-view)
807   (path (or null tree-path))
808   (column (or null tree-view-column))
809   (use-align boolean)
810   (row-align single-float)
811   (col-align single-float))
812
813 (defbinding tree-view-set-cursor () nil
814   (tree-view tree-view)
815   (path tree-path)
816   (focus-column tree-view-column)
817   (start-editing boolean))
818
819 (defbinding tree-view-set-cursor-on-cell () nil
820   (tree-view tree-view)
821   (path tree-path)
822   (focus-column (or null tree-view-column))
823   (focus-cell (or null cell-renderer))
824   (start-editing boolean))
825
826 (defbinding tree-view-get-cursor () nil
827   (tree-view tree-view)
828   (path tree-path :out )
829   (focus-column tree-view-column :out))
830
831 (defbinding tree-view-row-activated () nil
832   (tree-view tree-view)
833   (path tree-path )
834   (column tree-view-column))
835
836 (defbinding tree-view-expand-all () nil
837   (tree-view tree-view))
838
839 (defbinding tree-view-collapse-all () nil
840   (tree-view tree-view))
841
842 (defbinding tree-view-expand-to-path () nil
843   (tree-view tree-view)
844   (path tree-path))
845
846 (defbinding tree-view-expand-row () nil
847   (tree-view tree-view)
848   (path tree-path)
849   (open-all boolean))
850
851 (defbinding tree-view-collapse-row () nil
852   (tree-view tree-view)
853   (path tree-path))
854
855 (def-callback-marshal %tree-view-mapping-func (nil tree-view (path (copy-of tree-path))))
856
857 (defbinding %tree-view-map-expanded-rows () nil
858   (tree-view tree-view)
859   ((progn %tree-view-mapping-func) callback)
860   (callback-id unsigned-int))
861
862 (defun map-expanded-rows (function tree-view)
863   (with-callback-function (id function)
864     (%tree-view-map-expanded-rows tree-view id)))
865
866 (defbinding (tree-view-row-expanded-p "gtk_tree_view_row_expanded") () boolean
867   (tree-view tree-view)
868   (path tree-path))
869
870 (defbinding tree-view-get-path-at-pos 
871     (tree-view x y &optional (cell-x 0) (cell-y 0)) boolean
872   (tree-view tree-view)
873   (x int)
874   (y int)
875   (path tree-path :out)
876   (column tree-view-column :out)
877   (cell-x int)
878   (cell-y int))
879
880 (defbinding tree-view-get-cell-area () nil
881   (tree-view tree-view)
882   (path (or null tree-path))
883   (column (or null tree-view-column))
884   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
885
886 (defbinding tree-view-get-background-area () nil
887   (tree-view tree-view)
888   (path (or null tree-path))
889   (column (or null tree-view-column))
890   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
891
892 (defbinding tree-view-get-visible-rect () nil
893   (tree-view tree-view)
894   ((make-instance 'gdk:rectangle) gdk:rectangle :return))
895
896 ;; and many more functions which we'll add later
897
898
899 ;;;; Icon View
900
901 #+gtk2.6
902 (progn
903   (defbinding icon-view-get-path-at-pos () tree-path
904     (icon-view icon-view)
905     (x int) (y int))
906
907   (def-callback-marshal %icon-view-foreach-func 
908     (nil icon-view (path (copy-of tree-path))))
909
910   (defbinding %icon-view-selected-foreach () tree-path
911     (icon-view icon-view)
912     ((progn %icon-view-foreach-func) callback)
913     (callback-id unsigned-int))
914   
915   (defun icon-view-foreach (icon-view function)
916     (with-callback-function (id function)
917       (%icon-view-selected-foreach icon-view id)))
918
919   (defbinding icon-view-select-path () nil
920     (icon-view icon-view)
921     (path tree-path))
922
923   (defbinding icon-view-unselect-path () nil
924     (icon-view icon-view)
925     (path tree-path))
926
927   (defbinding icon-view-path-is-selected-p () boolean
928     (icon-view icon-view)
929     (path tree-path))
930
931   (defbinding icon-view-get-selected-items () (glist tree-path)
932     (icon-view icon-view))
933
934   (defbinding icon-view-select-all () nil
935     (icon-view icon-view))
936
937   (defbinding icon-view-unselect-all () nil
938     (icon-view icon-view))
939   
940   (defbinding icon-view-item-activated () nil
941     (icon-view icon-view)
942     (path tree-path))
943
944   (defbinding %icon-view-set-text-column (column icon-view) nil
945     (icon-view icon-view)
946     ((if (integerp column) 
947          column 
948        (column-index (icon-view-model icon-view) column)) int))
949
950   (defbinding %icon-view-set-markup-column (column icon-view) nil
951     (icon-view icon-view)
952     ((if (integerp column) 
953          column 
954        (column-index (icon-view-model icon-view) column)) int))
955
956   (defbinding %icon-view-set-pixbuf-column (column icon-view) nil
957     (icon-view icon-view)
958     ((if (integerp column) 
959          column 
960        (column-index (icon-view-model icon-view) column)) int)))
961
962 #+gtk2.8
963 (progn
964   (defbinding icon-view-get-item-at-pos () boolean
965     (icon-view icon-view)
966     (x int)
967     (y int)
968     (tree-path tree-path :out)
969     (cell cell-renderer :out))
970
971   (defbinding icon-view-set-cursor (icon-view path &key cell start-editing) nil
972     (icon-view icon-view)
973     (path tree-path)
974     (cell (or null cell-renderer))
975     (start-editing boolean))
976   
977   (defbinding icon-view-get-cursor () boolean
978     (icon-view icon-view)
979     (path tree-path :out)
980     (cell cell-renderer :out))
981
982   (defbinding icon-view-get-dest-item-at-pos () boolean
983     (icon-view icon-view)
984     (drag-x int)
985     (drag-y int)
986     (tree-path tree-path :out)
987     (pos drop-position :out))
988
989   (defbinding icon-view-create-drag-icon () gdk:pixmap
990     (icon-view icon-view)
991     (tree-path tree-path))
992
993   (defbinding icon-view-scroll-to-path (icon-view tree-path &key row-align column-align) nil
994     (icon-view icon-view)
995     (tree-path tree-path)
996     ((or row-align column-align) boolean)
997     (row-align single-float)
998     (column-align single-float))
999
1000   (defbinding icon-view-get-visible-range () boolean
1001     (icon-view icon-view)
1002     (start-path tree-path :out)
1003     (end-path tree-path :out))
1004
1005 ;;   (defbinding icon-view-enable-model-drag-source () nil
1006 ;;     (icon-view icon-view)
1007 ;;     (start-button-mask gdk:modifier-type)
1008 ;;     (targets (vector target-entry))
1009 ;;     ((length targets) unsigned-int)
1010 ;;     (actions gdk:drag-action))
1011
1012 ;;   (defbinding icon-view-enable-model-drag-dest () nil
1013 ;;     (icon-view icon-view)
1014 ;;     (targets (vector target-entry))
1015 ;;     ((length targets) unsigned-int)
1016 ;;     (actions gdk:drag-action))
1017
1018   (defbinding icon-view-unset-model-drag-source () nil
1019     (icon-view icon-view))
1020
1021   (defbinding icon-view-unset-model-drag-dest () nil
1022     (icon-view icon-view)))