1 /* Directory tree browser for the Midnight Commander
2 Copyright (C) 1994, 1995, 1996, 1997 The Free Software Foundation
4 Written: 1994, 1996 Janne Kukonlehto
6 1996, 1999 Miguel de Icaza
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 This module has been converted to be a widget.
24 The program load and saves the tree each time the tree widget is
25 created and destroyed. This is required for the future vfs layer,
26 it will be possible to have tree views over virtual file systems.
43 #include "file.h" /* For copy_dir_dir(), move_dir_dir(), erase_dir() */
44 #include "fileopctx.h"
46 #include "key.h" /* For mi_getch() */
49 #include "../vfs/vfs.h"
51 extern int command_prompt
;
53 #define TREE_NORMALC HOT_FOCUSC
55 /* Specifies the display mode: 1d or 2d */
56 int tree_navigation_flag
;
59 static int tree_callback (Dlg_head
*h
, WTree
*tree
, int msg
, int par
);
60 #define tcallback (callback_fn) tree_callback
64 static tree_entry
*back_ptr (tree_entry
*ptr
, int *count
)
68 while (ptr
&& ptr
->prev
&& i
< *count
){
76 static tree_entry
*forw_ptr (tree_entry
*ptr
, int *count
)
80 while (ptr
&& ptr
->next
&& i
< *count
){
88 /* Add a directory to the list of directories */
89 tree_entry
*tree_add_entry (WTree
*tree
, char *name
)
94 return tree_store_add_entry (name
);
98 /* Append a directory to the list of directories */
99 static tree_entry
*tree_append_entry (WTree
*tree
, char *name
)
101 tree_entry
*current
, *new;
105 /* We assume the directory is not yet in the list */
107 new = g_new (tree_entry
, 1);
108 if (!tree
->store
->tree_first
){
110 tree
->store
->tree_first
= new;
113 tree
->tree_last
->next
= new;
114 new->prev
= tree
->tree_last
;
117 tree
->store
->tree_last
= new;
119 /* Calculate attributes */
120 new->name
= g_strdup (name
);
121 len
= strlen (new->name
);
123 for (i
= 0; i
< len
; i
++)
124 if (new->name
[i
] == PATH_SEP
){
126 new->subname
= new->name
+ i
+ 1;
128 submask
= 1 << new->sublevel
;
129 submask
&= (2 << new->sublevel
) - 1;
130 new->submask
= submask
;
133 /* Correct the submasks of the previous entries */
135 while (current
&& current
->sublevel
> new->sublevel
){
136 current
->submask
|= 1 << new->sublevel
;
137 current
= current
->prev
;
140 /* The entry has now been appended */
146 remove_callback (tree_entry
*entry
, void *data
)
150 if (tree
->selected_ptr
== entry
){
151 if (tree
->selected_ptr
->next
)
152 tree
->selected_ptr
= tree
->selected_ptr
->next
;
154 tree
->selected_ptr
= tree
->selected_ptr
->prev
;
158 void tree_remove_entry (WTree
*tree
, char *name
)
160 tree_store_remove_entry (name
);
163 void tree_destroy (WTree
*tree
)
165 tree_store_remove_entry_remove_hook (remove_callback
);
168 if (tree
->tree_shown
){
169 g_free (tree
->tree_shown
);
170 tree
->tree_shown
= 0;
172 tree
->selected_ptr
= NULL
;
175 /* Loads the .mc.tree file */
176 void load_tree (WTree
*tree
)
180 tree
->selected_ptr
= tree
->store
->tree_first
;
181 tree_chdir (tree
, home_dir
);
184 /* Save the .mc.tree file */
185 void save_tree (WTree
*tree
)
189 error
= tree_store_save ();
192 fprintf (stderr
, _("Can't open the %s file for writing:\n%s\n"), MC_TREE
,
193 unix_error_string (error
));
198 static void tree_show_mini_info (WTree
*tree
, int tree_lines
, int tree_cols
)
200 Dlg_head
*h
= tree
->widget
.parent
;
211 widget_move (&tree
->widget
, line
, 1);
212 hline (' ', tree_cols
);
213 widget_move (&tree
->widget
, line
, 1);
215 if (tree
->searching
){
216 /* Show search string */
217 attrset (TREE_NORMALC
);
221 addstr (name_trunc (tree
->search_buffer
, tree_cols
-2));
225 /* Show full name of selected directory */
226 addstr (name_trunc (tree
->selected_ptr
->name
, tree_cols
));
230 void show_tree (WTree
*tree
)
232 Dlg_head
*h
= tree
->widget
.parent
;
234 int i
, j
, topsublevel
;
236 int tree_lines
, tree_cols
;
240 tree_lines
= tlines (tree
);
241 tree_cols
= tree
->widget
.cols
;
243 attrset (TREE_NORMALC
);
244 widget_move ((Widget
*)tree
, y
, x
);
250 if (tree
->tree_shown
)
251 g_free (tree
->tree_shown
);
252 tree
->tree_shown
= g_new (tree_entry
*, tree_lines
);
254 for (i
= 0; i
< tree_lines
; i
++)
255 tree
->tree_shown
[i
] = NULL
;
256 if (tree
->store
->tree_first
)
257 topsublevel
= tree
->store
->tree_first
->sublevel
;
260 if (!tree
->selected_ptr
){
261 tree
->selected_ptr
= tree
->store
->tree_first
;
264 current
= tree
->selected_ptr
;
266 /* Calculate the directory which is to be shown on the topmost line */
267 if (tree_navigation_flag
){
269 while (current
->prev
&& i
< tree
->topdiff
){
270 current
= current
->prev
;
271 if (current
->sublevel
< tree
->selected_ptr
->sublevel
){
272 if (strncmp (current
->name
, tree
->selected_ptr
->name
,
273 strlen (current
->name
)) == 0)
275 } else if (current
->sublevel
== tree
->selected_ptr
->sublevel
){
276 for (j
= strlen (current
->name
) - 1; current
->name
[j
] != PATH_SEP
; j
--);
277 if (strncmp (current
->name
, tree
->selected_ptr
->name
, j
) == 0)
279 } else if (current
->sublevel
== tree
->selected_ptr
->sublevel
+ 1
280 && strlen (tree
->selected_ptr
->name
) > 1){
281 if (strncmp (current
->name
, tree
->selected_ptr
->name
,
282 strlen (tree
->selected_ptr
->name
)) == 0)
288 current
= back_ptr (current
, &tree
->topdiff
);
290 /* Loop for every line */
291 for (i
= 0; i
< tree_lines
; i
++){
292 /* Move to the beginning of the line */
293 widget_move (&tree
->widget
, y
+i
, x
);
295 hline (' ', tree_cols
);
296 widget_move (&tree
->widget
, y
+i
, x
);
301 tree
->tree_shown
[i
] = current
;
302 if (current
->sublevel
== topsublevel
){
304 /* Top level directory */
305 if (tree
->active
&& current
== tree
->selected_ptr
) {
306 if (!use_colors
&& !tree
->is_panel
)
307 attrset (MARKED_COLOR
);
309 attrset (SELECTED_COLOR
);
313 addstr (name_trunc (current
->name
, tree_cols
- 6));
315 /* Sub level directory */
318 /* Output branch parts */
319 for (j
= 0; j
< current
->sublevel
- topsublevel
- 1; j
++){
320 if (tree_cols
- 8 - 3 * j
< 9)
323 if (current
->submask
& (1 << (j
+ topsublevel
+ 1)))
330 if (!current
->next
|| !(current
->next
->submask
& (1 << current
->sublevel
)))
331 addch (ACS_LLCORNER
);
337 if (tree
->active
&& current
== tree
->selected_ptr
) {
338 /* Selected directory -> change color */
339 if (!use_colors
&& !tree
->is_panel
)
340 attrset (MARKED_COLOR
);
342 attrset (SELECTED_COLOR
);
347 addstr (name_trunc (current
->subname
,
348 tree_cols
- 2 - 4 - 3 * j
));
352 /* Return to normal color */
353 attrset (TREE_NORMALC
);
355 /* Calculate the next value for current */
356 if (tree_navigation_flag
){
357 current
= current
->next
;
359 if (current
->sublevel
< tree
->selected_ptr
->sublevel
){
360 if (strncmp (current
->name
, tree
->selected_ptr
->name
,
361 strlen (current
->name
)) == 0)
363 } else if (current
->sublevel
== tree
->selected_ptr
->sublevel
){
364 for (j
= strlen (current
->name
) - 1; current
->name
[j
] != PATH_SEP
; j
--);
365 if (strncmp (current
->name
,tree
->selected_ptr
->name
,j
)== 0)
367 } else if (current
->sublevel
== tree
->selected_ptr
->sublevel
+1
368 && strlen (tree
->selected_ptr
->name
) > 1){
369 if (strncmp (current
->name
, tree
->selected_ptr
->name
,
370 strlen (tree
->selected_ptr
->name
)) == 0)
373 current
= current
->next
;
376 current
= current
->next
;
378 tree_show_mini_info (tree
, tree_lines
, tree_cols
);
381 static void check_focus (WTree
*tree
)
383 if (tree
->topdiff
< 3)
385 else if (tree
->topdiff
>= tlines (tree
) - 3)
386 tree
->topdiff
= tlines (tree
) - 3 - 1;
389 void tree_move_backward (WTree
*tree
, int i
)
394 if (tree_navigation_flag
){
395 current
= tree
->selected_ptr
;
396 while (j
< i
&& current
->prev
397 && current
->prev
->sublevel
>= tree
->selected_ptr
->sublevel
){
398 current
= current
->prev
;
399 if (current
->sublevel
== tree
->selected_ptr
->sublevel
){
400 tree
->selected_ptr
= current
;
406 tree
->selected_ptr
= back_ptr (tree
->selected_ptr
, &i
);
411 void tree_move_forward (WTree
*tree
, int i
)
416 if (tree_navigation_flag
){
417 current
= tree
->selected_ptr
;
418 while (j
< i
&& current
->next
419 && current
->next
->sublevel
>= tree
->selected_ptr
->sublevel
){
420 current
= current
->next
;
421 if (current
->sublevel
== tree
->selected_ptr
->sublevel
){
422 tree
->selected_ptr
= current
;
428 tree
->selected_ptr
= forw_ptr (tree
->selected_ptr
, &i
);
433 void tree_move_to_child (WTree
*tree
)
437 /* Do we have a starting point? */
438 if (!tree
->selected_ptr
)
440 /* Take the next entry */
441 current
= tree
->selected_ptr
->next
;
442 /* Is it the child of the selected entry */
443 if (current
&& current
->sublevel
> tree
->selected_ptr
->sublevel
){
444 /* Yes -> select this entry */
445 tree
->selected_ptr
= current
;
449 /* No -> rescan and try again */
450 tree_rescan_cmd (tree
);
451 current
= tree
->selected_ptr
->next
;
452 if (current
&& current
->sublevel
> tree
->selected_ptr
->sublevel
){
453 tree
->selected_ptr
= current
;
460 int tree_move_to_parent (WTree
*tree
)
465 if (!tree
->selected_ptr
)
467 old
= tree
->selected_ptr
;
468 current
= tree
->selected_ptr
->prev
;
469 while (current
&& current
->sublevel
>= tree
->selected_ptr
->sublevel
){
470 current
= current
->prev
;
474 current
= tree
->store
->tree_first
;
475 tree
->selected_ptr
= current
;
477 return tree
->selected_ptr
!= old
;
480 void tree_move_to_top (WTree
*tree
)
482 tree
->selected_ptr
= tree
->store
->tree_first
;
486 void tree_move_to_bottom (WTree
*tree
)
488 tree
->selected_ptr
= tree
->store
->tree_last
;
489 tree
->topdiff
= tlines (tree
) - 3 - 1;
492 void tree_chdir (WTree
*tree
, char *dir
)
496 current
= tree_store_whereis (dir
);
498 tree
->selected_ptr
= current
;
504 sync_tree (char *path
)
506 tree_chdir (the_tree
, path
);
509 /* Handle mouse click */
510 void tree_event (WTree
*tree
, int y
)
512 if (tree
->tree_shown
[y
]){
513 tree
->selected_ptr
= tree
->tree_shown
[y
];
519 static void chdir_sel (WTree
*tree
);
521 static void maybe_chdir (WTree
*tree
)
523 if (!(xtree_mode
&& tree
->is_panel
))
530 static int event_callback (Gpm_Event
*event
, WTree
*tree
)
532 if (!(event
->type
& GPM_UP
))
544 tree_move_backward (tree
, tlines (tree
) - 1);
547 else if (event
->y
>= tlines (tree
)){
548 tree_move_forward (tree
, tlines (tree
) - 1);
551 tree_event (tree
, event
->y
);
552 if ((event
->type
& (GPM_UP
|GPM_DOUBLE
)) == (GPM_UP
|GPM_DOUBLE
)){
559 /* Search tree for text */
560 int search_tree (WTree
*tree
, char *text
)
568 current
= tree
->selected_ptr
;
570 while (!wrapped
|| current
!= tree
->selected_ptr
){
571 if (strncmp (current
->subname
, text
, len
) == 0){
572 tree
->selected_ptr
= current
;
576 current
= current
->next
;
578 current
= tree
->store
->tree_first
;
587 static void tree_do_search (WTree
*tree
, int key
)
591 l
= strlen (tree
->search_buffer
);
592 if (l
&& (key
== 8 || key
== 0177 || key
== KEY_BACKSPACE
))
593 tree
->search_buffer
[--l
] = 0;
595 if (key
&& l
< sizeof (tree
->search_buffer
)){
596 tree
->search_buffer
[l
] = key
;
597 tree
->search_buffer
[l
+1] = 0;
602 if (!search_tree (tree
, tree
->search_buffer
))
603 tree
->search_buffer
[--l
] = 0;
609 void tree_rescan_cmd (WTree
*tree
)
611 char old_dir
[MC_MAXPATHLEN
];
613 if (!tree
->selected_ptr
|| !mc_get_current_wd (old_dir
, MC_MAXPATHLEN
) ||
614 mc_chdir (tree
->selected_ptr
->name
))
617 tree_store_rescan (tree
->selected_ptr
->name
);
621 int tree_forget_cmd (WTree
*tree
)
623 if (tree
->selected_ptr
)
624 tree_remove_entry (tree
, tree
->selected_ptr
->name
);
628 void tree_copy (WTree
*tree
, char *default_dest
)
635 if (!tree
->selected_ptr
)
637 g_snprintf (cmd_buf
, sizeof(cmd_buf
), _("Copy \"%s\" directory to:"),
638 name_trunc (tree
->selected_ptr
->name
, 50));
639 dest
= input_expand_dialog (_(" Copy "), cmd_buf
, default_dest
);
640 if (!dest
|| !*dest
){
644 ctx
= file_op_context_new ();
645 file_op_context_create_ui (ctx
, OP_COPY
, FALSE
);
646 copy_dir_dir (ctx
, tree
->selected_ptr
->name
, dest
, 1, 0, 0, 0, &count
, &bytes
);
647 file_op_context_destroy (ctx
);
652 static void tree_help_cmd (void)
654 char *hlpfile
= concat_dir_and_file (mc_home
, _("mc.hlp"));
655 interactive_display (hlpfile
, "[Directory Tree]");
659 static int tree_copy_cmd (WTree
*tree
)
661 tree_copy (tree
, "");
665 void tree_move (WTree
*tree
, char *default_dest
)
673 if (!tree
->selected_ptr
)
675 g_snprintf (cmd_buf
, sizeof (cmd_buf
), _("Move \"%s\" directory to:"),
676 name_trunc (tree
->selected_ptr
->name
, 50));
677 dest
= input_expand_dialog (_(" Move "), cmd_buf
, default_dest
);
678 if (!dest
|| !*dest
){
681 if (stat (dest
, &buf
)){
682 message (1, _(" Error "), _(" Can't stat the destination \n %s "),
683 unix_error_string (errno
));
687 if (!S_ISDIR (buf
.st_mode
)){
688 message (1, _(" Error "), _(" The destination isn't a directory "));
693 ctx
= file_op_context_new ();
694 file_op_context_create_ui (ctx
, OP_MOVE
, FALSE
);
695 move_dir_dir (ctx
, tree
->selected_ptr
->name
, dest
, &count
, &bytes
);
696 file_op_context_destroy (ctx
);
702 tree_move_cmd (WTree
*tree
)
704 tree_move (tree
, "");
710 tree_mkdir_cmd (WTree
*tree
)
712 char old_dir
[MC_MAXPATHLEN
];
714 if (!tree
->selected_ptr
)
716 if (!mc_get_current_wd (old_dir
, MC_MAXPATHLEN
))
718 if (chdir (tree
->selected_ptr
->name
))
723 tree_rescan_cmd (tree
);
730 tree_rmdir_cmd (WTree
*tree
)
732 char old_dir
[MC_MAXPATHLEN
];
737 if (tree
->selected_ptr
){
738 if (!mc_get_current_wd (old_dir
, MC_MAXPATHLEN
))
740 if (mc_chdir (PATH_SEP_STR
))
746 buf
= g_strdup_printf (_(" Delete %s? "), tree
->selected_ptr
->name
);
747 result
= query_dialog (_(" Delete "), buf
, 3, 2, _("&Yes"), _("&No"));
754 ctx
= file_op_context_new ();
755 file_op_context_create_ui (ctx
, OP_DELETE
, FALSE
);
756 if (erase_dir (ctx
, tree
->selected_ptr
->name
, &count
, &bytes
) == FILE_CONT
)
757 tree_forget_cmd (tree
);
758 file_op_context_destroy (ctx
);
765 static void set_navig_label (Dlg_head
*h
);
768 tree_toggle_navig (Dlg_head
*h
)
770 tree_navigation_flag
= 1 - tree_navigation_flag
;
775 set_navig_label (Dlg_head
*h
)
777 define_label_data (h
, (Widget
*)tree
,
778 4, tree_navigation_flag
? _("Static") : _("Dynamc"),
779 (void (*)(void *))tree_toggle_navig
, h
);
783 move_down (WTree
*tree
)
785 tree_move_forward (tree
, 1);
791 move_up (WTree
*tree
)
793 tree_move_backward (tree
, 1);
799 move_home (WTree
*tree
)
801 tree_move_to_top (tree
);
807 move_end (WTree
*tree
)
809 tree_move_to_bottom (tree
);
815 move_left (WTree
*tree
)
819 if (tree_navigation_flag
){
820 v
= tree_move_to_parent (tree
);
829 move_right (WTree
*tree
)
831 if (tree_navigation_flag
){
832 tree_move_to_child (tree
);
841 move_prevp (WTree
*tree
)
843 tree_move_backward (tree
, tlines (tree
) - 1);
849 move_nextp (WTree
*tree
)
851 tree_move_forward (tree
, tlines (tree
) - 1);
857 chdir_sel (WTree
*tree
)
859 if (!tree
->is_panel
){
864 if (do_cd (tree
->selected_ptr
->name
, cd_exact
)){
865 paint_panel (cpanel
);
866 select_item (cpanel
);
868 message (1, MSG_ERROR
, _(" Can't chdir to \"%s\" \n %s "),
869 tree
->selected_ptr
->name
, unix_error_string (errno
));
877 tree_start_search (WTree
*tree
)
881 if (tree
->searching
){
883 if (tree
->selected_ptr
== tree
->store
->tree_last
)
884 tree_move_to_top(tree
);
886 /* set navigation mode temporarily to 'Static' because in
887 * dynamic navigation mode tree_move_forward will not move
888 * to a lower sublevel if necessary (sequent searches must
889 * start with the directory followed the last found directory)
891 i
= tree_navigation_flag
;
892 tree_navigation_flag
= 0;
893 tree_move_forward (tree
, 1);
894 tree_navigation_flag
= i
;
896 tree_do_search (tree
, 0);
900 tree
->search_buffer
[0] = 0;
904 static key_map tree_keymap
[] = {
905 { XCTRL('n'), move_down
},
906 { XCTRL('p'), move_up
},
907 { KEY_DOWN
, move_down
},
910 { KEY_ENTER
, chdir_sel
},
911 { KEY_HOME
, move_home
},
912 { KEY_C1
, move_end
},
913 { KEY_END
, move_end
},
914 { KEY_A1
, move_home
},
915 { KEY_NPAGE
, move_nextp
},
916 { KEY_PPAGE
, move_prevp
},
917 { XCTRL('v'), move_nextp
},
918 { ALT('v'), move_prevp
},
919 { XCTRL('p'), move_up
},
920 { XCTRL('p'), move_down
},
921 { XCTRL('s'), tree_start_search
},
922 { ALT('s'), tree_start_search
},
923 { XCTRL('r'), tree_rescan_cmd
},
924 { KEY_DC
, tree_rmdir_cmd
},
929 tree_key (WTree
*tree
, int key
)
933 for (i
= 0; tree_keymap
[i
].key_code
; i
++){
934 if (key
== tree_keymap
[i
].key_code
){
935 if (tree_keymap
[i
].fn
!= tree_start_search
)
937 (*tree_keymap
[i
].fn
)(tree
);
943 /* We do not want to use them if we do not need to */
944 /* Input line may want to take the motion key event */
946 return move_left (tree
);
948 if (key
== KEY_RIGHT
)
949 return move_right (tree
);
951 if (is_abort_char (key
)) {
952 if (tree
->is_panel
) {
955 return 1; /* eat abort char */
957 return 0; /* modal tree dialog: let upper layer see the
958 abort character and close the dialog */
961 /* Do not eat characters not meant for the tree below ' ' (e.g. C-l). */
962 if ((key
>= ' '&& key
<= 255) || key
== 8 || key
== KEY_BACKSPACE
) {
963 if (tree
->searching
){
964 tree_do_search (tree
, key
);
969 if (!command_prompt
) {
970 tree_start_search (tree
);
971 tree_do_search (tree
, key
);
974 return tree
->is_panel
;
981 tree_frame (Dlg_head
*h
, WTree
*tree
)
983 attrset (NORMAL_COLOR
);
984 widget_erase ((Widget
*) tree
);
986 draw_double_box (h
, tree
->widget
.y
, tree
->widget
.x
, tree
->widget
.lines
,
989 if (show_mini_info
&& tree
->is_panel
){
990 widget_move (tree
, tlines (tree
) + 1, 1);
991 hline (ACS_HLINE
, tree
->widget
.cols
- 2);
997 tree_callback (Dlg_head
*h
, WTree
*tree
, int msg
, int par
)
1001 tree_frame (h
, tree
);
1006 return tree_key (tree
, par
);
1010 define_label (h
, (Widget
*)tree
, 1, _("Help"), (voidfn
) tree_help_cmd
);
1011 define_label_data (h
, (Widget
*)tree
,
1012 2, _("Rescan"), (buttonbarfn
)tree_rescan_cmd
, tree
);
1013 define_label_data (h
, (Widget
*)tree
,
1014 3, _("Forget"), (buttonbarfn
)tree_forget_cmd
, tree
);
1015 define_label_data (h
, (Widget
*)tree
,
1016 5, _("Copy"), (buttonbarfn
) tree_copy_cmd
, tree
);
1017 define_label_data (h
, (Widget
*)tree
,
1018 6, _("RenMov"), (buttonbarfn
) tree_move_cmd
, tree
);
1020 /* FIXME: mkdir is currently defunct */
1021 define_label_data (h
, (Widget
*)tree
,
1022 7, _("Mkdir"), (buttonbarfn
) tree_mkdir_cmd
, tree
);
1024 define_label (h
, (Widget
*)tree
, 7, "", 0);
1026 define_label_data (h
, (Widget
*)tree
,
1027 8, _("Rmdir"), (buttonbarfn
) tree_rmdir_cmd
, tree
);
1028 set_navig_label (h
);
1029 redraw_labels (h
, (Widget
*)tree
);
1032 /* FIXME: Should find a better way of only displaying the
1033 currently selected item */
1037 /* FIXME: Should find a better way of changing the color of the
1039 case WIDGET_UNFOCUS
:
1044 return default_proc (h
, msg
, par
);
1048 tree_new (int is_panel
, int y
, int x
, int lines
, int cols
)
1050 WTree
*tree
= g_new (WTree
, 1);
1052 init_widget (&tree
->widget
, y
, x
, lines
, cols
, tcallback
,
1053 (destroy_fn
) tree_destroy
, (mouse_h
) event_callback
, NULL
);
1054 tree
->is_panel
= is_panel
;
1055 tree
->selected_ptr
= 0;
1057 tree
->store
= tree_store_get ();
1058 tree_store_add_entry_remove_hook (remove_callback
, tree
);
1059 tree
->tree_shown
= 0;
1060 tree
->search_buffer
[0] = 0;
1061 tree
->topdiff
= tree
->widget
.lines
/ 2;
1062 tree
->searching
= 0;
1066 /* We do not want to keep the cursor */
1067 widget_want_cursor (tree
->widget
, 0);