static void tree_move_backward (WTree * tree, int i) { if (!tree_navigation_flag) tree->selected_ptr = back_ptr (tree->selected_ptr, &i); else { tree_entry *current; int j = 0; current = tree->selected_ptr; while (j < i && current->prev && current->prev->sublevel >= tree->selected_ptr->sublevel) { current = current->prev; if (current->sublevel == tree->selected_ptr->sublevel) { tree->selected_ptr = current; j++; } } i = j; } tree->topdiff -= i; tree_check_focus (tree); }
static void show_tree (WTree * tree) { Widget *w = WIDGET (tree); WDialog *h = w->owner; tree_entry *current; int i, j, topsublevel; int x = 0, y = 0; int tree_lines, tree_cols; /* Initialize */ tree_lines = tlines (tree); tree_cols = w->cols; widget_move (w, y, x); if (tree->is_panel) { tree_cols -= 2; x = y = 1; } g_free (tree->tree_shown); tree->tree_shown = g_new0 (tree_entry *, tree_lines); if (tree->store->tree_first) topsublevel = tree->store->tree_first->sublevel; else topsublevel = 0; if (!tree->selected_ptr) { tree->selected_ptr = tree->store->tree_first; tree->topdiff = 0; } current = tree->selected_ptr; /* Calculate the directory which is to be shown on the topmost line */ if (!tree_navigation_flag) current = back_ptr (current, &tree->topdiff); else { i = 0; while (current->prev && i < tree->topdiff) { current = current->prev; if (current->sublevel < tree->selected_ptr->sublevel) { if (vfs_path_equal (current->name, tree->selected_ptr->name)) i++; } else if (current->sublevel == tree->selected_ptr->sublevel) { const char *cname; cname = vfs_path_as_str (current->name); for (j = strlen (cname) - 1; !IS_PATH_SEP (cname[j]); j--) ; if (vfs_path_equal_len (current->name, tree->selected_ptr->name, j)) i++; } else if (current->sublevel == tree->selected_ptr->sublevel + 1) { j = vfs_path_len (tree->selected_ptr->name); if (j > 1 && vfs_path_equal_len (current->name, tree->selected_ptr->name, j)) i++; } } tree->topdiff = i; } /* Loop for every line */ for (i = 0; i < tree_lines; i++) { tty_setcolor (tree->is_panel ? NORMAL_COLOR : TREE_NORMALC (h)); /* Move to the beginning of the line */ tty_draw_hline (w->y + y + i, w->x + x, ' ', tree_cols); if (current == NULL) continue; if (tree->is_panel) tty_setcolor (widget_get_state (w, WST_FOCUSED) && current == tree->selected_ptr ? SELECTED_COLOR : NORMAL_COLOR); else tty_setcolor (current == tree->selected_ptr ? TREE_CURRENTC (h) : TREE_NORMALC (h)); tree->tree_shown[i] = current; if (current->sublevel == topsublevel) /* Show full name */ tty_print_string (str_fit_to_term (vfs_path_as_str (current->name), tree_cols + (tree->is_panel ? 0 : 1), J_LEFT_FIT)); else { /* Sub level directory */ tty_set_alt_charset (TRUE); /* Output branch parts */ for (j = 0; j < current->sublevel - topsublevel - 1; j++) { if (tree_cols - 8 - 3 * j < 9) break; tty_print_char (' '); if (current->submask & (1 << (j + topsublevel + 1))) tty_print_char (ACS_VLINE); else tty_print_char (' '); tty_print_char (' '); } tty_print_char (' '); j++; if (!current->next || !(current->next->submask & (1 << current->sublevel))) tty_print_char (ACS_LLCORNER); else tty_print_char (ACS_LTEE); tty_print_char (ACS_HLINE); tty_set_alt_charset (FALSE); /* Show sub-name */ tty_print_char (' '); tty_print_string (str_fit_to_term (current->subname, tree_cols - x - 3 * j, J_LEFT_FIT)); } /* Calculate the next value for current */ current = current->next; if (tree_navigation_flag) { while (current != NULL) { if (current->sublevel < tree->selected_ptr->sublevel) { if (vfs_path_equal_len (current->name, tree->selected_ptr->name, vfs_path_len (current->name))) break; } else if (current->sublevel == tree->selected_ptr->sublevel) { const char *cname; cname = vfs_path_as_str (current->name); for (j = strlen (cname) - 1; !IS_PATH_SEP (cname[j]); j--) ; if (vfs_path_equal_len (current->name, tree->selected_ptr->name, j)) break; } else if (current->sublevel == tree->selected_ptr->sublevel + 1 && vfs_path_len (tree->selected_ptr->name) > 1) { if (vfs_path_equal_len (current->name, tree->selected_ptr->name, vfs_path_len (tree->selected_ptr->name))) break; } current = current->next; } } } tree_show_mini_info (tree, tree_lines, tree_cols); }
static void show_tree (WTree *tree) { Dlg_head *h = tree->widget.parent; tree_entry *current; int i, j, topsublevel; int x, y; int tree_lines, tree_cols; /* Initialize */ x = y = 0; tree_lines = tlines (tree); tree_cols = tree->widget.cols; attrset (TREE_NORMALC (h)); widget_move ((Widget*)tree, y, x); if (tree->is_panel){ tree_cols -= 2; x = y = 1; } g_free (tree->tree_shown); tree->tree_shown = g_new (tree_entry*, tree_lines); for (i = 0; i < tree_lines; i++) tree->tree_shown [i] = NULL; if (tree->store->tree_first) topsublevel = tree->store->tree_first->sublevel; else topsublevel = 0; if (!tree->selected_ptr){ tree->selected_ptr = tree->store->tree_first; tree->topdiff = 0; } current = tree->selected_ptr; /* Calculate the directory which is to be shown on the topmost line */ if (tree_navigation_flag){ i = 0; while (current->prev && i < tree->topdiff){ current = current->prev; if (current->sublevel < tree->selected_ptr->sublevel){ if (strncmp (current->name, tree->selected_ptr->name, strlen (current->name)) == 0) i++; } else if (current->sublevel == tree->selected_ptr->sublevel){ for (j = strlen (current->name) - 1; current->name [j] != PATH_SEP; j--); if (strncmp (current->name, tree->selected_ptr->name, j) == 0) i++; } else if (current->sublevel == tree->selected_ptr->sublevel + 1 && strlen (tree->selected_ptr->name) > 1){ if (strncmp (current->name, tree->selected_ptr->name, strlen (tree->selected_ptr->name)) == 0) i++; } } tree->topdiff = i; } else current = back_ptr (current, &tree->topdiff); /* Loop for every line */ for (i = 0; i < tree_lines; i++){ /* Move to the beginning of the line */ widget_move (&tree->widget, y+i, x); hline (' ', tree_cols); widget_move (&tree->widget, y+i, x); if (!current) continue; tree->tree_shown [i] = current; if (current->sublevel == topsublevel){ /* Top level directory */ if (tree->active && current == tree->selected_ptr) { if (!use_colors && !tree->is_panel) attrset (MARKED_COLOR); else attrset (SELECTED_COLOR); } /* Show full name */ addstr ((char *) name_trunc (current->name, tree_cols - 6)); } else{ /* Sub level directory */ acs (); /* Output branch parts */ for (j = 0; j < current->sublevel - topsublevel - 1; j++){ if (tree_cols - 8 - 3 * j < 9) break; addch (' '); if (current->submask & (1 << (j + topsublevel + 1))) addch (ACS_VLINE); else addch (' '); addch (' '); } addch (' '); j++; if (!current->next || !(current->next->submask & (1 << current->sublevel))) addch (ACS_LLCORNER); else addch (ACS_LTEE); addch (ACS_HLINE); noacs (); if (tree->active && current == tree->selected_ptr) { /* Selected directory -> change color */ if (!use_colors && !tree->is_panel) attrset (MARKED_COLOR); else attrset (SELECTED_COLOR); } /* Show sub-name */ addch (' '); addstr ((char *) name_trunc (current->subname, tree_cols - 2 - 4 - 3 * j)); } addch (' '); /* Return to normal color */ attrset (TREE_NORMALC (h)); /* Calculate the next value for current */ current = current->next; if (tree_navigation_flag){ while (current){ if (current->sublevel < tree->selected_ptr->sublevel){ if (strncmp (current->name, tree->selected_ptr->name, strlen (current->name)) == 0) break; } else if (current->sublevel == tree->selected_ptr->sublevel){ for (j = strlen (current->name) - 1; current->name [j] != PATH_SEP; j--); if (strncmp (current->name,tree->selected_ptr->name,j)== 0) break; } else if (current->sublevel == tree->selected_ptr->sublevel+1 && strlen (tree->selected_ptr->name) > 1){ if (strncmp (current->name, tree->selected_ptr->name, strlen (tree->selected_ptr->name)) == 0) break; } current = current->next; } } } tree_show_mini_info (tree, tree_lines, tree_cols); }