/*
* Copyright (C) 2012-2021 Robin Haberkorn
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include
#include
#include
#include "sciteco.h"
#include "string-utils.h"
#include "curses-utils.h"
gsize
teco_curses_format_str(WINDOW *win, const gchar *str, gsize len, gint max_width)
{
int old_x, old_y;
gint chars_added = 0;
getyx(win, old_y, old_x);
if (max_width < 0)
max_width = getmaxx(win) - old_x;
while (len > 0) {
/*
* NOTE: This mapping is similar to
* View::set_representations()
*/
switch (*str) {
case '\e':
chars_added++;
if (chars_added > max_width)
goto truncate;
waddch(win, '$' | A_REVERSE);
break;
case '\r':
chars_added += 2;
if (chars_added > max_width)
goto truncate;
waddch(win, 'C' | A_REVERSE);
waddch(win, 'R' | A_REVERSE);
break;
case '\n':
chars_added += 2;
if (chars_added > max_width)
goto truncate;
waddch(win, 'L' | A_REVERSE);
waddch(win, 'F' | A_REVERSE);
break;
case '\t':
chars_added += 3;
if (chars_added > max_width)
goto truncate;
waddch(win, 'T' | A_REVERSE);
waddch(win, 'A' | A_REVERSE);
waddch(win, 'B' | A_REVERSE);
break;
default:
if (TECO_IS_CTL(*str)) {
chars_added += 2;
if (chars_added > max_width)
goto truncate;
waddch(win, '^' | A_REVERSE);
waddch(win, TECO_CTL_ECHO(*str) | A_REVERSE);
} else {
chars_added++;
if (chars_added > max_width)
goto truncate;
waddch(win, *str);
}
}
str++;
len--;
}
return getcurx(win) - old_x;
truncate:
if (max_width >= 3) {
/*
* Truncate string
*/
wattron(win, A_UNDERLINE | A_BOLD);
mvwaddstr(win, old_y, old_x + max_width - 3, "...");
wattroff(win, A_UNDERLINE | A_BOLD);
}
return getcurx(win) - old_x;
}
gsize
teco_curses_format_filename(WINDOW *win, const gchar *filename,
gint max_width)
{
int old_x = getcurx(win);
g_autofree gchar *filename_printable = teco_string_echo(filename, strlen(filename));
size_t filename_len = strlen(filename_printable);
if (max_width < 0)
max_width = getmaxx(win) - old_x;
if (filename_len <= (size_t)max_width) {
waddstr(win, filename_printable);
} else {
const gchar *keep_post = filename_printable + filename_len -
max_width + 3;
#ifdef G_OS_WIN32
const gchar *keep_pre = g_path_skip_root(filename_printable);
if (keep_pre) {
waddnstr(win, filename_printable,
keep_pre - filename_printable);
keep_post += keep_pre - filename_printable;
}
#endif
wattron(win, A_UNDERLINE | A_BOLD);
waddstr(win, "...");
wattroff(win, A_UNDERLINE | A_BOLD);
waddstr(win, keep_post);
}
return getcurx(win) - old_x;
}