📄 wtools.c
字号:
/* {{{ */
/* {{{ Copyright Notice */
/* Widget based utility functions.
Copyright (C) 1994, 1995 the Free Software Foundation
Authors: 1994, 1995, 1996 Miguel de Icaza
1994, 1995 Radek Doulik
1995 Jakub Jelinek
1995 Andrej Borsenkow
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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* }}} */
/* [] = "$Id: wtools.c 15091 2005-05-07 21:24:31Z sedwards $" */
#include <config.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include "tty.h"
#include <stdarg.h>
#include "mad.h"
#include "global.h"
#include "util.h"
#include "win.h"
#include "color.h"
#include "mouse.h"
#include "dlg.h"
#include "widget.h"
#include "menu.h"
#include "wtools.h"
#include "key.h" /* For mi_getch() */
#include "dialog.h" /* For do_refresh() and my_wputs() */
#include "complete.h" /* INPUT_COMPLETE_CD */
#include "x.h"
/* }}} */
/* {{{ Common dialog callback */
#ifdef HAVE_X
void dialog_repaint (struct Dlg_head *h, int back, int title_fore)
{
}
#else
void
dialog_repaint (struct Dlg_head *h, int back, int title_fore)
{
attrset (back);
dlg_erase (h);
draw_box (h, 1, 1, h->lines - 2, h->cols - 2);
attrset (title_fore);
if (h->title){
dlg_move (h, 1, (h->cols-strlen (h->title))/2);
addstr (h->title);
}
}
#endif
void
common_dialog_repaint (struct Dlg_head *h)
{
dialog_repaint (h, COLOR_NORMAL, COLOR_HOT_NORMAL);
}
int
common_dialog_callback (struct Dlg_head *h, int id, int msg)
{
if (msg == DLG_DRAW)
common_dialog_repaint (h);
return 0;
}
/* }}} */
/* {{{ Listbox utility functions */
void
listbox_refresh (Dlg_head *h)
{
dialog_repaint (h, COLOR_NORMAL, COLOR_HOT_NORMAL);
}
static int listbox_callback (Dlg_head *h, int id, int msg)
{
switch (msg) {
case DLG_DRAW:
#ifndef HAVE_X
listbox_refresh(h);
#endif
return 1;
}
return 0;
}
Listbox *create_listbox_window (int cols, int lines, char *title, char *help)
{
int xpos, ypos, len;
Listbox *listbox = xmalloc (sizeof (Listbox), "create_listbox_window");
char* cancel_string = _("&Cancel");
/* Adjust sizes */
lines = (lines > LINES-6) ? LINES - 6 : lines;
if (title && (cols < (len = strlen(title) + 2)))
cols = len;
/* no &, but 4 spaces around button for brackets and such */
if (cols < (len = strlen(cancel_string) + 3))
cols = len;
cols = cols > COLS-6 ? COLS-6 : cols;
/* I'm not sure if this -2 is safe, should test it */
xpos = (COLS-cols)/2;
ypos = (LINES-lines)/2 - 2;
/* Create components */
listbox->dlg = create_dlg (ypos, xpos, lines+6, cols+4, dialog_colors,
listbox_callback, help, "listbox", DLG_CENTER|DLG_GRID);
x_set_dialog_title (listbox->dlg, title);
listbox->list = listbox_new (2, 2, cols, lines, listbox_finish, 0, "li");
add_widget (listbox->dlg,
button_new (lines+3, (cols/2 + 2) - len/2,
B_CANCEL, NORMAL_BUTTON, cancel_string, 0, 0, "c"));
add_widget (listbox->dlg, listbox->list);
#ifndef HAVE_X
listbox_refresh(listbox->dlg);
#endif /* !HAVE_X */
return listbox;
}
/* Returns the number of the item selected */
int run_listbox (Listbox *l)
{
int val;
run_dlg (l->dlg);
if (l->dlg->ret_value == B_CANCEL)
val = -1;
else
val = l->list->pos;
destroy_dlg (l->dlg);
free (l);
return val;
}
/* }}} */
/* {{{ Query Dialog functions */
#ifndef HAVE_GNOME
struct text_struct {
char *text;
char *header;
};
static int query_callback (struct Dlg_head *h, int Id, int Msg)
{
struct text_struct *info;
info = (struct text_struct *) h->data;
switch (Msg){
#ifndef HAVE_X
case DLG_DRAW:
/* designate window */
attrset (NORMALC);
dlg_erase (h);
draw_box (h, 1, 1, h->lines-2, h->cols-2);
attrset (HOT_NORMALC);
dlg_move (h, 1, (h->cols-strlen (info->header))/2);
addstr (info->header);
break;
#endif
}
return 0;
}
Dlg_head *last_query_dlg;
static int sel_pos = 0;
/* Used to ask questions to the user */
int query_dialog (char *header, char *text, int flags, int count, ...)
{
va_list ap;
Dlg_head *query_dlg;
int win_len = 0;
int i;
int result = -1;
int xpos, ypos;
int cols, lines;
char *cur_name;
static int query_colors [4];
static struct text_struct pass;
#ifdef HAVE_X
static char *buttonnames [10];
#endif
/* set dialog colors */
query_colors [0] = (flags & D_ERROR) ? ERROR_COLOR : Q_UNSELECTED_COLOR;
query_colors [1] = (flags & D_ERROR) ? REVERSE_COLOR : Q_SELECTED_COLOR;
query_colors [2] = (flags & D_ERROR) ? ERROR_COLOR : COLOR_HOT_NORMAL;
query_colors [3] = (flags & D_ERROR) ? COLOR_HOT_NORMAL : COLOR_HOT_FOCUS;
if (header == MSG_ERROR)
header = _(" Error ");
if (count > 0){
va_start (ap, count);
for (i = 0; i < count; i++)
{
char* cp = va_arg (ap, char *);
win_len += strlen (cp) + 6;
if (strchr (cp, '&') != NULL)
win_len--;
}
va_end (ap);
}
/* count coordinates */
cols = 6 + max (win_len, max (strlen (header), msglen (text, &lines)));
lines += 4 + (count > 0 ? 2 : 0);
xpos = COLS/2 - cols/2;
ypos = LINES/3 - (lines-3)/2;
pass.header = header;
pass.text = text;
/* prepare dialog */
query_dlg = create_dlg (ypos, xpos, lines, cols, query_colors,
query_callback, "[QueryBox]", "query", DLG_NONE);
x_set_dialog_title (query_dlg, header);
/* The data we need to pass to the callback */
query_dlg->cols = cols;
query_dlg->lines = lines;
query_dlg->data = &pass;
query_dlg->direction = DIR_BACKWARD;
if (count > 0){
cols = (cols-win_len-2)/2+2;
va_start (ap, count);
for (i = 0; i < count; i++){
cur_name = va_arg (ap, char *);
xpos = strlen (cur_name)+6;
if (strchr(cur_name, '&') != NULL)
xpos--;
#ifndef HAVE_XVIEW
add_widget (query_dlg, button_new
(lines-3, cols, B_USER+i, NORMAL_BUTTON, cur_name,
0, 0, NULL));
#else
buttonnames [i] = cur_name;
#endif
cols += xpos;
if (i == sel_pos)
query_dlg->initfocus = query_dlg->current;
}
va_end (ap);
#ifdef HAVE_XVIEW
for (i = count - 1; i >= 0; i--)
add_widgetl (query_dlg, button_new
(0, 0, B_USER+i, NORMAL_BUTTON, buttonnames [i], 0, 0, NULL),
i ? XV_WLAY_RIGHTOF : XV_WLAY_CENTERROW);
#endif
add_widget (query_dlg, label_new (2, 3, text, NULL));
/* run dialog and make result */
run_dlg (query_dlg);
switch (query_dlg->ret_value){
case B_CANCEL:
break;
default:
result = query_dlg->ret_value-B_USER;
}
/* free used memory */
destroy_dlg (query_dlg);
} else {
#ifdef HAVE_X
add_widgetl (query_dlg, button_new(0, 0, B_EXIT, NORMAL_BUTTON, _("&Ok"), 0, 0, NULL),
XV_WLAY_CENTERROW);
add_widget (query_dlg, label_new (2, 3, text, NULL));
#ifdef HAVE_TK
if (flags & D_INSERT){
} else
#endif
{
run_dlg (query_dlg);
destroy_dlg (query_dlg);
}
#else
add_widget (query_dlg, label_new (2, 3, text, NULL));
add_widget (query_dlg, button_new(0, 0, 0, HIDDEN_BUTTON, "-", 0, 0, NULL));
#endif /* HAVE_X */
last_query_dlg = query_dlg;
}
sel_pos = 0;
return result;
}
void query_set_sel (int new_sel)
{
sel_pos = new_sel;
}
/* }}} */
/* {{{ The message function */
/* To show nice messages to the users */
Dlg_head *message (int error, char *header, char *text, ...)
{
va_list args;
char buffer [4096];
Dlg_head *d;
/* Setup the display information */
strcpy (buffer, "\n");
va_start (args, text);
vsprintf (&buffer [1], text, args);
strcat (buffer, "\n");
va_end (args);
query_dialog (header, buffer, error, 0);
#ifndef HAVE_XVIEW
d = last_query_dlg;
#ifdef HAVE_TK
if (error & D_INSERT){
init_dlg (d);
tk_dispatch_all ();
return d;
}
#else
init_dlg (d);
if (!(error & D_INSERT)){
mi_getch ();
dlg_run_done (d);
destroy_dlg (d);
} else
return d;
#endif
#endif
return 0;
}
#endif
/* }}} */
/* {{{ The chooser routines */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -