static void tab_compl_n(struct dialog_data *dlg_data, unsigned char *item, int len) { struct widget_data *widget_data = selected_widget(dlg_data); assert(widget_is_textfield(widget_data)); int_upper_bound(&len, widget_data->widget->datalen - 1); memcpy(widget_data->cdata, item, len); widget_data->cdata[len] = 0; widget_data->info.field.cpos = len; widget_data->info.field.vpos = 0; redraw_dialog(dlg_data, 1); }
void dlg_format_group(struct dialog_data *dlg_data, struct widget_data *widget_data, int n, int x, int *y, int w, int *rw, int format_only) { struct terminal *term = dlg_data->win->term; int space_between_widgets = 1; int line_width = 0; int xpos; struct color_pair *color = get_bfu_color(term, "dialog.text"); assert(n > 0); if_assert_failed return; while (n--) { int widget_width; int width; unsigned char *text = widget_data->widget->text; int label_length; int label_padding; #ifdef CONFIG_UTF8 if (term->utf8_cp) { if (text && *text) label_length = utf8_ptr2cells(text, NULL); else label_length = 0; } else #endif /* CONFIG_UTF8 */ label_length = (text && *text) ? strlen(text) : 0; label_padding = (label_length > 0); if (widget_data->widget->type == WIDGET_CHECKBOX) { width = CHECKBOX_LEN; } else if (widget_is_textfield(widget_data)) { #ifdef CONFIG_UTF8 if (term->utf8_cp) { width = utf8_ptr2cells(widget_data->widget->data, NULL); } else #endif /* CONFIG_UTF8 */ width = widget_data->widget->datalen; } else { /* TODO: handle all widget types. */ widget_data++; continue; } int_bounds(&label_length, 0, w - width - label_padding); widget_width = width + label_padding + label_length; if (line_width + widget_width > w) { line_width = 0; (*y) += 2; /* Next line */ } xpos = x + line_width; if (!format_only) { if (widget_data->widget->type == WIDGET_CHECKBOX) { /* Draw text at right of checkbox. */ if (label_length) { #ifdef CONFIG_UTF8 if (term->utf8_cp) { int lb = utf8_cells2bytes( text, label_length, NULL); draw_dlg_text(dlg_data, xpos + width + label_padding, *y, text, lb, 0, color); } else #endif /* CONFIG_UTF8 */ { draw_dlg_text(dlg_data, xpos + width + label_padding, *y, text, label_length, 0, color); } } set_box(&widget_data->box, xpos, *y, width, 1); } else if (widget_is_textfield(widget_data)) { /* Draw label at left of widget. */ if (label_length) { #ifdef CONFIG_UTF8 if (term->utf8_cp) { int lb = utf8_cells2bytes( text, label_length, NULL); draw_dlg_text(dlg_data, xpos, *y, text, lb, 0, color); } else #endif /* CONFIG_UTF8 */ { draw_dlg_text(dlg_data, xpos, *y, text, label_length, 0, color); } } set_box(&widget_data->box, xpos + label_padding + label_length, *y, width, 1); } } line_width += widget_width; if (rw) int_bounds(rw, line_width, w); line_width += space_between_widgets; widget_data++; } (*y)++; }
void dlg_format_group(struct terminal *term, struct widget_data *widget_data, int n, int x, int *y, int w, int *rw) { int space_between_widgets = 1; int line_width = 0; int xpos; struct color_pair *color = get_bfu_color(term, "dialog.text"); assert(n > 0); if_assert_failed return; while (n--) { int widget_width; int width; unsigned char *text = widget_data->widget->text; int label_length = (text && *text) ? strlen(text) : 0; int label_padding = (label_length > 0); if (widget_data->widget->type == WIDGET_CHECKBOX) { width = 3; } else if (widget_is_textfield(widget_data)) { width = widget_data->widget->datalen; } else { /* TODO: handle all widget types. */ widget_data++; continue; } int_bounds(&label_length, 0, w - width - label_padding); widget_width = width + label_padding + label_length; if (line_width + widget_width > w) { line_width = 0; (*y) += 2; /* Next line */ } xpos = x + line_width; if (term) { if (widget_data->widget->type == WIDGET_CHECKBOX) { /* Draw text at right of checkbox. */ if (label_length) draw_text(term, xpos + width + label_padding, *y, text, label_length, 0, color); set_box(&widget_data->box, xpos, *y, width, 1); } else if (widget_is_textfield(widget_data)) { /* Draw label at left of widget. */ if (label_length) draw_text(term, xpos, *y, text, label_length, 0, color); set_box(&widget_data->box, xpos + label_padding + label_length, *y, width, 1); } } line_width += widget_width; if (rw) int_bounds(rw, line_width, w); line_width += space_between_widgets; widget_data++; } (*y)++; }