Exemple #1
0
Fichier : main.c Projet : BrEacK/mc
gboolean
do_cd (const vfs_path_t * new_dir_vpath, enum cd_enum exact)
{
    gboolean res;
    const vfs_path_t *_new_dir_vpath = new_dir_vpath;

    if (current_panel->is_panelized)
    {
        size_t new_vpath_len;

        new_vpath_len = vfs_path_len (new_dir_vpath);
        if (vfs_path_ncmp (new_dir_vpath, panelized_panel.root_vpath, new_vpath_len) == 0)
            _new_dir_vpath = panelized_panel.root_vpath;
    }

    res = do_panel_cd (current_panel, _new_dir_vpath, exact);

#ifdef HAVE_CHARSET
    if (res)
    {
        const vfs_path_element_t *path_element;

        path_element = vfs_path_get_by_index (current_panel->cwd_vpath, -1);
        if (path_element->encoding != NULL)
            current_panel->codepage = get_codepage_index (path_element->encoding);
        else
            current_panel->codepage = SELECT_CHARSET_NO_TRANSLATE;
    }
#endif /* HAVE_CHARSET */

    return res;
}
Exemple #2
0
static void
show_tree (WTree * tree)
{
    Dlg_head *h = tree->widget.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 = tree->widget.cols;

    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_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)
        {
            char *current_name;

            current = current->prev;
            current_name = vfs_path_to_str (current->name);

            if (current->sublevel < tree->selected_ptr->sublevel)
            {
                if (vfs_path_cmp (current->name, tree->selected_ptr->name) == 0)
                    i++;
            }
            else if (current->sublevel == tree->selected_ptr->sublevel)
            {
                for (j = strlen (current_name) - 1; current_name[j] != PATH_SEP; j--);
                if (vfs_path_ncmp (current->name, tree->selected_ptr->name, j) == 0)
                    i++;
            }
            else
            {
                if (current->sublevel == tree->selected_ptr->sublevel + 1
                    && vfs_path_len (tree->selected_ptr->name) > 1)
                {
                    if (vfs_path_ncmp (current->name, tree->selected_ptr->name,
                                       vfs_path_len (tree->selected_ptr->name)) == 0)
                        i++;
                }
            }
            g_free (current_name);
        }
        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 (tree->widget.y + y + i, tree->widget.x + x, ' ', tree_cols);

        if (current == NULL)
            continue;

        if (tree->is_panel)
            tty_setcolor (tree->active && 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 */
            char *current_name;

            current_name = vfs_path_to_str (current->name);
            tty_print_string (str_fit_to_term
                              (current_name, tree_cols + (tree->is_panel ? 0 : 1), J_LEFT_FIT));
            g_free (current_name);
        }
        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_ncmp (current->name, tree->selected_ptr->name,
                                       vfs_path_len (current->name)) == 0)
                        break;
                }
                else if (current->sublevel == tree->selected_ptr->sublevel)
                {
                    char *current_name;

                    current_name = vfs_path_to_str (current->name);
                    for (j = strlen (current_name) - 1; current_name[j] != PATH_SEP; j--)
                        ;
                    g_free (current_name);
                    if (vfs_path_ncmp (current->name, tree->selected_ptr->name, j) == 0)
                        break;
                }
                else if (current->sublevel == tree->selected_ptr->sublevel + 1
                         && vfs_path_len (tree->selected_ptr->name) > 1)
                {
                    if (vfs_path_ncmp (current->name, tree->selected_ptr->name,
                                       vfs_path_len (tree->selected_ptr->name)) == 0)
                        break;
                }
                current = current->next;
            }
        }
    }

    tree_show_mini_info (tree, tree_lines, tree_cols);
}