/* Mouse callback */ static int event_callback (Gpm_Event *event, void *data) { WTree *tree = data; if (!(event->type & GPM_UP)) return MOU_NORMAL; if (tree->is_panel) event->y--; event->y--; if (!tree->active) change_panel (); if (event->y < 0){ tree_move_backward (tree, tlines (tree) - 1); show_tree (tree); } else if (event->y >= tlines (tree)){ tree_move_forward (tree, tlines (tree) - 1); show_tree (tree); } else { tree_event (tree, event->y); if ((event->type & (GPM_UP|GPM_DOUBLE)) == (GPM_UP|GPM_DOUBLE)){ chdir_sel (tree); } } return MOU_NORMAL; }
static void check_focus (WTree *tree) { if (tree->topdiff < 3) tree->topdiff = 3; else if (tree->topdiff >= tlines (tree) - 3) tree->topdiff = tlines (tree) - 3 - 1; }
static int tree_event (Gpm_Event * event, void *data) { WTree *tree = (WTree *) data; Widget *w = WIDGET (data); Gpm_Event local; if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; /* rest of the upper frame - call menu */ if (tree->is_panel && (event->type & GPM_DOWN) != 0 && event->y == WIDGET (w->owner)->y + 1) return MOU_UNHANDLED; local = mouse_get_local (event, w); if ((local.type & GPM_UP) == 0) return MOU_NORMAL; if (tree->is_panel) local.y--; local.y--; if (!tree->active) change_panel (); if (local.y < 0) { tree_move_backward (tree, tlines (tree) - 1); show_tree (tree); } else if (local.y >= tlines (tree)) { tree_move_forward (tree, tlines (tree) - 1); show_tree (tree); } else if ((local.type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE)) { if (tree->tree_shown[local.y] != NULL) { tree->selected_ptr = tree->tree_shown[local.y]; tree->topdiff = local.y; } tree_chdir_sel (tree); } return MOU_NORMAL; }
static void tree_move_pgdn (WTree * tree) { tree_move_forward (tree, tlines (tree) - 1); show_tree (tree); maybe_chdir (tree); }
static void tree_move_pgup (WTree * tree) { tree_move_backward (tree, tlines (tree) - 1); show_tree (tree); maybe_chdir (tree); }
static int tree_event (Gpm_Event * event, void *data) { WTree *tree = (WTree *) data; Widget *w = (Widget *) data; Gpm_Event local; if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; local = mouse_get_local (event, w); /* rest of the upper frame, the menu is invisible - call menu */ if (tree->is_panel && (local.type & GPM_DOWN) != 0 && local.y == 1 && !menubar_visible) return the_menubar->widget.mouse (event, the_menubar); if ((local.type & GPM_UP) == 0) return MOU_NORMAL; if (tree->is_panel) local.y--; local.y--; if (!tree->active) change_panel (); if (local.y < 0) { tree_move_backward (tree, tlines (tree) - 1); show_tree (tree); } else if (local.y >= tlines (tree)) { tree_move_forward (tree, tlines (tree) - 1); show_tree (tree); } else { tree_mouse_click (tree, local.y); if ((local.type & (GPM_UP | GPM_DOUBLE)) == (GPM_UP | GPM_DOUBLE)) tree_chdir_sel (tree); } return MOU_NORMAL; }
/* Mouse callback */ static int event_callback (Gpm_Event *event, void *data) { WTree *tree = data; /* rest of the upper frame, the menu is invisible - call menu */ if (tree->is_panel && (event->type & GPM_DOWN) && event->y == 1 && !menubar_visible) { event->x += tree->widget.x; return the_menubar->widget.mouse (event, the_menubar); } if (!(event->type & GPM_UP)) return MOU_NORMAL; if (tree->is_panel) event->y--; event->y--; if (!tree->active) change_panel (); if (event->y < 0){ tree_move_backward (tree, tlines (tree) - 1); show_tree (tree); } else if (event->y >= tlines (tree)){ tree_move_forward (tree, tlines (tree) - 1); show_tree (tree); } else { tree_event (tree, event->y); if ((event->type & (GPM_UP|GPM_DOUBLE)) == (GPM_UP|GPM_DOUBLE)){ chdir_sel (tree); } } return MOU_NORMAL; }
static void tree_frame (Dlg_head *h, WTree *tree) { attrset (NORMAL_COLOR); widget_erase ((Widget*) tree); if (tree->is_panel) draw_double_box (h, tree->widget.y, tree->widget.x, tree->widget.lines, tree->widget.cols); if (show_mini_info && tree->is_panel){ widget_move (tree, tlines (tree) + 1, 1); hline (ACS_HLINE, tree->widget.cols - 2); } }
static void tree_frame (Dlg_head *h, WTree *tree) { tty_setcolor (NORMAL_COLOR); widget_erase ((Widget*) tree); if (tree->is_panel) { draw_box (h, tree->widget.y, tree->widget.x, tree->widget.lines, tree->widget.cols); if (show_mini_info) tty_draw_hline (tree->widget.y + tlines (tree) + 1, tree->widget.x + 1, ACS_HLINE, tree->widget.cols - 2); } }
static void tree_frame (Dlg_head * h, WTree * tree) { tty_setcolor (NORMAL_COLOR); widget_erase ((Widget *) tree); if (tree->is_panel) { const char *title = _("Directory tree"); const int len = str_term_width1 (title); draw_box (h, tree->widget.y, tree->widget.x, tree->widget.lines, tree->widget.cols, FALSE); widget_move (&tree->widget, 0, (tree->widget.cols - len - 2) / 2); tty_printf (" %s ", title); if (panels_options.show_mini_info) widget_move (&tree->widget, tlines (tree) + 1, 0); tty_print_alt_char (ACS_LTEE, FALSE); widget_move (&tree->widget, tlines (tree) + 1, tree->widget.cols - 1); tty_print_alt_char (ACS_RTEE, FALSE); tty_draw_hline (tree->widget.y + tlines (tree) + 1, tree->widget.x + 1, ACS_HLINE, tree->widget.cols - 2); } }
static void tree_move_to_bottom (WTree * tree) { tree->selected_ptr = tree->store->tree_last; tree->topdiff = tlines (tree) - 3 - 1; }
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); }
/** * Mouse callback */ static void tree_mouse_callback (Widget * w, mouse_msg_t msg, mouse_event_t * event) { WTree *tree = (WTree *) w; int y; y = event->y; if (tree->is_panel) y--; switch (msg) { case MSG_MOUSE_DOWN: /* rest of the upper frame - call menu */ if (tree->is_panel && event->y == WIDGET (w->owner)->y) { /* return MOU_UNHANDLED */ event->result.abort = TRUE; } else if (!widget_get_state (w, WST_FOCUSED)) change_panel (); break; case MSG_MOUSE_CLICK: { int lines; lines = tlines (tree); if (y < 0) { tree_move_backward (tree, lines - 1); show_tree (tree); } else if (y >= lines) { tree_move_forward (tree, lines - 1); show_tree (tree); } else if ((event->count & GPM_DOUBLE) != 0) { if (tree->tree_shown[y] != NULL) { tree->selected_ptr = tree->tree_shown[y]; tree->topdiff = y; } tree_chdir_sel (tree); } } break; case MSG_MOUSE_SCROLL_UP: case MSG_MOUSE_SCROLL_DOWN: /* TODO: Ticket #2218 */ break; default: break; } }
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); }