1
1

Merge branch '2919_dlg_as_widget'

* 2919_dlg_as_widget: (57 commits)
  Update po/*.po and po/mc.pot files.
  Internal menu structures are opaque now.
  Add useful macros for widget type cast.
  Unify widget and dialog message handling.
  Remove DLG_WANT_IDLE. Use W_WANT_IDLE instead.
  Rename Dlg_head to WDialog.
  Rename default callbacks of widget and dialog.
  Unify some hotkeys.
  (editcmd_dialog_raw_key_query): adjust sizes and look'n'feel.
  (real_query_recursive): refactoring of dialog.
  "Directory scanning" dialog: adjust look'n'feel.
  Center text in query owerwrite and delete dialogs.
  (query_dialog): center label horizontally.
  Horizontal centering of multi-line label: center each line independently.
  (file_mask_dialog): adjust width calculation.
  (query_dialog): add horizontal line.
  Remove DLG_REVERSE flag.
  Build file operation dialogs in normal order.
  Build find file dialogs in normal order.
  Build "Background jobs" dialog in normal order.
  ...
Этот коммит содержится в:
Andrew Borodin 2012-11-20 13:07:03 +04:00
родитель f45f155a12 8c59d2be4b
Коммит 47fc9f669f
128 изменённых файлов: 40094 добавлений и 88952 удалений

Просмотреть файл

@ -9,8 +9,8 @@
/* main forward declarations */ /* main forward declarations */
struct Widget; struct Widget;
typedef struct Widget Widget; typedef struct Widget Widget;
struct Dlg_head; struct WDialog;
typedef struct Dlg_head Dlg_head; typedef struct WDialog WDialog;
/* Please note that the first element in all the widgets is a */ /* Please note that the first element in all the widgets is a */
/* widget variable of type Widget. We abuse this fact everywhere */ /* widget variable of type Widget. We abuse this fact everywhere */

Просмотреть файл

@ -55,42 +55,42 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
button_callback (Widget * w, widget_msg_t msg, int parm) button_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WButton *b = (WButton *) w; WButton *b = BUTTON (w);
WDialog *h = w->owner;
int stop = 0; int stop = 0;
int off = 0; int off = 0;
Dlg_head *h = b->widget.owner;
switch (msg) switch (msg)
{ {
case WIDGET_HOTKEY: case MSG_HOTKEY:
/* /*
* Don't let the default button steal Enter from the current * Don't let the default button steal Enter from the current
* button. This is a workaround for the flawed event model * button. This is a workaround for the flawed event model
* when hotkeys are sent to all widgets before the key is * when hotkeys are sent to all widgets before the key is
* handled by the current widget. * handled by the current widget.
*/ */
if (parm == '\n' && (Widget *) h->current->data == &b->widget) if (parm == '\n' && WIDGET (h->current->data) == WIDGET (b))
{ {
button_callback (w, WIDGET_KEY, ' '); send_message (w, sender, MSG_KEY, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
} }
if (parm == '\n' && b->flags == DEFPUSH_BUTTON) if (parm == '\n' && b->flags == DEFPUSH_BUTTON)
{ {
button_callback (w, WIDGET_KEY, ' '); send_message (w, sender, MSG_KEY, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
} }
if (b->text.hotkey != NULL && g_ascii_tolower ((gchar) b->text.hotkey[0]) == parm) if (b->text.hotkey != NULL && g_ascii_tolower ((gchar) b->text.hotkey[0]) == parm)
{ {
button_callback (w, WIDGET_KEY, ' '); send_message (w, sender, MSG_KEY, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_KEY: case MSG_KEY:
if (parm != ' ' && parm != '\n') if (parm != ' ' && parm != '\n')
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
@ -103,7 +103,7 @@ button_callback (Widget * w, widget_msg_t msg, int parm)
} }
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
switch (b->flags) switch (b->flags)
{ {
case DEFPUSH_BUTTON: case DEFPUSH_BUTTON:
@ -120,15 +120,15 @@ button_callback (Widget * w, widget_msg_t msg, int parm)
off = 0; off = 0;
break; break;
} }
widget_move (&b->widget, 0, b->hotpos + off); widget_move (w, 0, b->hotpos + off);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_DRAW: case MSG_DRAW:
if (msg == WIDGET_UNFOCUS) if (msg == MSG_UNFOCUS)
b->selected = FALSE; b->selected = FALSE;
else if (msg == WIDGET_FOCUS) else if (msg == MSG_FOCUS)
b->selected = TRUE; b->selected = TRUE;
widget_selectcolor (w, b->selected, FALSE); widget_selectcolor (w, b->selected, FALSE);
@ -168,12 +168,12 @@ button_callback (Widget * w, widget_msg_t msg, int parm)
} }
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
release_hotkey (b->text); release_hotkey (b->text);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -182,7 +182,7 @@ button_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
button_event (Gpm_Event * event, void *data) button_event (Gpm_Event * event, void *data)
{ {
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
@ -192,8 +192,8 @@ button_event (Gpm_Event * event, void *data)
dlg_select_widget (w); dlg_select_widget (w);
if ((event->type & GPM_UP) != 0) if ((event->type & GPM_UP) != 0)
{ {
button_callback (w, WIDGET_KEY, ' '); send_message (w, NULL, MSG_KEY, ' ', NULL);
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL); send_message (w->owner, w, MSG_POST_KEY, ' ', NULL);
} }
} }
@ -208,17 +208,18 @@ WButton *
button_new (int y, int x, int action, button_flags_t flags, const char *text, bcback_fn callback) button_new (int y, int x, int action, button_flags_t flags, const char *text, bcback_fn callback)
{ {
WButton *b; WButton *b;
Widget *w;
b = g_new (WButton, 1); b = g_new (WButton, 1);
w = WIDGET (b);
b->action = action; b->action = action;
b->flags = flags; b->flags = flags;
b->text = parse_hotkey (text); b->text = parse_hotkey (text);
init_widget (w, y, x, 1, button_get_len (b), button_callback, button_event);
init_widget (&b->widget, y, x, 1, button_get_len (b), button_callback, button_event);
b->selected = FALSE; b->selected = FALSE;
b->callback = callback; b->callback = callback;
widget_want_hotkey (b->widget, TRUE); widget_want_hotkey (w, TRUE);
b->hotpos = (b->text.hotkey != NULL) ? str_term_width1 (b->text.start) : -1; b->hotpos = (b->text.hotkey != NULL) ? str_term_width1 (b->text.start) : -1;
return b; return b;
@ -239,10 +240,13 @@ button_get_text (const WButton * b)
void void
button_set_text (WButton * b, const char *text) button_set_text (WButton * b, const char *text)
{ {
Widget *w = WIDGET (b);
release_hotkey (b->text); release_hotkey (b->text);
b->text = parse_hotkey (text); b->text = parse_hotkey (text);
b->widget.cols = button_get_len (b); w->cols = button_get_len (b);
dlg_redraw (b->widget.owner); if (w->owner != NULL)
send_message (w, NULL, MSG_DRAW, 0, NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -8,6 +8,7 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define BUTTON(x) ((WButton *)(x))
struct WButton; struct WButton;

Просмотреть файл

@ -148,42 +148,41 @@ static gboolean
buttonbar_call (WButtonBar * bb, int i) buttonbar_call (WButtonBar * bb, int i)
{ {
cb_ret_t ret = MSG_NOT_HANDLED; cb_ret_t ret = MSG_NOT_HANDLED;
Widget *w = WIDGET (bb);
if ((bb != NULL) && (bb->labels[i].command != CK_IgnoreKey)) if ((bb != NULL) && (bb->labels[i].command != CK_IgnoreKey))
ret = bb->widget.owner->callback (bb->widget.owner, ret = send_message (w->owner, w, MSG_ACTION, bb->labels[i].command, bb->labels[i].receiver);
(Widget *) bb, DLG_ACTION,
bb->labels[i].command, bb->labels[i].receiver);
return ret; return ret;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
buttonbar_callback (Widget * w, widget_msg_t msg, int parm) buttonbar_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WButtonBar *bb = (WButtonBar *) w; WButtonBar *bb = BUTTONBAR (w);
int i; int i;
const char *text; const char *text;
switch (msg) switch (msg)
{ {
case WIDGET_FOCUS: case MSG_FOCUS:
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_HOTKEY: case MSG_HOTKEY:
for (i = 0; i < BUTTONBAR_LABELS_NUM; i++) for (i = 0; i < BUTTONBAR_LABELS_NUM; i++)
if (parm == KEY_F (i + 1) && buttonbar_call (bb, i)) if (parm == KEY_F (i + 1) && buttonbar_call (bb, i))
return MSG_HANDLED; return MSG_HANDLED;
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
if (bb->visible) if (bb->visible)
{ {
buttonbar_init_button_positions (bb); buttonbar_init_button_positions (bb);
widget_move (&bb->widget, 0, 0); widget_move (w, 0, 0);
tty_setcolor (DEFAULT_COLOR); tty_setcolor (DEFAULT_COLOR);
tty_printf ("%-*s", bb->widget.cols, ""); tty_printf ("%-*s", w->cols, "");
widget_move (&bb->widget, 0, 0); widget_move (w, 0, 0);
for (i = 0; i < BUTTONBAR_LABELS_NUM; i++) for (i = 0; i < BUTTONBAR_LABELS_NUM; i++)
{ {
@ -203,13 +202,13 @@ buttonbar_callback (Widget * w, widget_msg_t msg, int parm)
} }
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
for (i = 0; i < BUTTONBAR_LABELS_NUM; i++) for (i = 0; i < BUTTONBAR_LABELS_NUM; i++)
g_free (bb->labels[i].text); g_free (bb->labels[i].text);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -218,14 +217,14 @@ buttonbar_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
buttonbar_event (Gpm_Event * event, void *data) buttonbar_event (Gpm_Event * event, void *data)
{ {
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
if ((event->type & GPM_UP) != 0) if ((event->type & GPM_UP) != 0)
{ {
WButtonBar *bb = (WButtonBar *) data; WButtonBar *bb = BUTTONBAR (data);
Gpm_Event local; Gpm_Event local;
int button; int button;
@ -246,14 +245,16 @@ WButtonBar *
buttonbar_new (gboolean visible) buttonbar_new (gboolean visible)
{ {
WButtonBar *bb; WButtonBar *bb;
Widget *w;
bb = g_new0 (WButtonBar, 1); bb = g_new0 (WButtonBar, 1);
w = WIDGET (bb);
init_widget (w, LINES - 1, 0, 1, COLS, buttonbar_callback, buttonbar_event);
init_widget (&bb->widget, LINES - 1, 0, 1, COLS, buttonbar_callback, buttonbar_event); w->pos_flags = WPOS_KEEP_HORZ | WPOS_KEEP_BOTTOM;
bb->widget.pos_flags = WPOS_KEEP_HORZ | WPOS_KEEP_BOTTOM;
bb->visible = visible; bb->visible = visible;
widget_want_hotkey (bb->widget, 1); widget_want_hotkey (w, TRUE);
widget_want_cursor (bb->widget, 0); widget_want_cursor (w, FALSE);
return bb; return bb;
} }
@ -277,7 +278,7 @@ buttonbar_set_label (WButtonBar * bb, int idx, const char *text,
set_label_text (bb, idx, text); set_label_text (bb, idx, text);
bb->labels[idx - 1].command = command; bb->labels[idx - 1].command = command;
bb->labels[idx - 1].receiver = (Widget *) receiver; bb->labels[idx - 1].receiver = WIDGET (receiver);
} }
} }
@ -285,7 +286,7 @@ buttonbar_set_label (WButtonBar * bb, int idx, const char *text,
/* Find ButtonBar widget in the dialog */ /* Find ButtonBar widget in the dialog */
WButtonBar * WButtonBar *
find_buttonbar (const Dlg_head * h) find_buttonbar (const WDialog * h)
{ {
return (WButtonBar *) find_widget_type (h, buttonbar_callback); return BUTTONBAR (find_widget_type (h, buttonbar_callback));
} }

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define BUTTONBAR(x) ((WButtonBar *)(x))
/* number of bttons in buttonbar */ /* number of bttons in buttonbar */
#define BUTTONBAR_LABELS_NUM 10 #define BUTTONBAR_LABELS_NUM 10
@ -41,7 +43,7 @@ struct global_keymap_t;
WButtonBar *buttonbar_new (gboolean visible); WButtonBar *buttonbar_new (gboolean visible);
void buttonbar_set_label (WButtonBar * bb, int idx, const char *text, void buttonbar_set_label (WButtonBar * bb, int idx, const char *text,
const struct global_keymap_t *keymap, const Widget * receiver); const struct global_keymap_t *keymap, const Widget * receiver);
WButtonBar *find_buttonbar (const Dlg_head * h); WButtonBar *find_buttonbar (const WDialog * h);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/
@ -49,7 +51,7 @@ static inline void
buttonbar_redraw (WButtonBar * bb) buttonbar_redraw (WButtonBar * bb)
{ {
if (bb != NULL) if (bb != NULL)
send_message ((Widget *) bb, WIDGET_DRAW, 0); send_message (bb, NULL, MSG_DRAW, 0, NULL);
} }
static inline void static inline void

Просмотреть файл

@ -54,52 +54,52 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
check_callback (Widget * w, widget_msg_t msg, int parm) check_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WCheck *c = (WCheck *) w; WCheck *c = CHECK (w);
Dlg_head *h = c->widget.owner;
switch (msg) switch (msg)
{ {
case WIDGET_HOTKEY: case MSG_HOTKEY:
if (c->text.hotkey != NULL) if (c->text.hotkey != NULL)
{ {
if (g_ascii_tolower ((gchar) c->text.hotkey[0]) == parm) if (g_ascii_tolower ((gchar) c->text.hotkey[0]) == parm)
{ {
check_callback (w, WIDGET_KEY, ' '); /* make action */ /* make action */
send_message (w, sender, MSG_KEY, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
} }
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_KEY: case MSG_KEY:
if (parm != ' ') if (parm != ' ')
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
c->state ^= C_BOOL; c->state ^= C_BOOL;
c->state ^= C_CHANGE; c->state ^= C_CHANGE;
h->callback (h, w, DLG_ACTION, 0, NULL); send_message (WIDGET (w)->owner, w, MSG_ACTION, 0, NULL);
check_callback (w, WIDGET_FOCUS, ' '); send_message (w, sender, MSG_FOCUS, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
widget_move (&c->widget, 0, 1); widget_move (c, 0, 1);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_DRAW: case MSG_DRAW:
widget_selectcolor (w, msg == WIDGET_FOCUS, FALSE); widget_selectcolor (w, msg == MSG_FOCUS, FALSE);
widget_move (&c->widget, 0, 0); widget_move (c, 0, 0);
tty_print_string ((c->state & C_BOOL) ? "[x] " : "[ ] "); tty_print_string ((c->state & C_BOOL) ? "[x] " : "[ ] ");
hotkey_draw (w, c->text, msg == WIDGET_FOCUS); hotkey_draw (w, c->text, msg == MSG_FOCUS);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
release_hotkey (c->text); release_hotkey (c->text);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -108,7 +108,7 @@ check_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
check_event (Gpm_Event * event, void *data) check_event (Gpm_Event * event, void *data)
{ {
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
@ -118,9 +118,9 @@ check_event (Gpm_Event * event, void *data)
dlg_select_widget (w); dlg_select_widget (w);
if ((event->type & GPM_UP) != 0) if ((event->type & GPM_UP) != 0)
{ {
check_callback (w, WIDGET_KEY, ' '); send_message (w, NULL, MSG_KEY, ' ', NULL);
check_callback (w, WIDGET_FOCUS, 0); send_message (w, NULL, MSG_FOCUS, 0, NULL);
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL); send_message (w->owner, w, MSG_POST_KEY, ' ', NULL);
} }
} }
@ -135,13 +135,17 @@ WCheck *
check_new (int y, int x, int state, const char *text) check_new (int y, int x, int state, const char *text)
{ {
WCheck *c; WCheck *c;
Widget *w;
c = g_new (WCheck, 1); c = g_new (WCheck, 1);
w = WIDGET (c);
c->text = parse_hotkey (text); c->text = parse_hotkey (text);
init_widget (&c->widget, y, x, 1, 4 + hotkey_width (c->text), check_callback, check_event); init_widget (w, y, x, 1, 4 + hotkey_width (c->text), check_callback, check_event);
/* 4 is width of "[X] " */ /* 4 is width of "[X] " */
c->state = state ? C_BOOL : 0; c->state = state ? C_BOOL : 0;
widget_want_hotkey (c->widget, TRUE); widget_want_hotkey (w, TRUE);
return c; return c;
} }
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define CHECK(x) ((WCheck *)(x))
#define C_BOOL 0x0001 #define C_BOOL 0x0001
#define C_CHANGE 0x0002 #define C_CHANGE 0x0002

Просмотреть файл

@ -43,7 +43,7 @@
/*** global variables ****************************************************************************/ /*** global variables ****************************************************************************/
Dlg_head *midnight_dlg = NULL; WDialog *midnight_dlg = NULL;
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
@ -75,7 +75,7 @@ dialog_switch_suspend (void *data, void *user_data)
(void) user_data; (void) user_data;
if (data != mc_current->data) if (data != mc_current->data)
((Dlg_head *) data)->state = DLG_SUSPENDED; DIALOG (data)->state = DLG_SUSPENDED;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -85,7 +85,7 @@ dialog_switch_goto (GList * dlg)
{ {
if (mc_current != dlg) if (mc_current != dlg)
{ {
Dlg_head *old = (Dlg_head *) mc_current->data; WDialog *old = DIALOG (mc_current->data);
mc_current = dlg; mc_current = dlg;
@ -100,7 +100,7 @@ dialog_switch_goto (GList * dlg)
/* switch from editor, viewer, etc to another dialog */ /* switch from editor, viewer, etc to another dialog */
old->state = DLG_SUSPENDED; old->state = DLG_SUSPENDED;
if ((Dlg_head *) dlg->data != midnight_dlg) if (DIALOG (dlg->data) != midnight_dlg)
/* switch to another editor, viewer, etc */ /* switch to another editor, viewer, etc */
/* return to panels before run the required dialog */ /* return to panels before run the required dialog */
dialog_switch_pending = TRUE; dialog_switch_pending = TRUE;
@ -119,11 +119,11 @@ dialog_switch_goto (GList * dlg)
static void static void
dlg_resize_cb (void *data, void *user_data) dlg_resize_cb (void *data, void *user_data)
{ {
Dlg_head *d = data; WDialog *d = data;
(void) user_data; (void) user_data;
if (d->state == DLG_ACTIVE) if (d->state == DLG_ACTIVE)
d->callback (d, NULL, DLG_RESIZE, 0, NULL); send_message (d, NULL, MSG_RESIZE, 0, NULL);
else else
d->winch_pending = TRUE; d->winch_pending = TRUE;
} }
@ -133,7 +133,7 @@ dlg_resize_cb (void *data, void *user_data)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
dialog_switch_add (Dlg_head * h) dialog_switch_add (WDialog * h)
{ {
GList *dlg; GList *dlg;
@ -154,11 +154,11 @@ dialog_switch_add (Dlg_head * h)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
dialog_switch_remove (Dlg_head * h) dialog_switch_remove (WDialog * h)
{ {
GList *this; GList *this;
if ((Dlg_head *) mc_current->data == h) if (DIALOG (mc_current->data) == h)
this = mc_current; this = mc_current;
else else
this = g_list_find (mc_dialogs, h); this = g_list_find (mc_dialogs, h);
@ -167,13 +167,13 @@ dialog_switch_remove (Dlg_head * h)
/* adjust current dialog */ /* adjust current dialog */
if (top_dlg != NULL) if (top_dlg != NULL)
mc_current = g_list_find (mc_dialogs, (Dlg_head *) top_dlg->data); mc_current = g_list_find (mc_dialogs, DIALOG (top_dlg->data));
else else
mc_current = mc_dialogs; mc_current = mc_dialogs;
/* resume forced the current screen */ /* resume forced the current screen */
if (mc_current != NULL) if (mc_current != NULL)
((Dlg_head *) mc_current->data)->state = DLG_ACTIVE; DIALOG (mc_current->data)->state = DLG_ACTIVE;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -240,13 +240,13 @@ dialog_switch_list (void)
for (h = mc_dialogs; h != NULL; h = g_list_next (h)) for (h = mc_dialogs; h != NULL; h = g_list_next (h))
{ {
Dlg_head *dlg; WDialog *dlg;
char *title; char *title;
dlg = (Dlg_head *) h->data; dlg = DIALOG (h->data);
if ((dlg != NULL) && (dlg->get_title != NULL)) if ((dlg != NULL) && (dlg->get_title != NULL))
title = dlg->get_title (dlg, listbox->list->widget.cols - 2); /* FIXME! */ title = dlg->get_title (dlg, WIDGET (listbox->list)->cols - 2);
else else
title = g_strdup (""); title = g_strdup ("");
@ -274,7 +274,7 @@ dialog_switch_process_pending (void)
while (dialog_switch_pending) while (dialog_switch_pending)
{ {
Dlg_head *h = (Dlg_head *) mc_current->data; WDialog *h = DIALOG (mc_current->data);
dialog_switch_pending = FALSE; dialog_switch_pending = FALSE;
h->state = DLG_SUSPENDED; h->state = DLG_SUSPENDED;
@ -306,7 +306,7 @@ dialog_switch_got_winch (void)
for (dlg = mc_dialogs; dlg != NULL; dlg = g_list_next (dlg)) for (dlg = mc_dialogs; dlg != NULL; dlg = g_list_next (dlg))
if (dlg != mc_current) if (dlg != mc_current)
((Dlg_head *) dlg->data)->winch_pending = TRUE; DIALOG (dlg->data)->winch_pending = TRUE;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -316,7 +316,7 @@ dialog_switch_shutdown (void)
{ {
while (mc_dialogs != NULL) while (mc_dialogs != NULL)
{ {
Dlg_head *dlg = (Dlg_head *) mc_dialogs->data; WDialog *dlg = DIALOG (mc_dialogs->data);
run_dlg (dlg); run_dlg (dlg);
destroy_dlg (dlg); destroy_dlg (dlg);

Просмотреть файл

@ -12,12 +12,12 @@
/*** global variables defined in .c file *********************************************************/ /*** global variables defined in .c file *********************************************************/
extern Dlg_head *midnight_dlg; extern WDialog *midnight_dlg;
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
void dialog_switch_add (struct Dlg_head *h); void dialog_switch_add (struct WDialog *h);
void dialog_switch_remove (struct Dlg_head *h); void dialog_switch_remove (struct WDialog *h);
size_t dialog_switch_num (void); size_t dialog_switch_num (void);
void dialog_switch_next (void); void dialog_switch_next (void);

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -16,7 +16,9 @@
#include "lib/keybind.h" /* global_keymap_t */ #include "lib/keybind.h" /* global_keymap_t */
#include "lib/tty/mouse.h" /* mouse_h */ #include "lib/tty/mouse.h" /* mouse_h */
/*** defined constants ***************************************************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define DIALOG(x) ((WDialog *)(x))
/* Common return values */ /* Common return values */
#define B_EXIT 0 #define B_EXIT 0
@ -25,39 +27,16 @@
#define B_HELP 3 #define B_HELP 3
#define B_USER 100 #define B_USER 100
#define dlg_move(h, _y, _x) tty_gotoyx (((Dlg_head *)(h))->y + (_y), ((Dlg_head *)(h))->x + (_x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/* Dialog messages */
typedef enum
{
DLG_INIT = 0, /* Initialize dialog */
DLG_IDLE = 1, /* The idle state is active */
DLG_DRAW = 2, /* Draw dialog on screen */
DLG_FOCUS = 3, /* A widget has got focus */
DLG_UNFOCUS = 4, /* A widget has been unfocused */
DLG_RESIZE = 5, /* Window size has changed */
DLG_KEY = 6, /* Key before sending to widget */
DLG_HOTKEY_HANDLED = 7, /* A widget has got the hotkey */
DLG_POST_KEY = 8, /* The key has been handled */
DLG_UNHANDLED_KEY = 9, /* Key that no widget handled */
DLG_ACTION = 10, /* State of check- and radioboxes has changed
* and listbox current entry has changed */
DLG_VALIDATE = 11, /* Dialog is to be closed */
DLG_END = 12 /* Shut down dialog */
} dlg_msg_t;
/* Flags for create_dlg */ /* Flags for create_dlg */
typedef enum typedef enum
{ {
DLG_REVERSE = (1 << 5), /* Tab order is opposite to the add order */ DLG_NONE = 0, /* No options */
DLG_WANT_TAB = (1 << 4), /* Should the tab key be sent to the dialog? */
DLG_WANT_IDLE = (1 << 3), /* Dialog wants idle events */
DLG_COMPACT = (1 << 2), /* Suppress spaces around the frame */
DLG_TRYUP = (1 << 1), /* Try to move two lines up the dialog */
DLG_CENTER = (1 << 0), /* Center the dialog */ DLG_CENTER = (1 << 0), /* Center the dialog */
DLG_NONE = 0 /* No options */ DLG_TRYUP = (1 << 1), /* Try to move two lines up the dialog */
DLG_COMPACT = (1 << 2), /* Suppress spaces around the frame */
DLG_WANT_TAB = (1 << 3) /* Should the tab key be sent to the dialog? */
} dlg_flags_t; } dlg_flags_t;
/* Dialog state */ /* Dialog state */
@ -87,20 +66,19 @@ typedef enum
typedef char *(*dlg_shortcut_str) (unsigned long command); typedef char *(*dlg_shortcut_str) (unsigned long command);
/* get dialog name to show in dialog list */ /* get dialog name to show in dialog list */
typedef char *(*dlg_title_str) (const Dlg_head * h, size_t len); typedef char *(*dlg_title_str) (const WDialog * h, size_t len);
typedef int dlg_colors_t[DLG_COLOR_COUNT]; typedef int dlg_colors_t[DLG_COLOR_COUNT];
/* Dialog callback */
typedef cb_ret_t (*dlg_cb_fn) (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data);
/* menu command execution */ /* menu command execution */
typedef cb_ret_t (*menu_exec_fn) (int command); typedef cb_ret_t (*menu_exec_fn) (int command);
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
struct Dlg_head struct WDialog
{ {
Widget widget;
/* Set by the user */ /* Set by the user */
gboolean modal; /* type of dialog: modal or not */ gboolean modal; /* type of dialog: modal or not */
dlg_flags_t flags; /* User flags */ dlg_flags_t flags; /* User flags */
@ -111,10 +89,6 @@ struct Dlg_head
/* Set and received by the user */ /* Set and received by the user */
int ret_value; /* Result of run_dlg() */ int ret_value; /* Result of run_dlg() */
/* Geometry */
int x, y; /* Position relative to screen origin */
int cols, lines; /* Width and height of the window */
/* Internal flags */ /* Internal flags */
dlg_state_t state; dlg_state_t state;
gboolean fullscreen; /* Parents dialogs don't need refresh */ gboolean fullscreen; /* Parents dialogs don't need refresh */
@ -128,8 +102,6 @@ struct Dlg_head
void *data; /* Data can be passed to dialog */ void *data; /* Data can be passed to dialog */
char *event_group; /* Name of event group for this dialog */ char *event_group; /* Name of event group for this dialog */
dlg_cb_fn callback;
mouse_h mouse;
dlg_shortcut_str get_shortcut; /* Shortcut string */ dlg_shortcut_str get_shortcut; /* Shortcut string */
dlg_title_str get_title; /* useless for modal dialogs */ dlg_title_str get_title; /* useless for modal dialogs */
}; };
@ -153,70 +125,67 @@ extern const global_keymap_t *dialog_map;
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
/* draw box in window */ /* draw box in window */
void draw_box (Dlg_head * h, int y, int x, int ys, int xs, gboolean single); void draw_box (const WDialog * h, int y, int x, int ys, int xs, gboolean single);
/* Creates a dialog head */ /* Creates a dialog head */
Dlg_head *create_dlg (gboolean modal, int y1, int x1, int lines, int cols, WDialog *create_dlg (gboolean modal, int y1, int x1, int lines, int cols,
const int *colors, dlg_cb_fn callback, mouse_h mouse_handler, const int *colors, widget_cb_fn callback, mouse_h mouse_handler,
const char *help_ctx, const char *title, dlg_flags_t flags); const char *help_ctx, const char *title, dlg_flags_t flags);
void dlg_set_default_colors (void); void dlg_set_default_colors (void);
unsigned long add_widget_autopos (Dlg_head * dest, void *w, widget_pos_flags_t pos_flags, unsigned long add_widget_autopos (WDialog * dest, void *w, widget_pos_flags_t pos_flags,
const void *before); const void *before);
unsigned long add_widget (Dlg_head * dest, void *w); unsigned long add_widget (WDialog * dest, void *w);
unsigned long add_widget_before (Dlg_head * h, void *w, void *before); unsigned long add_widget_before (WDialog * h, void *w, void *before);
void del_widget (void *w); void del_widget (void *w);
/* sets size of dialog, leaving positioning to automatic mehtods /* sets size of dialog, leaving positioning to automatic mehtods
according to dialog flags */ according to dialog flags */
void dlg_set_size (Dlg_head * h, int lines, int cols); void dlg_set_size (WDialog * h, int lines, int cols);
/* this function allows to set dialog position */ /* this function allows to set dialog position */
void dlg_set_position (Dlg_head * h, int y1, int x1, int y2, int x2); void dlg_set_position (WDialog * h, int y1, int x1, int y2, int x2);
void init_dlg (Dlg_head * h); void init_dlg (WDialog * h);
int run_dlg (Dlg_head * d); int run_dlg (WDialog * d);
void destroy_dlg (Dlg_head * h); void destroy_dlg (WDialog * h);
void dlg_run_done (Dlg_head * h); void dlg_run_done (WDialog * h);
void dlg_save_history (Dlg_head * h); void dlg_save_history (WDialog * h);
void dlg_process_event (Dlg_head * h, int key, Gpm_Event * event); void dlg_process_event (WDialog * h, int key, Gpm_Event * event);
char *dlg_get_title (const Dlg_head * h, size_t len); char *dlg_get_title (const WDialog * h, size_t len);
/* To activate/deactivate the idle message generation */ void dlg_redraw (WDialog * h);
void set_idle_proc (Dlg_head * d, int enable);
void dlg_redraw (Dlg_head * h); void dlg_broadcast_msg (WDialog * h, widget_msg_t message);
void dlg_broadcast_msg (Dlg_head * h, widget_msg_t message, gboolean reverse);
/* Default callback for dialogs */ /* Default callback for dialogs */
cb_ret_t default_dlg_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data); cb_ret_t dlg_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data);
/* Default paint routine for dialogs */ /* Default paint routine for dialogs */
void common_dialog_repaint (Dlg_head * h); void dlg_default_repaint (WDialog * h);
void dlg_replace_widget (Widget * old, Widget * new); void dlg_replace_widget (Widget * old, Widget * new);
int dlg_overlap (Widget * a, Widget * b); int dlg_overlap (Widget * a, Widget * b);
void dlg_erase (Dlg_head * h); void dlg_erase (WDialog * h);
void dlg_stop (Dlg_head * h); void dlg_stop (WDialog * h);
/* Widget selection */ /* Widget selection */
void dlg_select_widget (void *w); void dlg_select_widget (void *w);
void dlg_set_top_widget (void *w); void dlg_set_top_widget (void *w);
void dlg_one_up (Dlg_head * h); void dlg_one_up (WDialog * h);
void dlg_one_down (Dlg_head * h); void dlg_one_down (WDialog * h);
gboolean dlg_focus (Dlg_head * h); gboolean dlg_focus (WDialog * h);
Widget *find_widget_type (const Dlg_head * h, callback_fn callback); Widget *find_widget_type (const WDialog * h, widget_cb_fn callback);
Widget *dlg_find_by_id (const Dlg_head * h, unsigned long id); Widget *dlg_find_by_id (const WDialog * h, unsigned long id);
void dlg_select_by_id (const Dlg_head * h, unsigned long id); void dlg_select_by_id (const WDialog * h, unsigned long id);
/* Redraw all dialogs */ /* Redraw all dialogs */
void do_refresh (void); void do_refresh (void);
/* Used in load_prompt() */ /* Used in load_prompt() */
void update_cursor (Dlg_head * h); void update_cursor (WDialog * h);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/
@ -224,16 +193,15 @@ void update_cursor (Dlg_head * h);
static inline gboolean static inline gboolean
dlg_widget_active (void *w) dlg_widget_active (void *w)
{ {
Widget *w1 = (Widget *) w; return (w == WIDGET (w)->owner->current->data);
return ((Widget *) w1->owner->current->data == w1);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static inline unsigned long static inline unsigned long
dlg_get_current_widget_id (const struct Dlg_head *h) dlg_get_current_widget_id (const struct WDialog *h)
{ {
return ((Widget *) h->current->data)->id; return WIDGET (h->current->data)->id;
} }
#endif /* MC__DIALOG_H */ #endif /* MC__DIALOG_H */

Просмотреть файл

@ -59,21 +59,21 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
gauge_callback (Widget * w, widget_msg_t msg, int parm) gauge_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WGauge *g = (WGauge *) w; WGauge *g = GAUGE (w);
Dlg_head *h = g->widget.owner; WDialog *h = w->owner;
if (msg == WIDGET_INIT) if (msg == MSG_INIT)
return MSG_HANDLED; return MSG_HANDLED;
/* We don't want to get the focus */ /* We don't want to get the focus */
if (msg == WIDGET_FOCUS) if (msg == MSG_FOCUS)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
if (msg == WIDGET_DRAW) if (msg == MSG_DRAW)
{ {
widget_move (&g->widget, 0, 0); widget_move (w, 0, 0);
tty_setcolor (h->color[DLG_COLOR_NORMAL]); tty_setcolor (h->color[DLG_COLOR_NORMAL]);
if (!g->shown) if (!g->shown)
tty_printf ("%*s", gauge_len, ""); tty_printf ("%*s", gauge_len, "");
@ -118,7 +118,7 @@ gauge_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
} }
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -129,9 +129,11 @@ WGauge *
gauge_new (int y, int x, gboolean shown, int max, int current) gauge_new (int y, int x, gboolean shown, int max, int current)
{ {
WGauge *g; WGauge *g;
Widget *w;
g = g_new (WGauge, 1); g = g_new (WGauge, 1);
init_widget (&g->widget, y, x, 1, gauge_len, gauge_callback, NULL); w = WIDGET (g);
init_widget (w, y, x, 1, gauge_len, gauge_callback, NULL);
g->shown = shown; g->shown = shown;
if (max == 0) if (max == 0)
@ -140,8 +142,8 @@ gauge_new (int y, int x, gboolean shown, int max, int current)
g->current = current; g->current = current;
g->from_left_to_right = TRUE; g->from_left_to_right = TRUE;
widget_want_cursor (g->widget, FALSE); widget_want_cursor (w, FALSE);
widget_want_hotkey (g->widget, FALSE); widget_want_hotkey (w, FALSE);
return g; return g;
} }
@ -158,7 +160,7 @@ gauge_set_value (WGauge * g, int max, int current)
max = 1; /* I do not like division by zero :) */ max = 1; /* I do not like division by zero :) */
g->current = current; g->current = current;
g->max = max; g->max = max;
gauge_callback ((Widget *) g, WIDGET_DRAW, 0); gauge_callback (WIDGET (g), NULL, MSG_DRAW, 0, NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -169,7 +171,7 @@ gauge_show (WGauge * g, gboolean shown)
if (g->shown != shown) if (g->shown != shown)
{ {
g->shown = shown; g->shown = shown;
gauge_callback ((Widget *) g, WIDGET_DRAW, 0); gauge_callback (WIDGET (g), NULL, MSG_DRAW, 0, NULL);
} }
} }

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define GAUGE(x) ((WGauge *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/

Просмотреть файл

@ -53,41 +53,41 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
groupbox_callback (Widget * w, widget_msg_t msg, int parm) groupbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WGroupbox *g = (WGroupbox *) w; WGroupbox *g = GROUPBOX (w);
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_FOCUS: case MSG_FOCUS:
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
{ {
Widget *wo = WIDGET (w->owner);
gboolean disabled = (w->options & W_DISABLED) != 0; gboolean disabled = (w->options & W_DISABLED) != 0;
tty_setcolor (disabled ? DISABLED_COLOR : COLOR_NORMAL); tty_setcolor (disabled ? DISABLED_COLOR : COLOR_NORMAL);
draw_box (g->widget.owner, g->widget.y - g->widget.owner->y, draw_box (w->owner, w->y - wo->y, w->x - wo->x, w->lines, w->cols, TRUE);
g->widget.x - g->widget.owner->x, g->widget.lines, g->widget.cols, TRUE);
if (g->title != NULL) if (g->title != NULL)
{ {
tty_setcolor (disabled ? DISABLED_COLOR : COLOR_TITLE); tty_setcolor (disabled ? DISABLED_COLOR : COLOR_TITLE);
dlg_move (g->widget.owner, g->widget.y - g->widget.owner->y, widget_move (w->owner, w->y - wo->y, w->x - wo->x + 1);
g->widget.x - g->widget.owner->x + 1);
tty_print_string (g->title); tty_print_string (g->title);
} }
return MSG_HANDLED; return MSG_HANDLED;
} }
case WIDGET_DESTROY: case MSG_DESTROY:
g_free (g->title); g_free (g->title);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -99,15 +99,33 @@ WGroupbox *
groupbox_new (int y, int x, int height, int width, const char *title) groupbox_new (int y, int x, int height, int width, const char *title)
{ {
WGroupbox *g; WGroupbox *g;
Widget *w;
g = g_new (WGroupbox, 1); g = g_new (WGroupbox, 1);
init_widget (&g->widget, y, x, height, width, groupbox_callback, NULL); w = WIDGET (g);
init_widget (w, y, x, height, width, groupbox_callback, NULL);
widget_want_cursor (g->widget, FALSE); widget_want_cursor (w, FALSE);
widget_want_hotkey (g->widget, FALSE); widget_want_hotkey (w, FALSE);
g->title = NULL;
groupbox_set_title (g, title);
return g;
}
/* --------------------------------------------------------------------------------------------- */
void
groupbox_set_title (WGroupbox *g, const char *title)
{
Widget *w = WIDGET (g);
g_free (g->title);
g->title = NULL;
/* Strip existing spaces, add one space before and after the title */ /* Strip existing spaces, add one space before and after the title */
if (title != NULL) if (title != NULL && *title != '\0')
{ {
char *t; char *t;
@ -116,7 +134,8 @@ groupbox_new (int y, int x, int height, int width, const char *title)
g_free (t); g_free (t);
} }
return g; if (w->owner != NULL)
send_message (w, NULL, MSG_DRAW, 0, NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define GROUPBOX(x) ((WGroupbox *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
@ -23,6 +25,7 @@ typedef struct WGroupbox
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
WGroupbox *groupbox_new (int y, int x, int height, int width, const char *title); WGroupbox *groupbox_new (int y, int x, int height, int width, const char *title);
void groupbox_set_title (WGroupbox *g, const char *title);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/

Просмотреть файл

@ -73,7 +73,7 @@ typedef struct
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
history_dlg_reposition (Dlg_head * dlg_head) history_dlg_reposition (WDialog * dlg_head)
{ {
history_dlg_data *data; history_dlg_data *data;
int x = 0, y, he, wi; int x = 0, y, he, wi;
@ -117,15 +117,15 @@ history_dlg_reposition (Dlg_head * dlg_head)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
history_dlg_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) history_dlg_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
switch (msg) switch (msg)
{ {
case DLG_RESIZE: case MSG_RESIZE:
return history_dlg_reposition (h); return history_dlg_reposition (DIALOG (w));
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
@ -292,7 +292,7 @@ history_show (GList ** history, Widget * widget, int current)
GList *z, *hlist = NULL, *hi; GList *z, *hlist = NULL, *hi;
size_t maxlen, i, count = 0; size_t maxlen, i, count = 0;
char *r = NULL; char *r = NULL;
Dlg_head *query_dlg; WDialog *query_dlg;
WListbox *query_list; WListbox *query_list;
history_dlg_data hist_data; history_dlg_data hist_data;
@ -336,9 +336,9 @@ history_show (GList ** history, Widget * widget, int current)
The main idea - create 4x4 dialog and add 2x2 list in The main idea - create 4x4 dialog and add 2x2 list in
center of it, and let dialog function resize it to needed center of it, and let dialog function resize it to needed
size. */ size. */
history_dlg_callback (query_dlg, NULL, DLG_RESIZE, 0, NULL); send_message (query_dlg, NULL, MSG_RESIZE, 0, NULL);
if (query_dlg->y < widget->y) if (WIDGET (query_dlg)->y < widget->y)
{ {
/* draw list entries from bottom upto top */ /* draw list entries from bottom upto top */
listbox_set_list (query_list, hlist); listbox_set_list (query_list, hlist);
@ -369,16 +369,15 @@ history_show (GList ** history, Widget * widget, int current)
z = NULL; z = NULL;
for (hi = query_list->list; hi != NULL; hi = g_list_next (hi)) for (hi = query_list->list; hi != NULL; hi = g_list_next (hi))
{ {
WLEntry *entry; WLEntry *entry = LENTRY (hi->data);
entry = (WLEntry *) hi->data;
/* history is being reverted here again */ /* history is being reverted here again */
z = g_list_prepend (z, entry->text); z = g_list_prepend (z, entry->text);
entry->text = NULL; entry->text = NULL;
} }
/* restore history direction */ /* restore history direction */
if (query_dlg->y < widget->y) if (WIDGET (query_dlg)->y < widget->y)
z = g_list_reverse (z); z = g_list_reverse (z);
destroy_dlg (query_dlg); destroy_dlg (query_dlg);

Просмотреть файл

@ -54,34 +54,36 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
hline_callback (Widget * w, widget_msg_t msg, int parm) hline_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WHLine *l = (WHLine *) w; WHLine *l = HLINE (w);
Dlg_head *h = l->widget.owner; WDialog *h = w->owner;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
case WIDGET_RESIZED: case MSG_RESIZE:
if (l->auto_adjust_cols) if (l->auto_adjust_cols)
{ {
if (((w->owner->flags & DLG_COMPACT) != 0)) Widget *wo = WIDGET (h);
if (((h->flags & DLG_COMPACT) != 0))
{ {
w->x = w->owner->x; w->x = wo->x;
w->cols = w->owner->cols; w->cols = wo->cols;
} }
else else
{ {
w->x = w->owner->x + 1; w->x = wo->x + 1;
w->cols = w->owner->cols - 2; w->cols = wo->cols - 2;
} }
} }
case WIDGET_FOCUS: case MSG_FOCUS:
/* We don't want to get the focus */ /* We don't want to get the focus */
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
if (l->transparent) if (l->transparent)
tty_setcolor (DEFAULT_COLOR); tty_setcolor (DEFAULT_COLOR);
else else
@ -99,7 +101,7 @@ hline_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -111,14 +113,16 @@ WHLine *
hline_new (int y, int x, int width) hline_new (int y, int x, int width)
{ {
WHLine *l; WHLine *l;
Widget *w;
int lines = 1; int lines = 1;
l = g_new (WHLine, 1); l = g_new (WHLine, 1);
init_widget (&l->widget, y, x, lines, width, hline_callback, NULL); w = WIDGET (l);
init_widget (w, y, x, lines, width < 0 ? 1 : width, hline_callback, NULL);
l->auto_adjust_cols = (width < 0); l->auto_adjust_cols = (width < 0);
l->transparent = FALSE; l->transparent = FALSE;
widget_want_cursor (l->widget, FALSE); widget_want_cursor (w, FALSE);
widget_want_hotkey (l->widget, FALSE); widget_want_hotkey (w, FALSE);
return l; return l;
} }

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define HLINE(x) ((WHLine *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/

Просмотреть файл

@ -73,7 +73,7 @@ const global_keymap_t *input_map = NULL;
#define should_show_history_button(in) \ #define should_show_history_button(in) \
(in->history != NULL && in->field_width > HISTORY_BUTTON_WIDTH * 2 + 1 \ (in->history != NULL && in->field_width > HISTORY_BUTTON_WIDTH * 2 + 1 \
&& in->widget.owner != NULL) && WIDGET (in)->owner != NULL)
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
@ -103,7 +103,7 @@ static void
draw_history_button (WInput * in) draw_history_button (WInput * in)
{ {
char c; char c;
gboolean disabled = (((Widget *) in)->options & W_DISABLED) != 0; gboolean disabled = (WIDGET (in)->options & W_DISABLED) != 0;
if (g_list_next (in->history_current) == NULL) if (g_list_next (in->history_current) == NULL)
c = '^'; c = '^';
@ -112,12 +112,12 @@ draw_history_button (WInput * in)
else else
c = '|'; c = '|';
widget_move (&in->widget, 0, in->field_width - HISTORY_BUTTON_WIDTH); widget_move (in, 0, in->field_width - HISTORY_BUTTON_WIDTH);
tty_setcolor (disabled ? DISABLED_COLOR : in->color[WINPUTC_HISTORY]); tty_setcolor (disabled ? DISABLED_COLOR : in->color[WINPUTC_HISTORY]);
#ifdef LARGE_HISTORY_BUTTON #ifdef LARGE_HISTORY_BUTTON
tty_print_string ("[ ]"); tty_print_string ("[ ]");
widget_move (&in->widget, 0, in->field_width - HISTORY_BUTTON_WIDTH + 1); widget_move (in, 0, in->field_width - HISTORY_BUTTON_WIDTH + 1);
#endif #endif
tty_print_char (c); tty_print_char (c);
@ -195,8 +195,7 @@ do_show_hist (WInput * in)
len = get_history_length (in->history); len = get_history_length (in->history);
r = history_show (&in->history, &in->widget, r = history_show (&in->history, WIDGET (in), g_list_position (in->history_current, in->history));
g_list_position (in->history_current, in->history));
if (r != NULL) if (r != NULL)
{ {
input_assign_text (in, r); input_assign_text (in, r);
@ -832,7 +831,7 @@ static gboolean
input_load_history (const gchar * event_group_name, const gchar * event_name, input_load_history (const gchar * event_group_name, const gchar * event_name,
gpointer init_data, gpointer data) gpointer init_data, gpointer data)
{ {
WInput *in = (WInput *) init_data; WInput *in = INPUT (init_data);
ev_history_load_save_t *ev = (ev_history_load_save_t *) data; ev_history_load_save_t *ev = (ev_history_load_save_t *) data;
const char *def_text; const char *def_text;
size_t buffer_len; size_t buffer_len;
@ -875,12 +874,12 @@ static gboolean
input_save_history (const gchar * event_group_name, const gchar * event_name, input_save_history (const gchar * event_group_name, const gchar * event_name,
gpointer init_data, gpointer data) gpointer init_data, gpointer data)
{ {
WInput *in = (WInput *) init_data; WInput *in = INPUT (init_data);
(void) event_group_name; (void) event_group_name;
(void) event_name; (void) event_name;
if (!in->is_password && (((Widget *) in)->owner->ret_value != B_CANCEL)) if (!in->is_password && (WIDGET (in)->owner->ret_value != B_CANCEL))
{ {
ev_history_load_save_t *ev = (ev_history_load_save_t *) data; ev_history_load_save_t *ev = (ev_history_load_save_t *) data;
@ -929,8 +928,8 @@ input_destroy (WInput * in)
static int static int
input_event (Gpm_Event * event, void *data) input_event (Gpm_Event * event, void *data)
{ {
WInput *in = (WInput *) data; WInput *in = INPUT (data);
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
@ -972,6 +971,25 @@ input_event (Gpm_Event * event, void *data)
return MOU_NORMAL; return MOU_NORMAL;
} }
/* --------------------------------------------------------------------------------------------- */
/**
* Callback for applying new options to input widget.
*
* @param w widget
* @param options options set
* @param enable TRUE if specified options should be added, FALSE if options should be removed
*/
static void
input_set_options_callback (Widget * w, widget_options_t options, gboolean enable)
{
WInput *in = INPUT (w);
widget_default_set_options_callback (w, options, enable);
if (in->label != NULL)
widget_set_options (WIDGET (in->label), options, enable);
}
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/ /*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -991,10 +1009,13 @@ input_new (int y, int x, const int *input_colors, int width, const char *def_tex
const char *histname, input_complete_t completion_flags) const char *histname, input_complete_t completion_flags)
{ {
WInput *in; WInput *in;
Widget *w;
in = g_new (WInput, 1); in = g_new (WInput, 1);
init_widget (&in->widget, y, x, 1, width, input_callback, input_event); w = WIDGET (in);
in->widget.options |= W_IS_INPUT; init_widget (w, y, x, 1, width, input_callback, input_event);
w->options |= W_IS_INPUT;
w->set_options = input_set_options_callback;
memmove (in->color, input_colors, sizeof (input_colors_t)); memmove (in->color, input_colors, sizeof (input_colors_t));
@ -1026,30 +1047,31 @@ input_new (int y, int x, const int *input_colors, int width, const char *def_tex
in->history_name = NULL; in->history_name = NULL;
if ((histname != NULL) && (*histname != '\0')) if ((histname != NULL) && (*histname != '\0'))
in->history_name = g_strdup (histname); in->history_name = g_strdup (histname);
/* history will be loaded later */ /* history will be loaded later */
in->label = NULL;
return in; return in;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
cb_ret_t cb_ret_t
input_callback (Widget * w, widget_msg_t msg, int parm) input_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WInput *in = (WInput *) w; WInput *in = INPUT (w);
cb_ret_t v; cb_ret_t v;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
/* subscribe to "history_load" event */ /* subscribe to "history_load" event */
mc_event_add (w->owner->event_group, MCEVENT_HISTORY_LOAD, input_load_history, w, NULL); mc_event_add (w->owner->event_group, MCEVENT_HISTORY_LOAD, input_load_history, w, NULL);
/* subscribe to "history_save" event */ /* subscribe to "history_save" event */
mc_event_add (w->owner->event_group, MCEVENT_HISTORY_SAVE, input_save_history, w, NULL); mc_event_add (w->owner->event_group, MCEVENT_HISTORY_SAVE, input_save_history, w, NULL);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_KEY: case MSG_KEY:
if (parm == XCTRL ('q')) if (parm == XCTRL ('q'))
{ {
quote = 1; quote = 1;
@ -1074,21 +1096,21 @@ input_callback (Widget * w, widget_msg_t msg, int parm)
return input_handle_char (in, parm); return input_handle_char (in, parm);
case WIDGET_COMMAND: case MSG_ACTION:
return input_execute_cmd (in, parm); return input_execute_cmd (in, parm);
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_DRAW: case MSG_DRAW:
case MSG_RESIZE:
input_update (in, FALSE); input_update (in, FALSE);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
widget_move (&in->widget, 0, str_term_width2 (in->buffer, in->point) widget_move (in, 0, str_term_width2 (in->buffer, in->point) - in->term_first_shown);
- in->term_first_shown);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
/* unsubscribe from "history_load" event */ /* unsubscribe from "history_load" event */
mc_event_del (w->owner->event_group, MCEVENT_HISTORY_LOAD, input_load_history, w); mc_event_del (w->owner->event_group, MCEVENT_HISTORY_LOAD, input_load_history, w);
/* unsubscribe from "history_save" event */ /* unsubscribe from "history_save" event */
@ -1097,7 +1119,7 @@ input_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -1124,8 +1146,8 @@ input_get_default_colors (void)
void void
input_set_origin (WInput * in, int x, int field_width) input_set_origin (WInput * in, int x, int field_width)
{ {
in->widget.x = x; WIDGET (in)->x = x;
in->field_width = in->widget.cols = field_width; in->field_width = WIDGET (in)->cols = field_width;
input_update (in, FALSE); input_update (in, FALSE);
} }
@ -1268,17 +1290,21 @@ input_update (WInput * in, gboolean clear_first)
/* Adjust the mark */ /* Adjust the mark */
in->mark = min (in->mark, buf_len); in->mark = min (in->mark, buf_len);
/* don't draw widget not put into dialog */
if (WIDGET(in)->owner == NULL)
return;
if (has_history != 0) if (has_history != 0)
draw_history_button (in); draw_history_button (in);
if ((((Widget *) in)->options & W_DISABLED) != 0) if ((WIDGET (in)->options & W_DISABLED) != 0)
tty_setcolor (DISABLED_COLOR); tty_setcolor (DISABLED_COLOR);
else if (in->first) else if (in->first)
tty_setcolor (in->color[WINPUTC_UNCHANGED]); tty_setcolor (in->color[WINPUTC_UNCHANGED]);
else else
tty_setcolor (in->color[WINPUTC_MAIN]); tty_setcolor (in->color[WINPUTC_MAIN]);
widget_move (&in->widget, 0, 0); widget_move (in, 0, 0);
if (!in->is_password) if (!in->is_password)
{ {
@ -1298,7 +1324,7 @@ input_update (WInput * in, gboolean clear_first)
tty_setcolor (in->color[WINPUTC_MARK]); tty_setcolor (in->color[WINPUTC_MARK]);
if (m1 < in->term_first_shown) if (m1 < in->term_first_shown)
{ {
widget_move (&in->widget, 0, 0); widget_move (in, 0, 0);
tty_print_string (str_term_substring tty_print_string (str_term_substring
(in->buffer, in->term_first_shown, (in->buffer, in->term_first_shown,
m2 - in->term_first_shown)); m2 - in->term_first_shown));
@ -1307,7 +1333,7 @@ input_update (WInput * in, gboolean clear_first)
{ {
int sel_width; int sel_width;
widget_move (&in->widget, 0, m1 - in->term_first_shown); widget_move (in, 0, m1 - in->term_first_shown);
sel_width = sel_width =
min (m2 - m1, min (m2 - m1,
(in->field_width - has_history) - (str_term_width2 (in->buffer, m1) - (in->field_width - has_history) - (str_term_width2 (in->buffer, m1) -

Просмотреть файл

@ -10,6 +10,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define INPUT(x) ((WInput *)(x))
/* For history load-save functions */ /* For history load-save functions */
#define INPUT_LAST_TEXT ((char *) 2) #define INPUT_LAST_TEXT ((char *) 2)
@ -68,6 +70,7 @@ typedef struct
input_complete_t completion_flags; input_complete_t completion_flags;
char charbuf[MB_LEN_MAX]; /* buffer for multibytes characters */ char charbuf[MB_LEN_MAX]; /* buffer for multibytes characters */
size_t charpoint; /* point to end of mulibyte sequence in charbuf */ size_t charpoint; /* point to end of mulibyte sequence in charbuf */
WLabel *label; /* label associated with this input line*/
} WInput; } WInput;
/*** global variables defined in .c file *********************************************************/ /*** global variables defined in .c file *********************************************************/
@ -82,7 +85,7 @@ WInput *input_new (int y, int x, const int *input_colors,
int len, const char *text, const char *histname, int len, const char *text, const char *histname,
input_complete_t completion_flags); input_complete_t completion_flags);
/* callbac is public; needed for command line */ /* callbac is public; needed for command line */
cb_ret_t input_callback (Widget * w, widget_msg_t msg, int parm); cb_ret_t input_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data);
const int *input_get_default_colors (void); const int *input_get_default_colors (void);
void input_set_origin (WInput * i, int x, int field_width); void input_set_origin (WInput * i, int x, int field_width);
cb_ret_t input_handle_char (WInput * in, int key); cb_ret_t input_handle_char (WInput * in, int key);

Просмотреть файл

@ -1048,14 +1048,16 @@ insert_text (WInput * in, char *text, ssize_t size)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) query_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
static char buff[MB_LEN_MAX] = ""; static char buff[MB_LEN_MAX] = "";
static int bl = 0; static int bl = 0;
WDialog *h = DIALOG (w);
switch (msg) switch (msg)
{ {
case DLG_KEY: case MSG_KEY:
switch (parm) switch (parm)
{ {
case KEY_LEFT: case KEY_LEFT:
@ -1090,17 +1092,17 @@ query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
new_end = str_get_prev_char (&input->buffer[end]) - input->buffer; new_end = str_get_prev_char (&input->buffer[end]) - input->buffer;
for (i = 0, e = ((WListbox *) h->current->data)->list; for (i = 0, e = LISTBOX (h->current->data)->list;
e != NULL; i++, e = g_list_next (e)) e != NULL; i++, e = g_list_next (e))
{ {
WLEntry *le = (WLEntry *) e->data; WLEntry *le = LENTRY (e->data);
if (strncmp (input->buffer + start, le->text, new_end - start) == 0) if (strncmp (input->buffer + start, le->text, new_end - start) == 0)
{ {
listbox_select_entry ((WListbox *) h->current->data, i); listbox_select_entry (LISTBOX (h->current->data), i);
end = new_end; end = new_end;
input_handle_char (input, parm); input_handle_char (input, parm);
send_message ((Widget *) h->current->data, WIDGET_DRAW, 0); send_message (h->current->data, NULL, MSG_DRAW, 0, NULL);
break; break;
} }
} }
@ -1141,10 +1143,10 @@ query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
return MSG_HANDLED; return MSG_HANDLED;
} }
for (i = 0, e = ((WListbox *) h->current->data)->list; for (i = 0, e = LISTBOX (h->current->data)->list;
e != NULL; i++, e = g_list_next (e)) e != NULL; i++, e = g_list_next (e))
{ {
WLEntry *le = (WLEntry *) e->data; WLEntry *le = LENTRY (e->data);
if (strncmp (input->buffer + start, le->text, end - start) == 0 if (strncmp (input->buffer + start, le->text, end - start) == 0
&& strncmp (&le->text[end - start], buff, bl) == 0) && strncmp (&le->text[end - start], buff, bl) == 0)
@ -1152,7 +1154,7 @@ query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
if (need_redraw == 0) if (need_redraw == 0)
{ {
need_redraw = 1; need_redraw = 1;
listbox_select_entry ((WListbox *) h->current->data, i); listbox_select_entry (LISTBOX (h->current->data), i);
last_text = le->text; last_text = le->text;
} }
else else
@ -1203,7 +1205,7 @@ query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
if (need_redraw == 2) if (need_redraw == 2)
{ {
insert_text (input, last_text, low); insert_text (input, last_text, low);
send_message ((Widget *) h->current->data, WIDGET_DRAW, 0); send_message (h->current->data, NULL, MSG_DRAW, 0, NULL);
} }
else if (need_redraw == 1) else if (need_redraw == 1)
{ {
@ -1217,7 +1219,7 @@ query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
break; break;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
@ -1281,7 +1283,7 @@ complete_engine (WInput * in, int what_to_do)
int x, y, w, h; int x, y, w, h;
int start_x, start_y; int start_x, start_y;
char **p, *q; char **p, *q;
Dlg_head *query_dlg; WDialog *query_dlg;
WListbox *query_list; WListbox *query_list;
for (p = in->completions + 1; *p != NULL; count++, p++) for (p = in->completions + 1; *p != NULL; count++, p++)
@ -1290,8 +1292,8 @@ complete_engine (WInput * in, int what_to_do)
if (i > maxlen) if (i > maxlen)
maxlen = i; maxlen = i;
} }
start_x = in->widget.x; start_x = WIDGET (in)->x;
start_y = in->widget.y; start_y = WIDGET (in)->y;
if (start_y - 2 >= count) if (start_y - 2 >= count)
{ {
y = start_y - 2 - count; y = start_y - 2 - count;

Просмотреть файл

@ -57,39 +57,45 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
label_callback (Widget * w, widget_msg_t msg, int parm) label_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WLabel *l = (WLabel *) w; WLabel *l = LABEL (w);
Dlg_head *h = l->widget.owner; WDialog *h = w->owner;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
return MSG_HANDLED; return MSG_HANDLED;
/* We don't want to get the focus */ /* We don't want to get the focus */
case WIDGET_FOCUS: case MSG_FOCUS:
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
{ {
char *p = l->text; char *p = l->text;
int y = 0; int y = 0;
gboolean disabled = (w->options & W_DISABLED) != 0; gboolean disabled;
align_crt_t align;
if (l->text == NULL) if (l->text == NULL)
return MSG_HANDLED; return MSG_HANDLED;
disabled = (w->options & W_DISABLED) != 0;
if (l->transparent) if (l->transparent)
tty_setcolor (disabled ? DISABLED_COLOR : DEFAULT_COLOR); tty_setcolor (disabled ? DISABLED_COLOR : DEFAULT_COLOR);
else else
tty_setcolor (disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL]); tty_setcolor (disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL]);
align = (w->pos_flags & WPOS_CENTER_HORZ) != 0 ? J_CENTER_LEFT : J_LEFT;
while (TRUE) while (TRUE)
{ {
char *q; char *q;
char c = '\0'; char c = '\0';
q = strchr (p, '\n'); q = strchr (p, '\n');
if (q != NULL) if (q != NULL)
{ {
@ -97,8 +103,8 @@ label_callback (Widget * w, widget_msg_t msg, int parm)
q[0] = '\0'; q[0] = '\0';
} }
widget_move (&l->widget, y, 0); widget_move (w, y, 0);
tty_print_string (str_fit_to_term (p, l->widget.cols, J_LEFT)); tty_print_string (str_fit_to_term (p, w->cols, align));
if (q == NULL) if (q == NULL)
break; break;
@ -110,12 +116,12 @@ label_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
} }
case WIDGET_DESTROY: case MSG_DESTROY:
g_free (l->text); g_free (l->text);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -127,6 +133,7 @@ WLabel *
label_new (int y, int x, const char *text) label_new (int y, int x, const char *text)
{ {
WLabel *l; WLabel *l;
Widget *w;
int cols = 1; int cols = 1;
int lines = 1; int lines = 1;
@ -134,12 +141,14 @@ label_new (int y, int x, const char *text)
str_msg_term_size (text, &lines, &cols); str_msg_term_size (text, &lines, &cols);
l = g_new (WLabel, 1); l = g_new (WLabel, 1);
init_widget (&l->widget, y, x, lines, cols, label_callback, NULL); w = WIDGET (l);
init_widget (w, y, x, lines, cols, label_callback, NULL);
l->text = g_strdup (text); l->text = g_strdup (text);
l->auto_adjust_cols = TRUE; l->auto_adjust_cols = TRUE;
l->transparent = FALSE; l->transparent = FALSE;
widget_want_cursor (l->widget, FALSE); widget_want_cursor (w, FALSE);
widget_want_hotkey (l->widget, FALSE); widget_want_hotkey (w, FALSE);
return l; return l;
} }
@ -149,7 +158,8 @@ label_new (int y, int x, const char *text)
void void
label_set_text (WLabel * label, const char *text) label_set_text (WLabel * label, const char *text)
{ {
int newcols = label->widget.cols; Widget *w = WIDGET (label);
int newcols = w->cols;
int newlines; int newlines;
if (label->text != NULL && text != NULL && strcmp (label->text, text) == 0) if (label->text != NULL && text != NULL && strcmp (label->text, text) == 0)
@ -165,18 +175,18 @@ label_set_text (WLabel * label, const char *text)
if (label->auto_adjust_cols) if (label->auto_adjust_cols)
{ {
str_msg_term_size (text, &newlines, &newcols); str_msg_term_size (text, &newlines, &newcols);
if (newcols > label->widget.cols) if (newcols > w->cols)
label->widget.cols = newcols; w->cols = newcols;
if (newlines > label->widget.lines) if (newlines > w->lines)
label->widget.lines = newlines; w->lines = newlines;
} }
} }
if (label->widget.owner != NULL) if (w->owner != NULL)
label_callback ((Widget *) label, WIDGET_DRAW, 0); send_message (w, NULL, MSG_DRAW, 0, NULL);
if (newcols < label->widget.cols) if (newcols < w->cols)
label->widget.cols = newcols; w->cols = newcols;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define LABEL(x) ((WLabel *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/

Просмотреть файл

@ -113,7 +113,7 @@ create_listbox_window_centered (int center_y, int center_x, int lines, int cols,
listbox->dlg = listbox->dlg =
create_dlg (TRUE, ypos, xpos, lines + space, cols + space, create_dlg (TRUE, ypos, xpos, lines + space, cols + space,
listbox_colors, NULL, NULL, help, title, DLG_REVERSE | DLG_TRYUP); listbox_colors, NULL, NULL, help, title, DLG_TRYUP);
listbox->list = listbox_new (2, 2, lines, cols, FALSE, NULL); listbox->list = listbox_new (2, 2, lines, cols, FALSE, NULL);
add_widget (listbox->dlg, listbox->list); add_widget (listbox->dlg, listbox->list);

Просмотреть файл

@ -16,7 +16,7 @@
typedef struct typedef struct
{ {
struct Dlg_head *dlg; struct WDialog *dlg;
struct WListbox *list; struct WListbox *list;
} Listbox; } Listbox;

Просмотреть файл

@ -83,31 +83,32 @@ listbox_entry_free (void *data)
static void static void
listbox_drawscroll (WListbox * l) listbox_drawscroll (WListbox * l)
{ {
const int max_line = l->widget.lines - 1; Widget *w = WIDGET (l);
int max_line = w->lines - 1;
int line = 0; int line = 0;
int i; int i;
/* Are we at the top? */ /* Are we at the top? */
widget_move (&l->widget, 0, l->widget.cols); widget_move (w, 0, w->cols);
if (l->top == 0) if (l->top == 0)
tty_print_one_vline (TRUE); tty_print_one_vline (TRUE);
else else
tty_print_char ('^'); tty_print_char ('^');
/* Are we at the bottom? */ /* Are we at the bottom? */
widget_move (&l->widget, max_line, l->widget.cols); widget_move (w, max_line, w->cols);
if ((l->top + l->widget.lines == l->count) || (l->widget.lines >= l->count)) if ((l->top + w->lines == l->count) || (w->lines >= l->count))
tty_print_one_vline (TRUE); tty_print_one_vline (TRUE);
else else
tty_print_char ('v'); tty_print_char ('v');
/* Now draw the nice relative pointer */ /* Now draw the nice relative pointer */
if (l->count != 0) if (l->count != 0)
line = 1 + ((l->pos * (l->widget.lines - 2)) / l->count); line = 1 + ((l->pos * (w->lines - 2)) / l->count);
for (i = 1; i < max_line; i++) for (i = 1; i < max_line; i++)
{ {
widget_move (&l->widget, i, l->widget.cols); widget_move (w, i, w->cols);
if (i != line) if (i != line)
tty_print_one_vline (TRUE); tty_print_one_vline (TRUE);
else else
@ -120,8 +121,9 @@ listbox_drawscroll (WListbox * l)
static void static void
listbox_draw (WListbox * l, gboolean focused) listbox_draw (WListbox * l, gboolean focused)
{ {
const Dlg_head *h = l->widget.owner; Widget *w = WIDGET (l);
const gboolean disabled = (((Widget *) l)->options & W_DISABLED) != 0; const WDialog *h = w->owner;
const gboolean disabled = (w->options & W_DISABLED) != 0;
const int normalc = disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL]; const int normalc = disabled ? DISABLED_COLOR : h->color[DLG_COLOR_NORMAL];
/* *INDENT-OFF* */ /* *INDENT-OFF* */
int selc = disabled int selc = disabled
@ -140,7 +142,7 @@ listbox_draw (WListbox * l, gboolean focused)
/* pos = (le == NULL) ? 0 : g_list_position (l->list, le); */ /* pos = (le == NULL) ? 0 : g_list_position (l->list, le); */
pos = (le == NULL) ? 0 : l->top; pos = (le == NULL) ? 0 : l->top;
for (i = 0; i < l->widget.lines; i++) for (i = 0; i < w->lines; i++)
{ {
const char *text; const char *text;
@ -153,24 +155,25 @@ listbox_draw (WListbox * l, gboolean focused)
else else
tty_setcolor (normalc); tty_setcolor (normalc);
widget_move (&l->widget, i, 1); widget_move (l, i, 1);
if ((i > 0 && pos >= l->count) || (l->list == NULL) || (le == NULL)) if ((i > 0 && pos >= l->count) || (l->list == NULL) || (le == NULL))
text = ""; text = "";
else else
{ {
WLEntry *e = (WLEntry *) le->data; WLEntry *e = LENTRY (le->data);
text = e->text; text = e->text;
le = g_list_next (le); le = g_list_next (le);
pos++; pos++;
} }
tty_print_string (str_fit_to_term (text, l->widget.cols - 2, J_LEFT_FIT)); tty_print_string (str_fit_to_term (text, w->cols - 2, J_LEFT_FIT));
} }
l->cursor_y = sel_line; l->cursor_y = sel_line;
if (l->scrollbar && (l->count > l->widget.lines)) if (l->scrollbar && (l->count > w->lines))
{ {
tty_setcolor (normalc); tty_setcolor (normalc);
listbox_drawscroll (l); listbox_drawscroll (l);
@ -187,7 +190,7 @@ listbox_check_hotkey (WListbox * l, int key)
for (i = 0, le = l->list; le != NULL; i++, le = g_list_next (le)) for (i = 0, le = l->list; le != NULL; i++, le = g_list_next (le))
{ {
WLEntry *e = (WLEntry *) le->data; WLEntry *e = LENTRY (le->data);
if (e->hotkey == key) if (e->hotkey == key)
return i; return i;
@ -239,6 +242,7 @@ listbox_execute_cmd (WListbox * l, unsigned long command)
{ {
cb_ret_t ret = MSG_HANDLED; cb_ret_t ret = MSG_HANDLED;
int i; int i;
Widget *w = WIDGET (l);
switch (command) switch (command)
{ {
@ -255,18 +259,18 @@ listbox_execute_cmd (WListbox * l, unsigned long command)
listbox_select_last (l); listbox_select_last (l);
break; break;
case CK_PageUp: case CK_PageUp:
for (i = 0; (i < l->widget.lines - 1) && (l->pos > 0); i++) for (i = 0; (i < w->lines - 1) && (l->pos > 0); i++)
listbox_back (l); listbox_back (l);
break; break;
case CK_PageDown: case CK_PageDown:
for (i = 0; (i < l->widget.lines - 1) && (l->pos < l->count - 1); i++) for (i = 0; (i < w->lines - 1) && (l->pos < l->count - 1); i++)
listbox_fwd (l); listbox_fwd (l);
break; break;
case CK_Delete: case CK_Delete:
if (l->deletable) if (l->deletable)
{ {
gboolean is_last = (l->pos + 1 >= l->count); gboolean is_last = (l->pos + 1 >= l->count);
gboolean is_more = (l->top + l->widget.lines >= l->count); gboolean is_more = (l->top + w->lines >= l->count);
listbox_remove_current (l); listbox_remove_current (l);
if ((l->top > 0) && (is_last || is_more)) if ((l->top > 0) && (is_last || is_more))
@ -306,7 +310,7 @@ listbox_key (WListbox * l, int key)
listbox_select_entry (l, key - '0'); listbox_select_entry (l, key - '0');
/* need scroll to item? */ /* need scroll to item? */
if (abs (oldpos - l->pos) > l->widget.lines) if (abs (oldpos - l->pos) > WIDGET (l)->lines)
l->top = l->pos; l->top = l->pos;
return MSG_HANDLED; return MSG_HANDLED;
@ -362,18 +366,18 @@ listbox_destroy (WListbox * l)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
listbox_callback (Widget * w, widget_msg_t msg, int parm) listbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WListbox *l = (WListbox *) w; WListbox *l = LISTBOX (w);
Dlg_head *h = l->widget.owner; WDialog *h = w->owner;
cb_ret_t ret_code; cb_ret_t ret_code;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_HOTKEY: case MSG_HOTKEY:
{ {
int pos, action; int pos, action;
@ -382,7 +386,7 @@ listbox_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
listbox_select_entry (l, pos); listbox_select_entry (l, pos);
h->callback (h, w, DLG_ACTION, l->pos, NULL); send_message (h, w, MSG_ACTION, l->pos, NULL);
if (l->callback != NULL) if (l->callback != NULL)
action = l->callback (l); action = l->callback (l);
@ -398,38 +402,38 @@ listbox_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
} }
case WIDGET_KEY: case MSG_KEY:
ret_code = listbox_key (l, parm); ret_code = listbox_key (l, parm);
if (ret_code != MSG_NOT_HANDLED) if (ret_code != MSG_NOT_HANDLED)
{ {
listbox_draw (l, TRUE); listbox_draw (l, TRUE);
h->callback (h, w, DLG_ACTION, l->pos, NULL); send_message (h, w, MSG_ACTION, l->pos, NULL);
} }
return ret_code; return ret_code;
case WIDGET_COMMAND: case MSG_ACTION:
return listbox_execute_cmd (l, parm); return listbox_execute_cmd (l, parm);
case WIDGET_CURSOR: case MSG_CURSOR:
widget_move (&l->widget, l->cursor_y, 0); widget_move (l, l->cursor_y, 0);
h->callback (h, w, DLG_ACTION, l->pos, NULL); send_message (h, w, MSG_ACTION, l->pos, NULL);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_DRAW: case MSG_DRAW:
listbox_draw (l, msg != WIDGET_UNFOCUS); listbox_draw (l, msg != MSG_UNFOCUS);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
listbox_destroy (l); listbox_destroy (l);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_RESIZED: case MSG_RESIZE:
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -438,8 +442,8 @@ listbox_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
listbox_event (Gpm_Event * event, void *data) listbox_event (Gpm_Event * event, void *data)
{ {
WListbox *l = (WListbox *) data; WListbox *l = LISTBOX (data);
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
@ -516,12 +520,14 @@ WListbox *
listbox_new (int y, int x, int height, int width, gboolean deletable, lcback_fn callback) listbox_new (int y, int x, int height, int width, gboolean deletable, lcback_fn callback)
{ {
WListbox *l; WListbox *l;
Widget *w;
if (height <= 0) if (height <= 0)
height = 1; height = 1;
l = g_new (WListbox, 1); l = g_new (WListbox, 1);
init_widget (&l->widget, y, x, height, width, listbox_callback, listbox_event); w = WIDGET (l);
init_widget (w, y, x, height, width, listbox_callback, listbox_event);
l->list = NULL; l->list = NULL;
l->top = l->pos = 0; l->top = l->pos = 0;
@ -530,8 +536,8 @@ listbox_new (int y, int x, int height, int width, gboolean deletable, lcback_fn
l->callback = callback; l->callback = callback;
l->allow_duplicates = TRUE; l->allow_duplicates = TRUE;
l->scrollbar = !mc_global.tty.slow_terminal; l->scrollbar = !mc_global.tty.slow_terminal;
widget_want_hotkey (l->widget, TRUE); widget_want_hotkey (w, TRUE);
widget_want_cursor (l->widget, FALSE); widget_want_cursor (w, FALSE);
return l; return l;
} }
@ -548,7 +554,7 @@ listbox_search_text (WListbox * l, const char *text)
for (i = 0, le = l->list; le != NULL; i++, le = g_list_next (le)) for (i = 0, le = l->list; le != NULL; i++, le = g_list_next (le))
{ {
WLEntry *e = (WLEntry *) le->data; WLEntry *e = LENTRY (le->data);
if (strcmp (e->text, text) == 0) if (strcmp (e->text, text) == 0)
return i; return i;
@ -573,8 +579,10 @@ listbox_select_first (WListbox * l)
void void
listbox_select_last (WListbox * l) listbox_select_last (WListbox * l)
{ {
int lines = WIDGET (l)->lines;
l->pos = l->count - 1; l->pos = l->count - 1;
l->top = l->count > l->widget.lines ? l->count - l->widget.lines : 0; l->top = l->count > lines ? l->count - lines : 0;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -600,8 +608,13 @@ listbox_select_entry (WListbox * l, int dest)
l->pos = dest; l->pos = dest;
if (!top_seen) if (!top_seen)
l->top = l->pos; l->top = l->pos;
else if (l->pos - l->top >= l->widget.lines) else
l->top = l->pos - l->widget.lines + 1; {
int lines = WIDGET (l)->lines;
if (l->pos - l->top >= lines)
l->top = l->pos - lines + 1;
}
return; return;
} }
} }
@ -620,7 +633,7 @@ listbox_get_current (WListbox * l, char **string, void **extra)
gboolean ok; gboolean ok;
if (l != NULL) if (l != NULL)
e = (WLEntry *) g_list_nth_data (l->list, l->pos); e = LENTRY (g_list_nth_data (l->list, l->pos));
ok = (e != NULL); ok = (e != NULL);
@ -642,7 +655,7 @@ listbox_remove_current (WListbox * l)
current = g_list_nth (l->list, l->pos); current = g_list_nth (l->list, l->pos);
l->list = g_list_remove_link (l->list, current); l->list = g_list_remove_link (l->list, current);
listbox_entry_free ((WLEntry *) current->data); listbox_entry_free (LENTRY (current->data));
g_list_free_1 (current); g_list_free_1 (current);
l->count--; l->count--;

Просмотреть файл

@ -10,6 +10,9 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define LISTBOX(x) ((WListbox *)(x))
#define LENTRY(x) ((WLEntry *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/* callback should return one of the following values */ /* callback should return one of the following values */

Просмотреть файл

@ -49,17 +49,37 @@
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#define MENUENTRY(x) ((menu_entry_t *)(x))
#define MENU(x) ((menu_t *)(x))
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/ struct menu_entry_t
{
unsigned char first_letter;
hotkey_t text;
unsigned long command;
char *shortcut;
};
static cb_ret_t menubar_callback (Widget * w, widget_msg_t msg, int parm); struct menu_t
{
int start_x; /* position relative to menubar start */
hotkey_t text;
GList *entries;
size_t max_entry_len; /* cached max length of entry texts (text + shortcut) */
size_t max_hotkey_len; /* cached max length of shortcuts */
unsigned int selected; /* pointer to current menu entry */
char *help_node;
};
/*** file scope variables ************************************************************************/
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
menu_arrange (Menu * menu, dlg_shortcut_str get_shortcut) menu_arrange (menu_t * menu, dlg_shortcut_str get_shortcut)
{ {
if (menu != NULL) if (menu != NULL)
{ {
@ -71,7 +91,7 @@ menu_arrange (Menu * menu, dlg_shortcut_str get_shortcut)
for (i = menu->entries; i != NULL; i = g_list_next (i)) for (i = menu->entries; i != NULL; i = g_list_next (i))
{ {
menu_entry_t *entry = i->data; menu_entry_t *entry = MENUENTRY (i->data);
if (entry != NULL) if (entry != NULL)
{ {
@ -100,26 +120,24 @@ menu_arrange (Menu * menu, dlg_shortcut_str get_shortcut)
static void static void
menubar_paint_idx (WMenuBar * menubar, unsigned int idx, int color) menubar_paint_idx (WMenuBar * menubar, unsigned int idx, int color)
{ {
const Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); Widget *w = WIDGET (menubar);
const menu_entry_t *entry = g_list_nth_data (menu->entries, idx); const menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const menu_entry_t *entry = MENUENTRY (g_list_nth_data (menu->entries, idx));
const int y = 2 + idx; const int y = 2 + idx;
int x = menu->start_x; int x = menu->start_x;
if (x + menu->max_entry_len + 4 > (gsize) menubar->widget.cols) if (x + menu->max_entry_len + 4 > (gsize) w->cols)
x = menubar->widget.cols - menu->max_entry_len - 4; x = w->cols - menu->max_entry_len - 4;
if (entry == NULL) if (entry == NULL)
{ {
/* menu separator */ /* menu separator */
tty_setcolor (MENU_ENTRY_COLOR); tty_setcolor (MENU_ENTRY_COLOR);
widget_move (&menubar->widget, y, x - 1); widget_move (w, y, x - 1);
tty_print_alt_char (ACS_LTEE, FALSE); tty_print_alt_char (ACS_LTEE, FALSE);
tty_draw_hline (w->y + y, w->x + x, ACS_HLINE, menu->max_entry_len + 3);
tty_draw_hline (menubar->widget.y + y, menubar->widget.x + x, widget_move (w, y, x + menu->max_entry_len + 3);
ACS_HLINE, menu->max_entry_len + 3);
widget_move (&menubar->widget, y, x + menu->max_entry_len + 3);
tty_print_alt_char (ACS_RTEE, FALSE); tty_print_alt_char (ACS_RTEE, FALSE);
} }
else else
@ -128,7 +146,7 @@ menubar_paint_idx (WMenuBar * menubar, unsigned int idx, int color)
/* menu text */ /* menu text */
tty_setcolor (color); tty_setcolor (color);
widget_move (&menubar->widget, y, x); widget_move (w, y, x);
tty_print_char ((unsigned char) entry->first_letter); tty_print_char ((unsigned char) entry->first_letter);
tty_getyx (&yt, &xt); tty_getyx (&yt, &xt);
tty_draw_hline (yt, xt, ' ', menu->max_entry_len + 2); /* clear line */ tty_draw_hline (yt, xt, ' ', menu->max_entry_len + 2); /* clear line */
@ -146,12 +164,12 @@ menubar_paint_idx (WMenuBar * menubar, unsigned int idx, int color)
if (entry->shortcut != NULL) if (entry->shortcut != NULL)
{ {
widget_move (&menubar->widget, y, x + menu->max_hotkey_len + 3); widget_move (w, y, x + menu->max_hotkey_len + 3);
tty_print_string (entry->shortcut); tty_print_string (entry->shortcut);
} }
/* move cursor to the start of entry text */ /* move cursor to the start of entry text */
widget_move (&menubar->widget, y, x + 1); widget_move (w, y, x + 1);
} }
} }
@ -160,18 +178,17 @@ menubar_paint_idx (WMenuBar * menubar, unsigned int idx, int color)
static void static void
menubar_draw_drop (WMenuBar * menubar) menubar_draw_drop (WMenuBar * menubar)
{ {
const Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); Widget *w = WIDGET (menubar);
const menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const unsigned int count = g_list_length (menu->entries); const unsigned int count = g_list_length (menu->entries);
int column = menu->start_x - 1; int column = menu->start_x - 1;
unsigned int i; unsigned int i;
if (column + menu->max_entry_len + 5 > (gsize) menubar->widget.cols) if (column + menu->max_entry_len + 5 > (gsize) w->cols)
column = menubar->widget.cols - menu->max_entry_len - 5; column = w->cols - menu->max_entry_len - 5;
tty_setcolor (MENU_ENTRY_COLOR); tty_setcolor (MENU_ENTRY_COLOR);
draw_box (menubar->widget.owner, draw_box (w->owner, w->y + 1, w->x + column, count + 2, menu->max_entry_len + 5, FALSE);
menubar->widget.y + 1, menubar->widget.x + column,
count + 2, menu->max_entry_len + 5, FALSE);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
menubar_paint_idx (menubar, i, menubar_paint_idx (menubar, i,
@ -196,20 +213,21 @@ menubar_set_color (WMenuBar * menubar, gboolean current, gboolean hotkey)
static void static void
menubar_draw (WMenuBar * menubar) menubar_draw (WMenuBar * menubar)
{ {
Widget *w = WIDGET (menubar);
GList *i; GList *i;
/* First draw the complete menubar */ /* First draw the complete menubar */
tty_setcolor (menubar->is_active ? MENU_ENTRY_COLOR : MENU_INACTIVE_COLOR); tty_setcolor (menubar->is_active ? MENU_ENTRY_COLOR : MENU_INACTIVE_COLOR);
tty_draw_hline (menubar->widget.y, menubar->widget.x, ' ', menubar->widget.cols); tty_draw_hline (w->y, w->x, ' ', w->cols);
/* Now each one of the entries */ /* Now each one of the entries */
for (i = menubar->menu; i != NULL; i = g_list_next (i)) for (i = menubar->menu; i != NULL; i = g_list_next (i))
{ {
Menu *menu = i->data; menu_t *menu = MENU (i->data);
gboolean is_selected = (menubar->selected == (gsize) g_list_position (menubar->menu, i)); gboolean is_selected = (menubar->selected == (gsize) g_list_position (menubar->menu, i));
menubar_set_color (menubar, is_selected, FALSE); menubar_set_color (menubar, is_selected, FALSE);
widget_move (&menubar->widget, 0, menu->start_x); widget_move (w, 0, menu->start_x);
tty_print_char (' '); tty_print_char (' ');
tty_print_string (menu->text.start); tty_print_string (menu->text.start);
@ -230,8 +248,8 @@ menubar_draw (WMenuBar * menubar)
if (menubar->is_dropped) if (menubar->is_dropped)
menubar_draw_drop (menubar); menubar_draw_drop (menubar);
else else
widget_move (&menubar->widget, 0, widget_move (w, 0,
((Menu *) g_list_nth_data (menubar->menu, menubar->selected))->start_x); MENU (g_list_nth_data (menubar->menu, menubar->selected))->start_x);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -239,7 +257,7 @@ menubar_draw (WMenuBar * menubar)
static void static void
menubar_remove (WMenuBar * menubar) menubar_remove (WMenuBar * menubar)
{ {
Dlg_head *h; WDialog *h;
if (!menubar->is_dropped) if (!menubar->is_dropped)
return; return;
@ -248,7 +266,7 @@ menubar_remove (WMenuBar * menubar)
of overlapped widgets. This is useful in multi-window editor. of overlapped widgets. This is useful in multi-window editor.
In general, menubar should be a special object, not an ordinary widget In general, menubar should be a special object, not an ordinary widget
in the current dialog. */ in the current dialog. */
h = menubar->widget.owner; h = WIDGET (menubar)->owner;
h->current = g_list_find (h->widgets, dlg_find_by_id (h, menubar->previous_widget)); h->current = g_list_find (h->widgets, dlg_find_by_id (h, menubar->previous_widget));
menubar->is_dropped = FALSE; menubar->is_dropped = FALSE;
@ -287,12 +305,14 @@ menubar_right (WMenuBar * menubar)
static void static void
menubar_finish (WMenuBar * menubar) menubar_finish (WMenuBar * menubar)
{ {
Widget *w = WIDGET (menubar);
menubar->is_dropped = FALSE; menubar->is_dropped = FALSE;
menubar->is_active = FALSE; menubar->is_active = FALSE;
menubar->widget.lines = 1; w->lines = 1;
widget_want_hotkey (menubar->widget, 0); widget_want_hotkey (w, 0);
dlg_select_by_id (menubar->widget.owner, menubar->previous_widget); dlg_select_by_id (w->owner, menubar->previous_widget);
do_refresh (); do_refresh ();
} }
@ -311,15 +331,16 @@ menubar_drop (WMenuBar * menubar, unsigned int selected)
static void static void
menubar_execute (WMenuBar * menubar) menubar_execute (WMenuBar * menubar)
{ {
const Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); const menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const menu_entry_t *entry = g_list_nth_data (menu->entries, menu->selected); const menu_entry_t *entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected));
if ((entry != NULL) && (entry->command != CK_IgnoreKey)) if ((entry != NULL) && (entry->command != CK_IgnoreKey))
{ {
Widget *w = WIDGET (menubar);
mc_global.widget.is_right = (menubar->selected != 0); mc_global.widget.is_right = (menubar->selected != 0);
menubar_finish (menubar); menubar_finish (menubar);
menubar->widget.owner->callback (menubar->widget.owner, &menubar->widget, send_message (w->owner, w, MSG_ACTION, entry->command, NULL);
DLG_ACTION, entry->command, NULL);
do_refresh (); do_refresh ();
} }
} }
@ -329,7 +350,7 @@ menubar_execute (WMenuBar * menubar)
static void static void
menubar_down (WMenuBar * menubar) menubar_down (WMenuBar * menubar)
{ {
Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const unsigned int len = g_list_length (menu->entries); const unsigned int len = g_list_length (menu->entries);
menu_entry_t *entry; menu_entry_t *entry;
@ -338,7 +359,7 @@ menubar_down (WMenuBar * menubar)
do do
{ {
menu->selected = (menu->selected + 1) % len; menu->selected = (menu->selected + 1) % len;
entry = (menu_entry_t *) g_list_nth_data (menu->entries, menu->selected); entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected));
} }
while ((entry == NULL) || (entry->command == CK_IgnoreKey)); while ((entry == NULL) || (entry->command == CK_IgnoreKey));
@ -350,7 +371,7 @@ menubar_down (WMenuBar * menubar)
static void static void
menubar_up (WMenuBar * menubar) menubar_up (WMenuBar * menubar)
{ {
Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const unsigned int len = g_list_length (menu->entries); const unsigned int len = g_list_length (menu->entries);
menu_entry_t *entry; menu_entry_t *entry;
@ -362,7 +383,7 @@ menubar_up (WMenuBar * menubar)
menu->selected = len - 1; menu->selected = len - 1;
else else
menu->selected--; menu->selected--;
entry = (menu_entry_t *) g_list_nth_data (menu->entries, menu->selected); entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected));
} }
while ((entry == NULL) || (entry->command == CK_IgnoreKey)); while ((entry == NULL) || (entry->command == CK_IgnoreKey));
@ -374,7 +395,7 @@ menubar_up (WMenuBar * menubar)
static void static void
menubar_first (WMenuBar * menubar) menubar_first (WMenuBar * menubar)
{ {
Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
menu_entry_t *entry; menu_entry_t *entry;
if (menu->selected == 0) if (menu->selected == 0)
@ -386,7 +407,7 @@ menubar_first (WMenuBar * menubar)
while (TRUE) while (TRUE)
{ {
entry = (menu_entry_t *) g_list_nth_data (menu->entries, menu->selected); entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected));
if ((entry == NULL) || (entry->command == CK_IgnoreKey)) if ((entry == NULL) || (entry->command == CK_IgnoreKey))
menu->selected++; menu->selected++;
@ -402,7 +423,7 @@ menubar_first (WMenuBar * menubar)
static void static void
menubar_last (WMenuBar * menubar) menubar_last (WMenuBar * menubar)
{ {
Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
const unsigned int len = g_list_length (menu->entries); const unsigned int len = g_list_length (menu->entries);
menu_entry_t *entry; menu_entry_t *entry;
@ -416,7 +437,7 @@ menubar_last (WMenuBar * menubar)
do do
{ {
menu->selected--; menu->selected--;
entry = (menu_entry_t *) g_list_nth_data (menu->entries, menu->selected); entry = MENUENTRY (g_list_nth_data (menu->entries, menu->selected));
} }
while ((entry == NULL) || (entry->command == CK_IgnoreKey)); while ((entry == NULL) || (entry->command == CK_IgnoreKey));
@ -447,7 +468,7 @@ menubar_handle_key (WMenuBar * menubar, int key)
if (menubar->is_dropped) if (menubar->is_dropped)
event_data.node = event_data.node =
((Menu *) g_list_nth_data (menubar->menu, menubar->selected))->help_node; MENU (g_list_nth_data (menubar->menu, menubar->selected))->help_node;
else else
event_data.node = "[Menu Bar]"; event_data.node = "[Menu Bar]";
@ -473,7 +494,7 @@ menubar_handle_key (WMenuBar * menubar, int key)
/* drop menu by hotkey */ /* drop menu by hotkey */
for (i = menubar->menu; i != NULL; i = g_list_next (i)) for (i = menubar->menu; i != NULL; i = g_list_next (i))
{ {
Menu *menu = i->data; menu_t *menu = MENU (i->data);
if ((menu->text.hotkey != NULL) && (key == g_ascii_tolower (menu->text.hotkey[0]))) if ((menu->text.hotkey != NULL) && (key == g_ascii_tolower (menu->text.hotkey[0])))
{ {
@ -490,13 +511,13 @@ menubar_handle_key (WMenuBar * menubar, int key)
} }
{ {
Menu *menu = g_list_nth_data (menubar->menu, menubar->selected); menu_t *menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
GList *i; GList *i;
/* execute menu command by hotkey */ /* execute menu command by hotkey */
for (i = menu->entries; i != NULL; i = g_list_next (i)) for (i = menu->entries; i != NULL; i = g_list_next (i))
{ {
const menu_entry_t *entry = i->data; const menu_entry_t *entry = MENUENTRY (i->data);
if ((entry != NULL) && (entry->command != CK_IgnoreKey) if ((entry != NULL) && (entry->command != CK_IgnoreKey)
&& (entry->text.hotkey != NULL) && (key == g_ascii_tolower (entry->text.hotkey[0]))) && (entry->text.hotkey != NULL) && (key == g_ascii_tolower (entry->text.hotkey[0])))
@ -543,28 +564,28 @@ menubar_handle_key (WMenuBar * menubar, int key)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
menubar_callback (Widget * w, widget_msg_t msg, int parm) menubar_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WMenuBar *menubar = (WMenuBar *) w; WMenuBar *menubar = MENUBAR (w);
switch (msg) switch (msg)
{ {
/* We do not want the focus unless we have been activated */ /* We do not want the focus unless we have been activated */
case WIDGET_FOCUS: case MSG_FOCUS:
if (!menubar->is_active) if (!menubar->is_active)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
/* Trick to get all the mouse events */ /* Trick to get all the mouse events */
menubar->widget.lines = LINES; w->lines = LINES;
/* Trick to get all of the hotkeys */ /* Trick to get all of the hotkeys */
widget_want_hotkey (menubar->widget, 1); widget_want_hotkey (w, 1);
menubar_draw (menubar); menubar_draw (menubar);
return MSG_HANDLED; return MSG_HANDLED;
/* We don't want the buttonbar to activate while using the menubar */ /* We don't want the buttonbar to activate while using the menubar */
case WIDGET_HOTKEY: case MSG_HOTKEY:
case WIDGET_KEY: case MSG_KEY:
if (menubar->is_active) if (menubar->is_active)
{ {
menubar_handle_key (menubar, parm); menubar_handle_key (menubar, parm);
@ -572,14 +593,14 @@ menubar_callback (Widget * w, widget_msg_t msg, int parm)
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
/* Put the cursor in a suitable place */ /* Put the cursor in a suitable place */
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
return menubar->is_active ? MSG_NOT_HANDLED : MSG_HANDLED; return menubar->is_active ? MSG_NOT_HANDLED : MSG_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
if (menubar->is_visible) if (menubar->is_visible)
{ {
menubar_draw (menubar); menubar_draw (menubar);
@ -587,18 +608,18 @@ menubar_callback (Widget * w, widget_msg_t msg, int parm)
} }
/* fall through */ /* fall through */
case WIDGET_RESIZED: case MSG_RESIZE:
/* try show menu after screen resize */ /* try show menu after screen resize */
send_message (w, WIDGET_FOCUS, 0); send_message (w, sender, MSG_FOCUS, 0, data);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
menubar_set_menu (menubar, NULL); menubar_set_menu (menubar, NULL);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -607,11 +628,11 @@ menubar_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
menubar_event (Gpm_Event * event, void *data) menubar_event (Gpm_Event * event, void *data)
{ {
WMenuBar *menubar = (WMenuBar *) data; WMenuBar *menubar = MENUBAR (data);
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
gboolean was_active = TRUE; gboolean was_active = TRUE;
int left_x, right_x, bottom_y; int left_x, right_x, bottom_y;
Menu *menu; menu_t *menu;
Gpm_Event local; Gpm_Event local;
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
@ -652,8 +673,7 @@ menubar_event (Gpm_Event * event, void *data)
unsigned int new_selection = 0; unsigned int new_selection = 0;
while ((new_selection < len) while ((new_selection < len)
&& (local.x > ((Menu *) g_list_nth_data (menubar->menu, && (local.x > MENU (g_list_nth_data (menubar->menu, new_selection))->start_x))
new_selection))->start_x))
new_selection++; new_selection++;
if (new_selection != 0) /* Don't set the invalid value -1 */ if (new_selection != 0) /* Don't set the invalid value -1 */
@ -685,13 +705,13 @@ menubar_event (Gpm_Event * event, void *data)
} }
/* the mouse operation is on the menus or it is not */ /* the mouse operation is on the menus or it is not */
menu = (Menu *) g_list_nth_data (menubar->menu, menubar->selected); menu = MENU (g_list_nth_data (menubar->menu, menubar->selected));
left_x = menu->start_x; left_x = menu->start_x;
right_x = left_x + menu->max_entry_len + 3; right_x = left_x + menu->max_entry_len + 3;
if (right_x > menubar->widget.cols) if (right_x > w->cols)
{ {
left_x = menubar->widget.cols - menu->max_entry_len - 3; left_x = w->cols - menu->max_entry_len - 3;
right_x = menubar->widget.cols; right_x = w->cols;
} }
bottom_y = g_list_length (menu->entries) + 3; bottom_y = g_list_length (menu->entries) + 3;
@ -699,7 +719,7 @@ menubar_event (Gpm_Event * event, void *data)
if ((local.x >= left_x) && (local.x <= right_x) && (local.y <= bottom_y)) if ((local.x >= left_x) && (local.x <= right_x) && (local.y <= bottom_y))
{ {
int pos = local.y - 3; int pos = local.y - 3;
const menu_entry_t *entry = g_list_nth_data (menu->entries, pos); const menu_entry_t *entry = MENUENTRY (g_list_nth_data (menu->entries, pos));
/* mouse wheel */ /* mouse wheel */
if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0) if ((local.buttons & GPM_B_UP) != 0 && (local.type & GPM_DOWN) != 0)
@ -769,12 +789,12 @@ menu_entry_free (menu_entry_t * entry)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
Menu * menu_t *
create_menu (const char *name, GList * entries, const char *help_node) create_menu (const char *name, GList * entries, const char *help_node)
{ {
Menu *menu; menu_t *menu;
menu = g_new (Menu, 1); menu = g_new (menu_t, 1);
menu->start_x = 0; menu->start_x = 0;
menu->text = parse_hotkey (name); menu->text = parse_hotkey (name);
menu->entries = entries; menu->entries = entries;
@ -789,7 +809,7 @@ create_menu (const char *name, GList * entries, const char *help_node)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
menu_set_name (Menu * menu, const char *name) menu_set_name (menu_t * menu, const char *name)
{ {
release_hotkey (menu->text); release_hotkey (menu->text);
menu->text = parse_hotkey (name); menu->text = parse_hotkey (name);
@ -798,7 +818,7 @@ menu_set_name (Menu * menu, const char *name)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
destroy_menu (Menu * menu) destroy_menu (menu_t * menu)
{ {
release_hotkey (menu->text); release_hotkey (menu->text);
g_list_foreach (menu->entries, (GFunc) menu_entry_free, NULL); g_list_foreach (menu->entries, (GFunc) menu_entry_free, NULL);
@ -813,11 +833,14 @@ WMenuBar *
menubar_new (int y, int x, int cols, GList * menu) menubar_new (int y, int x, int cols, GList * menu)
{ {
WMenuBar *menubar; WMenuBar *menubar;
Widget *w;
menubar = g_new0 (WMenuBar, 1); menubar = g_new0 (WMenuBar, 1);
init_widget (&menubar->widget, y, x, 1, cols, menubar_callback, menubar_event); w = WIDGET (menubar);
widget_want_cursor (menubar->widget, FALSE); init_widget (w, y, x, 1, cols, menubar_callback, menubar_event);
menubar->is_visible = TRUE; /* by default */ menubar->is_visible = TRUE; /* by default */
widget_want_cursor (w, FALSE);
menubar_set_menu (menubar, menu); menubar_set_menu (menubar, menu);
return menubar; return menubar;
@ -845,11 +868,11 @@ menubar_set_menu (WMenuBar * menubar, GList * menu)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
menubar_add_menu (WMenuBar * menubar, Menu * menu) menubar_add_menu (WMenuBar * menubar, menu_t * menu)
{ {
if (menu != NULL) if (menu != NULL)
{ {
menu_arrange (menu, menubar->widget.owner->get_shortcut); menu_arrange (menu, WIDGET (menubar)->owner->get_shortcut);
menubar->menu = g_list_append (menubar->menu, menu); menubar->menu = g_list_append (menubar->menu, menu);
} }
@ -872,12 +895,13 @@ menubar_arrange (WMenuBar * menubar)
if (menubar->menu == NULL) if (menubar->menu == NULL)
return; return;
gap = menubar->widget.cols - 2; gap = WIDGET (menubar)->cols - 2;
/* First, calculate gap between items... */ /* First, calculate gap between items... */
for (i = menubar->menu; i != NULL; i = g_list_next (i)) for (i = menubar->menu; i != NULL; i = g_list_next (i))
{ {
Menu *menu = (Menu *) i->data; menu_t *menu = MENU (i->data);
/* preserve length here, to be used below */ /* preserve length here, to be used below */
menu->start_x = hotkey_width (menu->text) + 2; menu->start_x = hotkey_width (menu->text) + 2;
gap -= menu->start_x; gap -= menu->start_x;
@ -899,7 +923,7 @@ menubar_arrange (WMenuBar * menubar)
/* ...and now fix start positions of menubar items */ /* ...and now fix start positions of menubar items */
for (i = menubar->menu; i != NULL; i = g_list_next (i)) for (i = menubar->menu; i != NULL; i = g_list_next (i))
{ {
Menu *menu = (Menu *) i->data; menu_t *menu = MENU (i->data);
int len = menu->start_x; int len = menu->start_x;
menu->start_x = start_x; menu->start_x = start_x;
@ -911,9 +935,9 @@ menubar_arrange (WMenuBar * menubar)
/** Find MenuBar widget in the dialog */ /** Find MenuBar widget in the dialog */
WMenuBar * WMenuBar *
find_menubar (const Dlg_head * h) find_menubar (const WDialog * h)
{ {
return (WMenuBar *) find_widget_type (h, menubar_callback); return MENUBAR (find_widget_type (h, menubar_callback));
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -11,30 +11,19 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define MENUBAR(x) ((WMenuBar *)(x))
#define menu_separator_create() NULL #define menu_separator_create() NULL
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
typedef struct menu_entry_t struct menu_entry_t;
{ typedef struct menu_entry_t menu_entry_t;
unsigned char first_letter;
hotkey_t text;
unsigned long command;
char *shortcut;
} menu_entry_t;
typedef struct Menu struct menu_t;
{ typedef struct menu_t menu_t;
int start_x; /* position relative to menubar start */
hotkey_t text;
GList *entries;
size_t max_entry_len; /* cached max length of entry texts (text + shortcut) */
size_t max_hotkey_len; /* cached max length of shortcuts */
unsigned int selected; /* pointer to current menu entry */
char *help_node;
} Menu;
/* The button bar menu */ /* The button bar menu */
typedef struct WMenuBar typedef struct WMenuBar
@ -56,16 +45,16 @@ typedef struct WMenuBar
menu_entry_t *menu_entry_create (const char *name, unsigned long command); menu_entry_t *menu_entry_create (const char *name, unsigned long command);
void menu_entry_free (menu_entry_t * me); void menu_entry_free (menu_entry_t * me);
Menu *create_menu (const char *name, GList * entries, const char *help_node); menu_t *create_menu (const char *name, GList * entries, const char *help_node);
void menu_set_name (Menu * menu, const char *name); void menu_set_name (menu_t * menu, const char *name);
void destroy_menu (Menu * menu); void destroy_menu (menu_t * menu);
WMenuBar *menubar_new (int y, int x, int cols, GList * menu); WMenuBar *menubar_new (int y, int x, int cols, GList * menu);
void menubar_set_menu (WMenuBar * menubar, GList * menu); void menubar_set_menu (WMenuBar * menubar, GList * menu);
void menubar_add_menu (WMenuBar * menubar, Menu * menu); void menubar_add_menu (WMenuBar * menubar, menu_t * menu);
void menubar_arrange (WMenuBar * menubar); void menubar_arrange (WMenuBar * menubar);
WMenuBar *find_menubar (const Dlg_head * h); WMenuBar *find_menubar (const WDialog * h);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/

Просмотреть файл

@ -2,7 +2,7 @@
Widget based utility functions. Widget based utility functions.
Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004, Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
The Free Software Foundation, Inc. The Free Software Foundation, Inc.
Authors: Authors:
@ -10,7 +10,7 @@
Radek Doulik, 1994, 1995 Radek Doulik, 1994, 1995
Jakub Jelinek, 1995 Jakub Jelinek, 1995
Andrej Borsenkow, 1995 Andrej Borsenkow, 1995
Andrew Borodin <aborodin@vmail.ru>, 2009, 2010 Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2011, 2012
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -38,6 +38,7 @@
#include <stdio.h> /* fprintf() */ #include <stdio.h> /* fprintf() */
#include "lib/global.h" #include "lib/global.h"
#include "lib/strutil.h" /* str_term_width1() */
#include "lib/util.h" /* tilde_expand() */ #include "lib/util.h" /* tilde_expand() */
#include "lib/widget.h" #include "lib/widget.h"
@ -45,119 +46,520 @@
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#ifdef ENABLE_NLS
#define I18N(x) (x = x != NULL && *x != '\0' ? _(x) : x)
#else
#define I18N(x) (x = x)
#endif
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
typedef struct
{
Widget *widget;
quick_widget_t *quick_widget;
} quick_widget_item_t;
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */
static WInput *
quick_create_input (int y, int x, const quick_widget_t * qw)
{
WInput *in;
in = input_new (y, x, input_get_default_colors (), 8, qw->u.input.text, qw->u.input.histname,
INPUT_COMPLETE_DEFAULT);
in->is_password = (qw->u.input.flags == 1);
if ((qw->u.input.flags & 2) != 0)
in->completion_flags |= INPUT_COMPLETE_CD;
if ((qw->u.input.flags & 4) != 0)
in->strip_password = TRUE;
return in;
}
/* --------------------------------------------------------------------------------------------- */
static void
quick_create_labeled_input (GArray * widgets, int *y, int x, quick_widget_t * quick_widget,
int *width)
{
quick_widget_item_t in, label;
label.quick_widget = g_new0 (quick_widget_t, 1);
label.quick_widget->widget_type = quick_label;
label.quick_widget->options = quick_widget->options;
/* FIXME: this should be turned in depend of label_location */
label.quick_widget->pos_flags = quick_widget->pos_flags;
switch (quick_widget->u.input.label_location)
{
case input_label_above:
label.widget = WIDGET (label_new (*y, x, I18N (quick_widget->u.input.label_text)));
*y += label.widget->lines - 1;
g_array_append_val (widgets, label);
in.widget = WIDGET (quick_create_input (++(*y), x, quick_widget));
in.quick_widget = quick_widget;
g_array_append_val (widgets, in);
*width = max (label.widget->cols, in.widget->cols);
break;
case input_label_left:
label.widget = WIDGET (label_new (*y, x, I18N (quick_widget->u.input.label_text)));
g_array_append_val (widgets, label);
in.widget = WIDGET (quick_create_input (*y, x + label.widget->cols + 1, quick_widget));
in.quick_widget = quick_widget;
g_array_append_val (widgets, in);
*width = label.widget->cols + in.widget->cols + 1;
break;
case input_label_right:
in.widget = WIDGET (quick_create_input (*y, x, quick_widget));
in.quick_widget = quick_widget;
g_array_append_val (widgets, in);
label.widget =
WIDGET (label_new
(*y, x + in.widget->cols + 1, I18N (quick_widget->u.input.label_text)));
g_array_append_val (widgets, label);
*width = label.widget->cols + in.widget->cols + 1;
break;
case input_label_below:
in.widget = WIDGET (quick_create_input (*y, x, quick_widget));
in.quick_widget = quick_widget;
g_array_append_val (widgets, in);
label.widget = WIDGET (label_new (++(*y), x, I18N (quick_widget->u.input.label_text)));
*y += label.widget->lines - 1;
g_array_append_val (widgets, label);
*width = max (label.widget->cols, in.widget->cols);
break;
default:
return;
}
INPUT (in.widget)->label = LABEL (label.widget);
/* cross references */
label.quick_widget->u.label.input = in.quick_widget;
in.quick_widget->u.input.label = label.quick_widget;
}
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/*** public functions ****************************************************************************/ /*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
int int
quick_dialog_skip (QuickDialog * qd, int nskip) quick_dialog_skip (quick_dialog_t * quick_dlg, int nskip)
{ {
#ifdef ENABLE_NLS int len;
#define I18N(x) (x = !qd->i18n && x != NULL && *x != '\0' ? _(x): x) int blen = 0;
#else int x, y; /* current positions */
#define I18N(x) (x = x) int y1 = 0; /* bottom of 1st column in case of two columns */
#endif int y2 = -1; /* start of two columns */
Dlg_head *dd; int width1 = 0; /* width of single column */
QuickWidget *qw; int width2 = 0; /* width of each of two columns*/
WInput *in; gboolean have_groupbox = FALSE;
WRadio *r; gboolean two_columns = FALSE;
gboolean put_buttons = FALSE;
/* x position of 1st column is 3 */
const int x1 = 3;
/* x position of 2nd column is 4 and it will be fixed later, after creation of all widgets */
int x2 = 4;
GArray *widgets;
size_t i;
quick_widget_t *quick_widget;
WGroupbox *g = NULL;
WDialog *dd;
int return_val; int return_val;
I18N (qd->title); len = str_term_width1 (I18N (quick_dlg->title)) + 6;
quick_dlg->cols = max (quick_dlg->cols, len);
if ((qd->xpos == -1) || (qd->ypos == -1)) y = 1;
dd = create_dlg (TRUE, 0, 0, qd->ylen, qd->xlen, x = x1;
dialog_colors, qd->callback, qd->mouse, qd->help, qd->title,
DLG_CENTER | DLG_TRYUP | DLG_REVERSE);
else
dd = create_dlg (TRUE, qd->ypos, qd->xpos, qd->ylen, qd->xlen,
dialog_colors, qd->callback, qd->mouse, qd->help, qd->title, DLG_REVERSE);
for (qw = qd->widgets; qw->widget_type != quick_end; qw++) /* create widgets */
widgets = g_array_sized_new (FALSE, FALSE, sizeof (quick_widget_item_t), 8);
for (quick_widget = quick_dlg->widgets; quick_widget->widget_type != quick_end; quick_widget++)
{ {
int xpos; quick_widget_item_t item = { NULL, quick_widget };
int ypos; int width = 0;
xpos = (qd->xlen * qw->relative_x) / qw->x_divisions; switch (quick_widget->widget_type)
ypos = (qd->ylen * qw->relative_y) / qw->y_divisions;
switch (qw->widget_type)
{ {
case quick_checkbox: case quick_checkbox:
qw->widget = item.widget =
(Widget *) check_new (ypos, xpos, *qw->u.checkbox.state, WIDGET (check_new
I18N (qw->u.checkbox.text)); (++y, x, *quick_widget->u.checkbox.state,
I18N (quick_widget->u.checkbox.text)));
g_array_append_val (widgets, item);
width = item.widget->cols;
if (g != NULL)
width += 2;
if (two_columns)
width2 = max (width2, width);
else
width1 = max (width1, width);
break; break;
case quick_button: case quick_button:
qw->widget = (Widget *) button_new (ypos, xpos, qw->u.button.action, /* single button */
(qw->u.button.action == item.widget = WIDGET (button_new (++y, x, quick_widget->u.button.action,
B_ENTER) ? DEFPUSH_BUTTON : NORMAL_BUTTON, quick_widget->u.button.action == B_ENTER ?
I18N (qw->u.button.text), qw->u.button.callback); DEFPUSH_BUTTON : NORMAL_BUTTON,
I18N (quick_widget->u.button.text),
quick_widget->u.button.callback));
g_array_append_val (widgets, item);
width = item.widget->cols;
if (g != NULL)
width += 2;
if (two_columns)
width2 = max (width2, width);
else
width1 = max (width1, width);
break; break;
case quick_input: case quick_input:
in = input_new (ypos, xpos, input_get_default_colors (), *quick_widget->u.input.result = NULL;
qw->u.input.len, qw->u.input.text, qw->u.input.histname, y++;
INPUT_COMPLETE_DEFAULT); if (quick_widget->u.input.label_location != input_label_none)
in->is_password = (qw->u.input.flags == 1); quick_create_labeled_input (widgets, &y, x, quick_widget, &width);
if ((qw->u.input.flags & 2) != 0) else
in->completion_flags |= INPUT_COMPLETE_CD; {
if ((qw->u.input.flags & 4) != 0) item.widget = WIDGET (quick_create_input (y, x, quick_widget));
in->strip_password = TRUE; g_array_append_val (widgets, item);
qw->widget = (Widget *) in; width = item.widget->cols;
*qw->u.input.result = NULL; }
if (g != NULL)
width += 2;
if (two_columns)
width2 = max (width2, width);
else
width1 = max (width1, width);
break; break;
case quick_label: case quick_label:
qw->widget = (Widget *) label_new (ypos, xpos, I18N (qw->u.label.text)); item.widget = WIDGET (label_new (++y, x, I18N (quick_widget->u.label.text)));
break; g_array_append_val (widgets, item);
y += item.widget->lines - 1;
case quick_groupbox: width = item.widget->cols;
qw->widget = (Widget *) groupbox_new (ypos, xpos, if (g != NULL)
qw->u.groupbox.height, width += 2;
qw->u.groupbox.width, if (two_columns)
I18N (qw->u.groupbox.title)); width2 = max (width2, width);
else
width1 = max (width1, width);
break; break;
case quick_radio: case quick_radio:
{ {
int i; WRadio *r;
char **items = NULL; char **items = NULL;
/* create the copy of radio_items to avoid mwmory leak */ /* create the copy of radio_items to avoid mwmory leak */
items = g_new0 (char *, qw->u.radio.count + 1); items = g_new (char *, quick_widget->u.radio.count + 1);
for (i = 0; i < (size_t) quick_widget->u.radio.count; i++)
items[i] = g_strdup (_(quick_widget->u.radio.items[i]));
items[i] = NULL;
if (!qd->i18n) r = radio_new (++y, x, quick_widget->u.radio.count, (const char **) items);
for (i = 0; i < qw->u.radio.count; i++) r->pos = r->sel = *quick_widget->u.radio.value;
items[i] = g_strdup (_(qw->u.radio.items[i]));
else
for (i = 0; i < qw->u.radio.count; i++)
items[i] = g_strdup (qw->u.radio.items[i]);
r = radio_new (ypos, xpos, qw->u.radio.count, (const char **) items);
r->pos = r->sel = *qw->u.radio.value;
qw->widget = (Widget *) r;
g_strfreev (items); g_strfreev (items);
break; item.widget = WIDGET (r);
g_array_append_val (widgets, item);
y += item.widget->lines - 1;
width = item.widget->cols;
if (g != NULL)
width += 2;
if (two_columns)
width2 = max (width2, width);
else
width1 = max (width1, width);
}
break;
case quick_start_groupbox:
I18N (quick_widget->u.groupbox.title);
len = str_term_width1 (quick_widget->u.groupbox.title);
g = groupbox_new (++y, x, 1, len + 4, quick_widget->u.groupbox.title);
item.widget = WIDGET (g);
g_array_append_val (widgets, item);
have_groupbox = TRUE;
break;
case quick_stop_groupbox:
if (g != NULL)
{
Widget *w = WIDGET (g);
y++;
w->lines = y + 1 - w->y;
g = NULL;
g_array_append_val (widgets, item);
}
break;
case quick_separator:
y++;
if (quick_widget->u.separator.line)
{
item.widget = WIDGET (hline_new (y, x, 1));
g_array_append_val (widgets, item);
}
break;
case quick_start_columns:
y2 = y;
g_array_append_val (widgets, item);
two_columns = TRUE;
break;
case quick_next_column:
x = x2;
y1 = y;
y = y2;
break;
case quick_stop_columns:
x = x1;
y = max (y1, y);
g_array_append_val (widgets, item);
two_columns = FALSE;
break;
case quick_buttons:
/* start put several buttons in bottom line */
if (quick_widget->u.separator.space)
{
y++;
if (quick_widget->u.separator.line)
item.widget = WIDGET (hline_new (y, 1, -1));
} }
g_array_append_val (widgets, item);
/* several buttons in bottom line */
y++;
quick_widget++;
for (; quick_widget->widget_type == quick_button; quick_widget++)
{
item.widget = WIDGET (button_new (y, x++, quick_widget->u.button.action,
quick_widget->u.button.action == B_ENTER ?
DEFPUSH_BUTTON : NORMAL_BUTTON,
I18N (quick_widget->u.button.text),
quick_widget->u.button.callback));
item.quick_widget = quick_widget;
g_array_append_val (widgets, item);
blen += item.widget->cols + 1;
}
/* stop dialog build here */
blen--;
quick_widget->widget_type = quick_end;
quick_widget--;
break;
default:
break;
}
}
/* adjust dialog width */
quick_dlg->cols = max (quick_dlg->cols, blen + 6);
if (have_groupbox)
{
if (width1 != 0)
width1 += 2;
if (width2 != 0)
width2 += 2;
}
if (width2 == 0)
len = width1 + 6;
else
{
len = width2 * 2 + 7;
if (width1 != 0)
len = max (len, width1 + 6);
}
quick_dlg->cols = max (quick_dlg->cols, len);
width1 = quick_dlg->cols - 6;
width2 = (quick_dlg->cols - 7) / 2;
if (quick_dlg->x == -1 || quick_dlg->y == -1)
dd = create_dlg (TRUE, 0, 0, y + 3, quick_dlg->cols,
dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help,
quick_dlg->title, DLG_CENTER | DLG_TRYUP);
else
dd = create_dlg (TRUE, quick_dlg->y, quick_dlg->x, y + 3, quick_dlg->cols,
dialog_colors, quick_dlg->callback, quick_dlg->mouse, quick_dlg->help,
quick_dlg->title, DLG_NONE);
/* add widgets into the dialog */
x2 = x1 + width2 + 1;
g = NULL;
two_columns = FALSE;
x = (WIDGET (dd)->cols - blen) / 2;
for (i = 0; i < widgets->len; i++)
{
quick_widget_item_t *item;
int column_width;
item = &g_array_index (widgets, quick_widget_item_t, i);
column_width = two_columns ? width2 : width1;
/* adjust widget width and x position */
switch (item->quick_widget->widget_type)
{
case quick_label:
{
quick_widget_t *input = item->quick_widget->u.label.input;
if (input != NULL && input->u.input.label_location == input_label_right)
{
/* location of this label will be adjusted later */
break;
}
}
/* fall through */
case quick_checkbox:
case quick_radio:
if (item->widget->x != x1)
item->widget->x = x2;
if (g != NULL)
item->widget->x += 2;
break;
case quick_button:
if (!put_buttons)
{
if (item->widget->x != x1)
item->widget->x = x2;
if (g != NULL)
item->widget->x += 2;
}
else
{
item->widget->x = x;
x += item->widget->cols + 1;
}
break;
case quick_input:
{
Widget *label = WIDGET (INPUT (item->widget)->label);
int width = column_width;
if (g != NULL)
width -= 4;
switch (item->quick_widget->u.input.label_location)
{
case input_label_left:
/* label was adjusted before; adjust input line */
item->widget->x = label->x + label->cols + 1 - WIDGET (label->owner)->x;
item->widget->cols = width - label->cols - 1;
break;
case input_label_right:
label->x =
item->widget->x + item->widget->cols + 1 - WIDGET (item->widget->owner)->x;
item->widget->cols = width - label->cols - 1;
break;
default:
if (item->widget->x != x1)
item->widget->x = x2;
if (g != NULL)
item->widget->x += 2;
item->widget->cols = width;
break;
}
/* forced update internal variables of inpuit line */
input_set_origin (INPUT (item->widget), item->widget->x, item->widget->cols);
}
break;
case quick_start_groupbox:
g = GROUPBOX (item->widget);
if (item->widget->x != x1)
item->widget->x = x2;
item->widget->cols = column_width;
break;
case quick_stop_groupbox:
g = NULL;
break;
case quick_separator:
if (item->widget != NULL)
{
if (g != NULL)
{
Widget *wg = WIDGET (g);
HLINE (item->widget)->auto_adjust_cols = FALSE;
item->widget->x = wg->x + 1 - WIDGET (wg->owner)->x;
item->widget->cols = wg->cols;
}
else if (two_columns)
{
HLINE (item->widget)->auto_adjust_cols = FALSE;
if (item->widget->x != x1)
item->widget->x = x2;
item->widget->x--;
item->widget->cols = column_width + 2;
}
else
HLINE (item->widget)->auto_adjust_cols = TRUE;
}
break;
case quick_start_columns:
two_columns = TRUE;
break;
case quick_stop_columns:
two_columns = FALSE;
break;
case quick_buttons:
/* several buttons in bottom line */
put_buttons = TRUE;
break;
default: default:
qw->widget = NULL;
fprintf (stderr, "QuickWidget: unknown widget type\n");
break; break;
} }
if (qw->widget != NULL) if (item->widget != NULL)
{ {
qw->widget->options |= qw->options; /* FIXME: cannot reset flags, setup only */ unsigned long id;
add_widget (dd, qw->widget);
/* add widget into dialog */
item->widget->options |= item->quick_widget->options; /* FIXME: cannot reset flags, setup only */
id = add_widget_autopos (dd, item->widget, item->quick_widget->pos_flags, NULL);
if (item->quick_widget->id != NULL)
*item->quick_widget->id = id;
} }
} }
@ -172,36 +574,50 @@ quick_dialog_skip (QuickDialog * qd, int nskip)
/* Get the data if we found something interesting */ /* Get the data if we found something interesting */
if (return_val != B_CANCEL) if (return_val != B_CANCEL)
{ for (i = 0; i < widgets->len; i++)
for (qw = qd->widgets; qw->widget_type != quick_end; qw++)
{ {
switch (qw->widget_type) quick_widget_item_t *item;
item = &g_array_index (widgets, quick_widget_item_t, i);
switch (item->quick_widget->widget_type)
{ {
case quick_checkbox: case quick_checkbox:
*qw->u.checkbox.state = ((WCheck *) qw->widget)->state & C_BOOL; *item->quick_widget->u.checkbox.state = CHECK (item->widget)->state & C_BOOL;
break; break;
case quick_input: case quick_input:
if ((qw->u.input.flags & 2) != 0) if ((quick_widget->u.input.flags & 2) != 0)
*qw->u.input.result = tilde_expand (((WInput *) qw->widget)->buffer); *item->quick_widget->u.input.result =
tilde_expand (INPUT (item->widget)->buffer);
else else
*qw->u.input.result = g_strdup (((WInput *) qw->widget)->buffer); *item->quick_widget->u.input.result = g_strdup (INPUT (item->widget)->buffer);
break; break;
case quick_radio: case quick_radio:
*qw->u.radio.value = ((WRadio *) qw->widget)->sel; *item->quick_widget->u.radio.value = RADIO (item->widget)->sel;
break; break;
default: default:
break; break;
} }
} }
}
destroy_dlg (dd); destroy_dlg (dd);
/* destroy input labels created before */
for (i = 0; i < widgets->len; i++)
{
quick_widget_item_t *item;
item = &g_array_index (widgets, quick_widget_item_t, i);
if (item->quick_widget->widget_type == quick_input)
g_free (item->quick_widget->u.input.label);
}
g_array_free (widgets, TRUE);
return return_val; return return_val;
#undef I18N
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -9,131 +9,226 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define QUICK_CHECKBOX(x, xdiv, y, ydiv, txt, st) \ #define QUICK_CHECKBOX(txt, st, id_) \
{ \ { \
.widget_type = quick_checkbox, \ .widget_type = quick_checkbox, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .checkbox = { \
.options = 0, \ .text = txt, \
.u = { \ .state = st \
.checkbox = { \ } \
.text = txt, \ } \
.state = st \
} \
} \
} }
#define QUICK_BUTTON(x, xdiv, y, ydiv, txt, act, cb) \ #define QUICK_BUTTON(txt, act, cb, id_) \
{ \ { \
.widget_type = quick_button, \ .widget_type = quick_button, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .button = { \
.options = 0, \ .text = txt, \
.u = { \ .action = act, \
.button = { \ .callback = cb \
.text = txt, \ } \
.action = act, \ } \
.callback = cb \
} \
} \
} }
#define QUICK_INPUT(x, xdiv, y, ydiv, txt, len_, flags_, hname, res) \ #define QUICK_INPUT(txt, flags_, hname, res, id_) \
{ \ { \
.widget_type = quick_input, \ .widget_type = quick_input, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .input = { \
.options = 0, \ .label_text = NULL, \
.u = { \ .label_location = input_label_none, \
.input = { \ .label = NULL, \
.text = txt, \ .text = txt, \
.len = len_, \ .flags = flags_, \
.flags = flags_, \ .histname = hname, \
.histname = hname, \ .result = res \
.result = res \ } \
} \ } \
} \
} }
#define QUICK_LABEL(x, xdiv, y, ydiv, txt) \ #define QUICK_LABELED_INPUT(label_, label_loc, txt, flags_, hname, res, id_) \
{ \ { \
.widget_type = quick_label, \ .widget_type = quick_input, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .input = { \
.options = 0, \ .label_text = label_, \
.u = { \ .label_location = label_loc, \
.label = { \ .label = NULL, \
.text = txt \ .text = txt, \
} \ .flags = flags_, \
} \ .histname = hname, \
.result = res \
} \
} \
} }
#define QUICK_RADIO(x, xdiv, y, ydiv, cnt, items_, val) \ #define QUICK_LABEL(txt, id_) \
{ \ { \
.widget_type = quick_radio, \ .widget_type = quick_label, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .label = { \
.options = 0, \ .text = txt, \
.u = { \ .input = NULL \
.radio = { \ } \
.count = cnt, \ } \
.items = items_, \
.value = val \
} \
} \
} }
#define QUICK_GROUPBOX(x, xdiv, y, ydiv, w, h, t) \ #define QUICK_RADIO(cnt, items_, val, id_) \
{ \ { \
.widget_type = quick_groupbox, \ .widget_type = quick_radio, \
.relative_x = x, \ .options = 0, \
.x_divisions = xdiv, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = y, \ .id = id_, \
.y_divisions = ydiv, \ .u = { \
.widget = NULL, \ .radio = { \
.options = 0, \ .count = cnt, \
.u = { \ .items = items_, \
.groupbox = { \ .value = val \
.width = w, \ } \
.height = h, \ } \
.title = t \
} \
} \
} }
#define QUICK_END \ #define QUICK_START_GROUPBOX(t) \
{ \ { \
.widget_type = quick_end, \ .widget_type = quick_start_groupbox, \
.relative_x = 0, \ .options = 0, \
.x_divisions = 0, \ .pos_flags = WPOS_KEEP_DEFAULT, \
.relative_y = 0, \ .id = NULL, \
.y_divisions = 0, \ .u = { \
.widget = NULL, \ .groupbox = { \
.options = 0, \ .title = t \
.u = { \ } \
.input = { \ } \
.text = NULL, \ }
.len = 0, \
.flags = 0, \ #define QUICK_STOP_GROUPBOX \
.histname = NULL, \ { \
.result = NULL \ .widget_type = quick_stop_groupbox, \
} \ .options = 0, \
} \ .pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.input = { \
.text = NULL, \
.flags = 0, \
.histname = NULL, \
.result = NULL \
} \
} \
}
#define QUICK_SEPARATOR(line_) \
{ \
.widget_type = quick_separator, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.separator = { \
.space = TRUE, \
.line = line_ \
} \
} \
}
#define QUICK_START_COLUMNS \
{ \
.widget_type = quick_start_columns, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.input = { \
.text = NULL, \
.flags = 0, \
.histname = NULL, \
.result = NULL \
} \
} \
}
#define QUICK_NEXT_COLUMN \
{ \
.widget_type = quick_next_column, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.input = { \
.text = NULL, \
.flags = 0, \
.histname = NULL, \
.result = NULL \
} \
} \
}
#define QUICK_STOP_COLUMNS \
{ \
.widget_type = quick_stop_columns, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.input = { \
.text = NULL, \
.flags = 0, \
.histname = NULL, \
.result = NULL \
} \
} \
}
#define QUICK_START_BUTTONS(space_, line_) \
{ \
.widget_type = quick_buttons, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.separator = { \
.space = space_, \
.line = line_ \
} \
} \
}
#define QUICK_BUTTONS_OK_CANCEL \
QUICK_START_BUTTONS (TRUE, TRUE), \
QUICK_BUTTON (N_("&OK"), B_ENTER, NULL, NULL), \
QUICK_BUTTON (N_("&Cancel"), B_CANCEL, NULL, NULL)
#define QUICK_END \
{ \
.widget_type = quick_end, \
.options = 0, \
.pos_flags = WPOS_KEEP_DEFAULT, \
.id = NULL, \
.u = { \
.input = { \
.text = NULL, \
.flags = 0, \
.histname = NULL, \
.result = NULL \
} \
} \
} }
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
@ -147,23 +242,36 @@ typedef enum
quick_input = 3, quick_input = 3,
quick_label = 4, quick_label = 4,
quick_radio = 5, quick_radio = 5,
quick_groupbox = 6 quick_start_groupbox = 6,
quick_stop_groupbox = 7,
quick_separator = 8,
quick_start_columns = 9,
quick_next_column = 10,
quick_stop_columns = 11,
quick_buttons = 12
} quick_t; } quick_t;
typedef enum
{
input_label_none = 0,
input_label_above = 1,
input_label_left = 2,
input_label_right = 3,
input_label_below = 4
} quick_input_label_location_t;
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
/* The widget is placed on relative_?/divisions_? of the parent widget */ /* The widget is placed on relative_?/divisions_? of the parent widget */
typedef struct typedef struct quick_widget_t quick_widget_t;
struct quick_widget_t
{ {
quick_t widget_type; quick_t widget_type;
int relative_x;
int x_divisions;
int relative_y;
int y_divisions;
Widget *widget;
widget_options_t options; widget_options_t options;
widget_pos_flags_t pos_flags;
unsigned long *id;
/* widget parameters */ /* widget parameters */
union union
@ -183,8 +291,10 @@ typedef struct
struct struct
{ {
const char *label_text;
quick_input_label_location_t label_location;
quick_widget_t *label;
const char *text; const char *text;
int len;
int flags; /* 1 -- is_password, 2 -- INPUT_COMPLETE_CD */ int flags; /* 1 -- is_password, 2 -- INPUT_COMPLETE_CD */
const char *histname; const char *histname;
char **result; char **result;
@ -194,6 +304,7 @@ typedef struct
struct struct
{ {
const char *text; const char *text;
quick_widget_t *input;
} label; } label;
struct struct
@ -205,37 +316,40 @@ typedef struct
struct struct
{ {
int width;
int height;
const char *title; const char *title;
} groupbox; } groupbox;
struct
{
gboolean space;
gboolean line;
} separator;
} u; } u;
} QuickWidget; };
typedef struct typedef struct
{ {
int xlen, ylen; int y, x; /* if -1, then center the dialog */
int xpos, ypos; /* if -1, then center the dialog */ int cols; /* heigth is calculated automatically */
const char *title; const char *title;
const char *help; const char *help;
QuickWidget *widgets; quick_widget_t *widgets;
dlg_cb_fn callback; widget_cb_fn callback;
mouse_h mouse; mouse_h mouse;
gboolean i18n; /* If true, internationalization has happened */ } quick_dialog_t;
} QuickDialog;
/*** global variables defined in .c file *********************************************************/ /*** global variables defined in .c file *********************************************************/
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
int quick_dialog_skip (QuickDialog * qd, int nskip); int quick_dialog_skip (quick_dialog_t * quick_dlg, int nskip);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/
static inline int static inline int
quick_dialog (QuickDialog * qd) quick_dialog (quick_dialog_t * quick_dlg)
{ {
return quick_dialog_skip (qd, 0); return quick_dialog_skip (quick_dlg, 1);
} }
#endif /* MC__QUICK_H */ #endif /* MC__QUICK_H */

Просмотреть файл

@ -54,15 +54,14 @@
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t static cb_ret_t
radio_callback (Widget * w, widget_msg_t msg, int parm) radio_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WRadio *r = (WRadio *) w; WRadio *r = RADIO (w);
int i; int i;
Dlg_head *h = r->widget.owner;
switch (msg) switch (msg)
{ {
case WIDGET_HOTKEY: case MSG_HOTKEY:
{ {
for (i = 0; i < r->count; i++) for (i = 0; i < r->count; i++)
{ {
@ -75,20 +74,20 @@ radio_callback (Widget * w, widget_msg_t msg, int parm)
r->pos = i; r->pos = i;
/* Take action */ /* Take action */
radio_callback (w, WIDGET_KEY, ' '); send_message (w, sender, MSG_KEY, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
} }
} }
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_KEY: case MSG_KEY:
switch (parm) switch (parm)
{ {
case ' ': case ' ':
r->sel = r->pos; r->sel = r->pos;
h->callback (h, w, DLG_ACTION, 0, NULL); send_message (w->owner, w, MSG_ACTION, 0, NULL);
radio_callback (w, WIDGET_FOCUS, ' '); send_message (w, sender, MSG_FOCUS, ' ', data);
return MSG_HANDLED; return MSG_HANDLED;
case KEY_UP: case KEY_UP:
@ -110,35 +109,35 @@ radio_callback (Widget * w, widget_msg_t msg, int parm)
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
h->callback (h, w, DLG_ACTION, 0, NULL); send_message (w->owner, w, MSG_ACTION, 0, NULL);
radio_callback (w, WIDGET_FOCUS, ' '); send_message (w, sender, MSG_FOCUS, ' ', data);
widget_move (&r->widget, r->pos, 1); widget_move (r, r->pos, 1);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_DRAW: case MSG_DRAW:
for (i = 0; i < r->count; i++) for (i = 0; i < r->count; i++)
{ {
const gboolean focused = (i == r->pos && msg == WIDGET_FOCUS); const gboolean focused = (i == r->pos && msg == MSG_FOCUS);
widget_selectcolor (w, focused, FALSE); widget_selectcolor (w, focused, FALSE);
widget_move (&r->widget, i, 0); widget_move (r, i, 0);
tty_draw_hline (r->widget.y + i, r->widget.x, ' ', r->widget.cols); tty_draw_hline (w->y + i, w->x, ' ', w->cols);
tty_print_string ((r->sel == i) ? "(*) " : "( ) "); tty_print_string ((r->sel == i) ? "(*) " : "( ) ");
hotkey_draw (w, r->texts[i], focused); hotkey_draw (w, r->texts[i], focused);
} }
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DESTROY: case MSG_DESTROY:
for (i = 0; i < r->count; i++) for (i = 0; i < r->count; i++)
release_hotkey (r->texts[i]); release_hotkey (r->texts[i]);
g_free (r->texts); g_free (r->texts);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -147,14 +146,14 @@ radio_callback (Widget * w, widget_msg_t msg, int parm)
static int static int
radio_event (Gpm_Event * event, void *data) radio_event (Gpm_Event * event, void *data)
{ {
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
return MOU_UNHANDLED; return MOU_UNHANDLED;
if ((event->type & (GPM_DOWN | GPM_UP)) != 0) if ((event->type & (GPM_DOWN | GPM_UP)) != 0)
{ {
WRadio *r = (WRadio *) data; WRadio *r = RADIO (data);
Gpm_Event local; Gpm_Event local;
local = mouse_get_local (event, w); local = mouse_get_local (event, w);
@ -163,8 +162,8 @@ radio_event (Gpm_Event * event, void *data)
dlg_select_widget (w); dlg_select_widget (w);
if ((event->type & GPM_UP) != 0) if ((event->type & GPM_UP) != 0)
{ {
radio_callback (w, WIDGET_KEY, ' '); radio_callback (w, NULL, MSG_KEY, ' ', NULL);
w->owner->callback (w->owner, w, DLG_POST_KEY, ' ', NULL); send_message (w->owner, w, MSG_POST_KEY, ' ', NULL);
} }
} }
@ -179,28 +178,31 @@ WRadio *
radio_new (int y, int x, int count, const char **texts) radio_new (int y, int x, int count, const char **texts)
{ {
WRadio *r; WRadio *r;
Widget *w;
int i, wmax = 0; int i, wmax = 0;
r = g_new (WRadio, 1); r = g_new (WRadio, 1);
w = WIDGET (r);
/* Compute the longest string */ /* Compute the longest string */
r->texts = g_new (hotkey_t, count); r->texts = g_new (hotkey_t, count);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
{ {
int w; int width;
r->texts[i] = parse_hotkey (texts[i]); r->texts[i] = parse_hotkey (texts[i]);
w = hotkey_width (r->texts[i]); width = hotkey_width (r->texts[i]);
wmax = max (w, wmax); wmax = max (width, wmax);
} }
init_widget (&r->widget, y, x, count, 4 + wmax, radio_callback, radio_event); init_widget (w, y, x, count, 4 + wmax, radio_callback, radio_event);
/* 4 is width of "(*) " */ /* 4 is width of "(*) " */
r->state = 1; r->state = 1;
r->pos = 0; r->pos = 0;
r->sel = 0; r->sel = 0;
r->count = count; r->count = count;
widget_want_hotkey (r->widget, TRUE); widget_want_hotkey (w, TRUE);
return r; return r;
} }

Просмотреть файл

@ -8,6 +8,8 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define RADIO(x) ((WRadio *)(x))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/

Просмотреть файл

@ -139,7 +139,7 @@ hotkey_draw (Widget * w, const hotkey_t hotkey, gboolean focused)
void void
init_widget (Widget * w, int y, int x, int lines, int cols, init_widget (Widget * w, int y, int x, int lines, int cols,
callback_fn callback, mouse_h mouse_handler) widget_cb_fn callback, mouse_h mouse_handler)
{ {
w->x = x; w->x = x;
w->y = y; w->y = y;
@ -147,6 +147,7 @@ init_widget (Widget * w, int y, int x, int lines, int cols,
w->lines = lines; w->lines = lines;
w->callback = callback; w->callback = callback;
w->mouse = mouse_handler; w->mouse = mouse_handler;
w->set_options = widget_default_set_options_callback;
w->owner = NULL; w->owner = NULL;
/* Almost all widgets want to put the cursor in a suitable place */ /* Almost all widgets want to put the cursor in a suitable place */
@ -157,19 +158,22 @@ init_widget (Widget * w, int y, int x, int lines, int cols,
/* Default callback for widgets */ /* Default callback for widgets */
cb_ret_t cb_ret_t
default_proc (widget_msg_t msg, int parm) widget_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
(void) w;
(void) sender;
(void) parm; (void) parm;
(void) data;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
case WIDGET_FOCUS: case MSG_FOCUS:
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
case WIDGET_DRAW: case MSG_DRAW:
case WIDGET_DESTROY: case MSG_DESTROY:
case WIDGET_CURSOR: case MSG_CURSOR:
case WIDGET_IDLE: case MSG_IDLE:
return MSG_HANDLED; return MSG_HANDLED;
default: default:
@ -179,6 +183,42 @@ default_proc (widget_msg_t msg, int parm)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/**
* Callback for applying new options to widget.
*
* @param w widget
* @param options options set
* @param enable TRUE if specified options should be added, FALSE if options should be removed
*/
void
widget_default_set_options_callback (Widget *w, widget_options_t options, gboolean enable)
{
if (enable)
w->options |= options;
else
w->options &= ~options;
if (w->owner != NULL && (options & W_DISABLED) != 0)
send_message (w, NULL, MSG_DRAW, 0, NULL);
}
/* --------------------------------------------------------------------------------------------- */
/**
* Apply new options to widget.
*
* @param w widget
* @param options options set
* @param enable TRUE if specified options should be added, FALSE if options should be removed
*/
void
widget_set_options (Widget *w, widget_options_t options, gboolean enable)
{
w->set_options (w, options, enable);
}
/* --------------------------------------------------------------------------------------------- */
void void
widget_set_size (Widget * widget, int y, int x, int lines, int cols) widget_set_size (Widget * widget, int y, int x, int lines, int cols)
{ {
@ -186,7 +226,7 @@ widget_set_size (Widget * widget, int y, int x, int lines, int cols)
widget->y = y; widget->y = y;
widget->cols = cols; widget->cols = cols;
widget->lines = lines; widget->lines = lines;
send_message (widget, WIDGET_RESIZED, 0 /* unused */ ); send_message (widget, NULL, MSG_RESIZE, 0, NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -194,7 +234,7 @@ widget_set_size (Widget * widget, int y, int x, int lines, int cols)
void void
widget_selectcolor (Widget * w, gboolean focused, gboolean hotkey) widget_selectcolor (Widget * w, gboolean focused, gboolean hotkey)
{ {
Dlg_head *h = w->owner; WDialog *h = w->owner;
int color; int color;
if ((w->options & W_DISABLED) != 0) if ((w->options & W_DISABLED) != 0)

Просмотреть файл

@ -10,38 +10,45 @@
/*** typedefs(not structures) and defined constants **********************************************/ /*** typedefs(not structures) and defined constants **********************************************/
#define widget_move(w, _y, _x) tty_gotoyx (((Widget *)(w))->y + (_y), ((Widget *)(w))->x + (_x)) #define WIDGET(x) ((Widget *)(x))
#define widget_move(w, _y, _x) tty_gotoyx (WIDGET(w)->y + (_y), WIDGET(w)->x + (_x))
/* Sets/clear the specified flag in the options field */ /* Sets/clear the specified flag in the options field */
#define widget_option(w,f,i) \ #define widget_want_cursor(w,i) widget_set_options(w, W_WANT_CURSOR, i)
w.options = ((i) ? ((w).options | (f)) : ((w).options & (~(f)))) #define widget_want_hotkey(w,i) widget_set_options(w, W_WANT_HOTKEY, i)
#define widget_want_cursor(w,i) widget_option((w), W_WANT_CURSOR, (i)) #define widget_want_idle(w,i) widget_set_options(w, W_WANT_IDLE, i)
#define widget_want_hotkey(w,i) widget_option((w), W_WANT_HOTKEY, (i)) #define widget_disable(w,i) widget_set_options(w, W_DISABLED, i)
#define widget_disable(w,i) widget_option((w), W_DISABLED, (i))
/*** enums ***************************************************************************************/ /*** enums ***************************************************************************************/
/* Widget messages */ /* Widget messages */
typedef enum typedef enum
{ {
WIDGET_INIT, /* Initialize widget */ MSG_INIT = 0, /* Initialize widget */
WIDGET_FOCUS, /* Draw widget in focused state */ MSG_FOCUS, /* Draw widget in focused state or widget has got focus */
WIDGET_UNFOCUS, /* Draw widget in unfocused state */ MSG_UNFOCUS, /* Draw widget in unfocused state or widget has been unfocused */
WIDGET_DRAW, /* Sent to widget to draw themselves */ MSG_DRAW, /* Draw widget on screen */
WIDGET_KEY, /* Sent to widgets on key press */ MSG_KEY, /* Sent to widgets on key press */
WIDGET_HOTKEY, /* Sent to widget to catch preprocess key */ MSG_HOTKEY, /* Sent to widget to catch preprocess key */
WIDGET_COMMAND, /* Send to widget to handle command */ MSG_HOTKEY_HANDLED, /* A widget has got the hotkey */
WIDGET_DESTROY, /* Sent to widget at destruction time */ MSG_UNHANDLED_KEY, /* Key that no widget handled */
WIDGET_CURSOR, /* Sent to widget to position the cursor */ MSG_POST_KEY, /* The key has been handled */
WIDGET_IDLE, /* Sent to widgets with options & W_WANT_IDLE */ MSG_ACTION, /* Send to widget to handle command or
WIDGET_RESIZED /* Sent after a widget has been resized */ * state of check- and radiobuttons has changed
* and listbox current entry has changed */
MSG_CURSOR, /* Sent to widget to position the cursor */
MSG_IDLE, /* The idle state is active */
MSG_RESIZE, /* Screen size has changed */
MSG_VALIDATE, /* Dialog is to be closed */
MSG_END, /* Shut down dialog */
MSG_DESTROY /* Sent to widget at destruction time */
} widget_msg_t; } widget_msg_t;
/* Widgets are expected to answer to the following messages: /* Widgets are expected to answer to the following messages:
MSG_FOCUS: MSG_HANDLED if the accept the focus, MSG_NOT_HANDLED if they do not.
WIDGET_FOCUS: 1 if the accept the focus, 0 if they do not. MSG_UNFOCUS: MSG_HANDLED if they accept to release the focus, MSG_NOT_HANDLED if they don't.
WIDGET_UNFOCUS: 1 if they accept to release the focus, 0 if they don't. MSG_KEY: MSG_HANDLED if they actually used the key, MSG_NOT_HANDLED if not.
WIDGET_KEY: 1 if they actually used the key, 0 if not. MSG_HOTKEY: MSG_HANDLED if they actually used the key, MSG_NOT_HANDLED if not.
WIDGET_HOTKEY: 1 if they actually used the key, 0 if not.
*/ */
typedef enum typedef enum
@ -63,19 +70,28 @@ typedef enum
/* Flags for widget repositioning on dialog resize */ /* Flags for widget repositioning on dialog resize */
typedef enum typedef enum
{ {
WPOS_KEEP_LEFT = (1 << 0), /* keep widget distance to left border of dialog */ WPOS_CENTER_HORZ = (1 << 0), /* center widget in horizontal */
WPOS_KEEP_RIGHT = (1 << 1), /* keep widget distance to right border of dialog */ WPOS_CENTER_VERT = (1 << 1), /* center widget in vertical */
WPOS_KEEP_TOP = (1 << 2), /* keep widget distance to top border of dialog */ WPOS_KEEP_LEFT = (1 << 2), /* keep widget distance to left border of dialog */
WPOS_KEEP_BOTTOM = (1 << 3), /* keep widget distance to bottom border of dialog */ WPOS_KEEP_RIGHT = (1 << 3), /* keep widget distance to right border of dialog */
WPOS_KEEP_TOP = (1 << 4), /* keep widget distance to top border of dialog */
WPOS_KEEP_BOTTOM = (1 << 5), /* keep widget distance to bottom border of dialog */
WPOS_KEEP_HORZ = WPOS_KEEP_LEFT | WPOS_KEEP_RIGHT, WPOS_KEEP_HORZ = WPOS_KEEP_LEFT | WPOS_KEEP_RIGHT,
WPOS_KEEP_VERT = WPOS_KEEP_TOP | WPOS_KEEP_BOTTOM, WPOS_KEEP_VERT = WPOS_KEEP_TOP | WPOS_KEEP_BOTTOM,
WPOS_KEEP_ALL = WPOS_KEEP_HORZ | WPOS_KEEP_VERT WPOS_KEEP_ALL = WPOS_KEEP_HORZ | WPOS_KEEP_VERT,
WPOS_KEEP_DEFAULT = WPOS_KEEP_LEFT | WPOS_KEEP_TOP
} widget_pos_flags_t; } widget_pos_flags_t;
/* NOTE: if WPOS_CENTER_HORZ flag is used, other horizontal flags (WPOS_KEEP_LEFT, WPOS_KEEP_RIGHT,
* and WPOS_KEEP_HORZ are ignored).
* If WPOS_CENTER_VERT flag is used, other horizontal flags (WPOS_KEEP_TOP, WPOS_KEEP_BOTTOM,
* and WPOS_KEEP_VERT are ignored).
*/
/*** structures declarations (and typedefs of structures)*****************************************/ /*** structures declarations (and typedefs of structures)*****************************************/
/* Widget callback */ /* Widget callback */
typedef cb_ret_t (*callback_fn) (struct Widget * widget, widget_msg_t msg, int parm); typedef cb_ret_t (*widget_cb_fn) (Widget * widget, Widget * sender, widget_msg_t msg, int parm,
void *data);
/* Every Widget must have this as its first element */ /* Every Widget must have this as its first element */
struct Widget struct Widget
@ -85,9 +101,10 @@ struct Widget
widget_options_t options; widget_options_t options;
widget_pos_flags_t pos_flags; /* repositioning flags */ widget_pos_flags_t pos_flags; /* repositioning flags */
unsigned int id; /* Number of the widget, starting with 0 */ unsigned int id; /* Number of the widget, starting with 0 */
callback_fn callback; widget_cb_fn callback;
mouse_h mouse; mouse_h mouse;
struct Dlg_head *owner; void (*set_options) (Widget *w, widget_options_t options, gboolean enable);
struct WDialog *owner;
}; };
/* structure for label (caption) with hotkey, if original text does not contain /* structure for label (caption) with hotkey, if original text does not contain
@ -112,16 +129,18 @@ void release_hotkey (const hotkey_t hotkey);
/* return width on terminal of hotkey */ /* return width on terminal of hotkey */
int hotkey_width (const hotkey_t hotkey); int hotkey_width (const hotkey_t hotkey);
/* draw hotkey of widget */ /* draw hotkey of widget */
void hotkey_draw (struct Widget *w, const hotkey_t hotkey, gboolean focused); void hotkey_draw (Widget *w, const hotkey_t hotkey, gboolean focused);
/* widget initialization */ /* widget initialization */
void init_widget (Widget * w, int y, int x, int lines, int cols, void init_widget (Widget * w, int y, int x, int lines, int cols,
callback_fn callback, mouse_h mouse_handler); widget_cb_fn callback, mouse_h mouse_handler);
/* Default callback for widgets */ /* Default callback for widgets */
cb_ret_t default_proc (widget_msg_t msg, int parm); cb_ret_t widget_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data);
void widget_default_set_options_callback (Widget *w, widget_options_t options, gboolean enable);
void widget_set_options (Widget *w, widget_options_t options, gboolean enable);
void widget_set_size (Widget * widget, int y, int x, int lines, int cols); void widget_set_size (Widget * widget, int y, int x, int lines, int cols);
/* select color for widget in dependance of state */ /* select color for widget in dependance of state */
void widget_selectcolor (struct Widget *w, gboolean focused, gboolean hotkey); void widget_selectcolor (Widget *w, gboolean focused, gboolean hotkey);
void widget_erase (Widget * w); void widget_erase (Widget * w);
/* get mouse pointer location within widget */ /* get mouse pointer location within widget */
@ -131,9 +150,9 @@ gboolean mouse_global_in_widget (const Gpm_Event * event, const Widget * w);
/*** inline functions ****************************************************************************/ /*** inline functions ****************************************************************************/
static inline cb_ret_t static inline cb_ret_t
send_message (Widget * w, widget_msg_t msg, int parm) send_message (void *w, void *sender, widget_msg_t msg, int parm, void *data)
{ {
return w->callback (w, msg, parm); return WIDGET (w)->callback (WIDGET (w), WIDGET (sender), msg, parm, data);
} }
#endif /* MC__WIDGET_INTERNAL_H */ #endif /* MC__WIDGET_INTERNAL_H */

Просмотреть файл

@ -2,7 +2,7 @@
Widget based utility functions. Widget based utility functions.
Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004, Copyright (C) 1994, 1995, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008, 2009, 2010, 2011 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
The Free Software Foundation, Inc. The Free Software Foundation, Inc.
Authors: Authors:
@ -10,7 +10,7 @@
Radek Doulik, 1994, 1995 Radek Doulik, 1994, 1995
Jakub Jelinek, 1995 Jakub Jelinek, 1995
Andrej Borsenkow, 1995 Andrej Borsenkow, 1995
Andrew Borodin <aborodin@vmail.ru>, 2009, 2010 Andrew Borodin <aborodin@vmail.ru>, 2009, 2010, 2012
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -53,7 +53,7 @@
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
static Dlg_head *last_query_dlg; static WDialog *last_query_dlg;
static int sel_pos = 0; static int sel_pos = 0;
@ -63,21 +63,23 @@ static int sel_pos = 0;
/** default query callback, used to reposition query */ /** default query callback, used to reposition query */
static cb_ret_t static cb_ret_t
default_query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) query_default_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WDialog *h = DIALOG (w);
switch (msg) switch (msg)
{ {
case DLG_RESIZE: case MSG_RESIZE:
if ((h->flags & DLG_CENTER) == 0) if ((h->flags & DLG_CENTER) == 0)
{ {
Dlg_head *prev_dlg = NULL; WDialog *prev_dlg = NULL;
int ypos, xpos; int ypos, xpos;
/* get dialog under h */ /* get dialog under h */
if (top_dlg != NULL) if (top_dlg != NULL)
{ {
if (top_dlg->data != (void *) h) if (top_dlg->data != (void *) h)
prev_dlg = (Dlg_head *) top_dlg->data; prev_dlg = DIALOG (top_dlg->data);
else else
{ {
GList *p; GList *p;
@ -86,38 +88,38 @@ default_query_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
Get previous dialog in stack */ Get previous dialog in stack */
p = g_list_next (top_dlg); p = g_list_next (top_dlg);
if (p != NULL) if (p != NULL)
prev_dlg = (Dlg_head *) p->data; prev_dlg = DIALOG (p->data);
} }
} }
/* if previous dialog is not fullscreen'd -- overlap it */ /* if previous dialog is not fullscreen'd -- overlap it */
if (prev_dlg == NULL || prev_dlg->fullscreen) if (prev_dlg == NULL || prev_dlg->fullscreen)
ypos = LINES / 3 - (h->lines - 3) / 2; ypos = LINES / 3 - (w->lines - 3) / 2;
else else
ypos = prev_dlg->y + 2; ypos = WIDGET (prev_dlg)->y + 2;
xpos = COLS / 2 - h->cols / 2; xpos = COLS / 2 - w->cols / 2;
/* set position */ /* set position */
dlg_set_position (h, ypos, xpos, ypos + h->lines, xpos + h->cols); dlg_set_position (h, ypos, xpos, ypos + w->lines, xpos + w->cols);
return MSG_HANDLED; return MSG_HANDLED;
} }
/* fallthrough */ /* fallthrough */
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/** Create message dialog */ /** Create message dialog */
static struct Dlg_head * static struct WDialog *
do_create_message (int flags, const char *title, const char *text) do_create_message (int flags, const char *title, const char *text)
{ {
char *p; char *p;
Dlg_head *d; WDialog *d;
/* Add empty lines before and after the message */ /* Add empty lines before and after the message */
p = g_strconcat ("\n", text, "\n", (char *) NULL); p = g_strconcat ("\n", text, "\n", (char *) NULL);
@ -125,7 +127,7 @@ do_create_message (int flags, const char *title, const char *text)
d = last_query_dlg; d = last_query_dlg;
/* do resize before initing and running */ /* do resize before initing and running */
default_query_callback (d, NULL, DLG_RESIZE, 0, NULL); send_message (d, NULL, MSG_RESIZE, 0, NULL);
init_dlg (d); init_dlg (d);
g_free (p); g_free (p);
@ -142,7 +144,7 @@ do_create_message (int flags, const char *title, const char *text)
static void static void
fg_message (int flags, const char *title, const char *text) fg_message (int flags, const char *title, const char *text)
{ {
Dlg_head *d; WDialog *d;
d = do_create_message (flags, title, text); d = do_create_message (flags, title, text);
tty_getch (); tty_getch ();
@ -182,84 +184,44 @@ static char *
fg_input_dialog_help (const char *header, const char *text, const char *help, fg_input_dialog_help (const char *header, const char *text, const char *help,
const char *history_name, const char *def_text, gboolean strip_password) const char *history_name, const char *def_text, gboolean strip_password)
{ {
char *my_str;
int flags = (strip_password) ? 4 : 0;
QuickWidget quick_widgets[] = {
/* 0 */ QUICK_BUTTON (6, 64, 1, 0, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */ QUICK_BUTTON (3, 64, 1, 0, N_("&OK"), B_ENTER, NULL),
/* 2 */ QUICK_INPUT (3, 64, 0, 0, def_text, 58, flags, NULL, &my_str),
/* 3 */ QUICK_LABEL (3, 64, 2, 0, ""),
QUICK_END
};
int b0_len, b1_len, b_len, gap;
char histname[64] = "inp|";
int lines, cols;
int len;
int i;
char *p_text; char *p_text;
char histname[64] = "inp|";
int flags = strip_password ? 4 : 0;
char *my_str;
int ret; int ret;
/* buttons */ /* label text */
#ifdef ENABLE_NLS p_text = g_strstrip (g_strdup (text));
quick_widgets[0].u.button.text = _(quick_widgets[0].u.button.text);
quick_widgets[1].u.button.text = _(quick_widgets[1].u.button.text);
#endif /* ENABLE_NLS */
b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3; /* input history */
b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 5; /* default button */
b_len = b0_len + b1_len + 2; /* including gap */
/* input line */
if (history_name != NULL && *history_name != '\0') if (history_name != NULL && *history_name != '\0')
{
g_strlcpy (histname + 3, history_name, sizeof (histname) - 3); g_strlcpy (histname + 3, history_name, sizeof (histname) - 3);
quick_widgets[2].u.input.histname = histname;
}
/* The special value of def_text is used to identify password boxes /* The special value of def_text is used to identify password boxes
and hide characters with "*". Don't save passwords in history! */ and hide characters with "*". Don't save passwords in history! */
if (def_text == INPUT_PASSWORD) if (def_text == INPUT_PASSWORD)
{ {
quick_widgets[2].u.input.flags = 1; flags = 1;
histname[3] = '\0'; histname[3] = '\0';
quick_widgets[2].u.input.text = ""; def_text = "";
} }
/* text */
p_text = g_strstrip (g_strdup (text));
str_msg_term_size (p_text, &lines, &cols);
quick_widgets[3].u.label.text = p_text;
/* dialog width */
len = str_term_width1 (header);
len = max (max (len, cols) + 4, 64);
len = min (max (len, b_len + 6), COLS);
/* button locations */
gap = (len - 8 - b_len) / 3;
quick_widgets[1].relative_x = 3 + gap;
quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + gap + 2;
{ {
QuickDialog Quick_input = { quick_widget_t quick_widgets[] = {
len, lines + 6, -1, -1, header, /* *INDENT-OFF* */
help, quick_widgets, NULL, NULL, TRUE QUICK_LABELED_INPUT (p_text, input_label_above, def_text, flags, histname, &my_str,
NULL),
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
}; };
for (i = 0; i < 4; i++) quick_dialog_t qdlg = {
{ -1, -1, COLS / 2, header,
quick_widgets[i].x_divisions = Quick_input.xlen; help, quick_widgets, NULL, NULL
quick_widgets[i].y_divisions = Quick_input.ylen; };
}
for (i = 0; i < 3; i++) ret = quick_dialog (&qdlg);
quick_widgets[i].relative_y += 2 + lines;
/* input line length */
quick_widgets[2].u.input.len = Quick_input.xlen - 6;
ret = quick_dialog (&Quick_input);
} }
g_free (p_text); g_free (p_text);
@ -309,7 +271,7 @@ int
query_dialog (const char *header, const char *text, int flags, int count, ...) query_dialog (const char *header, const char *text, int flags, int count, ...)
{ {
va_list ap; va_list ap;
Dlg_head *query_dlg; WDialog *query_dlg;
WButton *button; WButton *button;
WButton *defbutton = NULL; WButton *defbutton = NULL;
int win_len = 0; int win_len = 0;
@ -343,11 +305,16 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
/* prepare dialog */ /* prepare dialog */
query_dlg = query_dlg =
create_dlg (TRUE, 0, 0, lines, cols, query_colors, default_query_callback, NULL, create_dlg (TRUE, 0, 0, lines, cols, query_colors, query_default_callback, NULL,
"[QueryBox]", header, dlg_flags); "[QueryBox]", header, dlg_flags);
if (count > 0) if (count > 0)
{ {
add_widget_autopos (query_dlg, label_new (2, 3, text), WPOS_KEEP_TOP | WPOS_CENTER_HORZ,
NULL);
add_widget (query_dlg, hline_new (lines - 4, -1, -1));
cols = (cols - win_len - 2) / 2 + 2; cols = (cols - win_len - 2) / 2 + 2;
va_start (ap, count); va_start (ap, count);
for (i = 0; i < count; i++) for (i = 0; i < count; i++)
@ -359,7 +326,7 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
if (strchr (cur_name, '&') != NULL) if (strchr (cur_name, '&') != NULL)
xpos--; xpos--;
button = button_new (lines - 3, cols, B_USER + i, NORMAL_BUTTON, cur_name, 0); button = button_new (lines - 3, cols, B_USER + i, NORMAL_BUTTON, cur_name, NULL);
add_widget (query_dlg, button); add_widget (query_dlg, button);
cols += xpos; cols += xpos;
if (i == sel_pos) if (i == sel_pos)
@ -367,12 +334,10 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
} }
va_end (ap); va_end (ap);
add_widget (query_dlg, label_new (2, 3, text));
/* do resize before running and selecting any widget */ /* do resize before running and selecting any widget */
default_query_callback (query_dlg, NULL, DLG_RESIZE, 0, NULL); send_message (query_dlg, NULL, MSG_RESIZE, 0, NULL);
if (defbutton) if (defbutton != NULL)
dlg_select_widget (defbutton); dlg_select_widget (defbutton);
/* run dialog and make result */ /* run dialog and make result */
@ -389,8 +354,9 @@ query_dialog (const char *header, const char *text, int flags, int count, ...)
} }
else else
{ {
add_widget (query_dlg, label_new (2, 3, text)); add_widget_autopos (query_dlg, label_new (2, 3, text), WPOS_KEEP_TOP | WPOS_CENTER_HORZ,
add_widget (query_dlg, button_new (0, 0, 0, HIDDEN_BUTTON, "-", 0)); NULL);
add_widget (query_dlg, button_new (0, 0, 0, HIDDEN_BUTTON, "-", NULL));
last_query_dlg = query_dlg; last_query_dlg = query_dlg;
} }
sel_pos = 0; sel_pos = 0;
@ -411,11 +377,11 @@ query_set_sel (int new_sel)
* destroy_dlg() to dismiss it. Not safe to call from background. * destroy_dlg() to dismiss it. Not safe to call from background.
*/ */
struct Dlg_head * struct WDialog *
create_message (int flags, const char *title, const char *text, ...) create_message (int flags, const char *title, const char *text, ...)
{ {
va_list args; va_list args;
Dlg_head *d; WDialog *d;
char *p; char *p;
va_start (args, text); va_start (args, text);

Просмотреть файл

@ -41,8 +41,8 @@ int query_dialog (const char *header, const char *text, int flags, int count, ..
void query_set_sel (int new_sel); void query_set_sel (int new_sel);
/* Create message box but don't dismiss it yet, not background safe */ /* Create message box but don't dismiss it yet, not background safe */
struct Dlg_head *create_message (int flags, const char *title, struct WDialog *create_message (int flags, const char *title,
const char *text, ...) __attribute__ ((format (__printf__, 3, 4))); const char *text, ...) __attribute__ ((format (__printf__, 3, 4)));
/* Show message box, background safe */ /* Show message box, background safe */
void message (int flags, const char *title, const char *text, ...) void message (int flags, const char *title, const char *text, ...)

2467
po/az.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2827
po/be.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2490
po/bg.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2522
po/ca.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2786
po/cs.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2786
po/da.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2795
po/de.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2696
po/el.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2886
po/eo.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2886
po/es.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1195
po/et.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2845
po/eu.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2376
po/fi.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2618
po/fr.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2851
po/gl.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2869
po/hu.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2450
po/ia.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2306
po/id.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

1118
po/it.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2502
po/ja.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2288
po/ka.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2498
po/ko.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2503
po/lt.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2476
po/lv.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2971
po/mc.pot

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2468
po/mn.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2464
po/nb.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2816
po/nl.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2896
po/pl.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2530
po/pt.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2468
po/ro.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2811
po/ru.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2520
po/sk.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2490
po/sl.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2474
po/sr.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2467
po/sv.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2281
po/ta.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2469
po/tr.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2892
po/uk.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2482
po/vi.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

2426
po/wa.po

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,11 +1,12 @@
/* /*
Search functions for diffviewer. Search functions for diffviewer.
Copyright (C) 2010, 2011 Copyright (C) 2010, 2011, 2012
The Free Software Foundation, Inc. The Free Software Foundation, Inc.
Written by: Written by:
Slava Zanko <slavazanko@gmail.com>, 2010. Slava Zanko <slavazanko@gmail.com>, 2010.
Andrew Borodin <aborodin@vmail.ru>, 2012
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -43,9 +44,6 @@
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#define SEARCH_DLG_WIDTH 58
#define SEARCH_DLG_HEIGHT 13
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
typedef struct mcdiffview_search_options_struct typedef struct mcdiffview_search_options_struct
@ -67,85 +65,53 @@ static mcdiffview_search_options_t mcdiffview_search_options = {
.all_codepages = FALSE, .all_codepages = FALSE,
}; };
/*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/
#define DLG_BTN1_text N_("&Cancel")
#define DLG_BTN2_text N_("&OK")
static void
mcdiffview_dialog_fix_buttons_positions (QuickDialog * dlg)
{
size_t str_cancel_len, str_ok_len;
size_t first_start_position;
str_cancel_len = str_term_width1 (_(DLG_BTN1_text)) + 4;
str_ok_len = str_term_width1 (_(DLG_BTN2_text)) + 6;
first_start_position = (SEARCH_DLG_WIDTH - str_cancel_len - str_ok_len - 1) / 2;
dlg->widgets[1].relative_x = first_start_position;
dlg->widgets[0].relative_x = first_start_position + str_ok_len + 1;
}
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static gboolean static gboolean
mcdiffview_dialog_search (WDiff * dview) mcdiffview_dialog_search (WDiff * dview)
{ {
char *exp = NULL; char *exp = NULL;
int qd_result; int qd_result;
size_t num_of_types; size_t num_of_types;
gchar **list_of_types = mc_search_get_types_strings_array (&num_of_types); gchar **list_of_types;
QuickWidget search_widgets[] = { list_of_types = mc_search_get_types_strings_array (&num_of_types);
/* 0 */
QUICK_BUTTON (3, SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT - 3, SEARCH_DLG_HEIGHT, DLG_BTN1_text, {
B_CANCEL, NULL), quick_widget_t quick_widgets[] = {
/* 1 */ /* *INDENT-OFF* */
QUICK_BUTTON (3, SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT - 3, SEARCH_DLG_HEIGHT, DLG_BTN2_text, QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above,
B_ENTER, NULL), INPUT_LAST_TEXT, 0, MC_HISTORY_SHARED_SEARCH, &exp, NULL),
/* 2 */ QUICK_SEPARATOR (TRUE),
QUICK_START_COLUMNS,
QUICK_RADIO (num_of_types, (const char **) list_of_types,
(int *) &mcdiffview_search_options.type, NULL),
QUICK_NEXT_COLUMN,
QUICK_CHECKBOX (N_("Cas&e sensitive"), &mcdiffview_search_options.case_sens, NULL),
QUICK_CHECKBOX (N_("&Backwards"), &mcdiffview_search_options.backwards, NULL),
QUICK_CHECKBOX (N_("&Whole words"), &mcdiffview_search_options.whole_words, NULL),
#ifdef HAVE_CHARSET #ifdef HAVE_CHARSET
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 8, SEARCH_DLG_HEIGHT, N_("&All charsets"), QUICK_CHECKBOX (N_("&All charsets"), &mcdiffview_search_options.all_codepages, NULL),
&mcdiffview_search_options.all_codepages),
#endif #endif
QUICK_STOP_COLUMNS,
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
};
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 7, SEARCH_DLG_HEIGHT, N_("&Whole words"), quick_dialog_t qdlg = {
&mcdiffview_search_options.whole_words), -1, -1, 58,
/* 3 */ N_("Search"), "[Input Line Keys]",
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 6, SEARCH_DLG_HEIGHT, N_("&Backwards"), quick_widgets, NULL, NULL
&mcdiffview_search_options.backwards), };
/* 4 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT, N_("Cas&e sensitive"),
&mcdiffview_search_options.case_sens),
/* 5 */
QUICK_RADIO (3, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT,
num_of_types, (const char **) list_of_types,
(int *) &mcdiffview_search_options.type),
/* 6 */
QUICK_INPUT (3, SEARCH_DLG_WIDTH, 3, SEARCH_DLG_HEIGHT,
INPUT_LAST_TEXT, SEARCH_DLG_WIDTH - 6, 0,
MC_HISTORY_SHARED_SEARCH,
&exp),
/* 7 */
QUICK_LABEL (3, SEARCH_DLG_WIDTH, 2, SEARCH_DLG_HEIGHT, N_("Enter search string:")),
QUICK_END
};
QuickDialog search_input = { qd_result = quick_dialog (&qdlg);
SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT, -1, -1, }
N_("Search"), "[Input Line Keys]",
search_widgets, NULL, NULL, FALSE
};
mcdiffview_dialog_fix_buttons_positions (&search_input);
qd_result = quick_dialog (&search_input);
g_strfreev (list_of_types); g_strfreev (list_of_types);
if ((qd_result == B_CANCEL) || (exp == NULL) || (exp[0] == '\0')) if ((qd_result == B_CANCEL) || (exp == NULL) || (exp[0] == '\0'))
{ {
g_free (exp); g_free (exp);
@ -154,9 +120,10 @@ mcdiffview_dialog_search (WDiff * dview)
#ifdef HAVE_CHARSET #ifdef HAVE_CHARSET
{ {
GString *tmp = str_convert_to_input (exp); GString *tmp;
if (tmp) tmp = str_convert_to_input (exp);
if (tmp != NULL)
{ {
g_free (exp); g_free (exp);
exp = g_string_free (tmp, FALSE); exp = g_string_free (tmp, FALSE);

Просмотреть файл

@ -1,11 +1,11 @@
/* /*
Copyright (C) 2007, 2010, 2011 Copyright (C) 2007, 2010, 2011, 2012
The Free Software Foundation, Inc. The Free Software Foundation, Inc.
Written by: Written by:
Daniel Borca <dborca@yahoo.com>, 2007 Daniel Borca <dborca@yahoo.com>, 2007
Slava Zanko <slavazanko@gmail.com>, 2010 Slava Zanko <slavazanko@gmail.com>, 2010
Andrew Borodin <aborodin@vmail.ru>, 2010 Andrew Borodin <aborodin@vmail.ru>, 2010, 2012
Ilia Maslakov <il.smind@gmail.com>, 2010 Ilia Maslakov <il.smind@gmail.com>, 2010
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -81,9 +81,6 @@ do { \
#define FILE_READ_BUF 4096 #define FILE_READ_BUF 4096
#define FILE_FLAG_TEMP (1 << 0) #define FILE_FLAG_TEMP (1 << 0)
#define OPTX 56
#define OPTY 17
#define ADD_CH '+' #define ADD_CH '+'
#define DEL_CH '-' #define DEL_CH '-'
#define CHG_CH '*' #define CHG_CH '*'
@ -2353,35 +2350,31 @@ dview_diff_options (WDiff * dview)
N_("&Minimal (Find a smaller set of change)") N_("&Minimal (Find a smaller set of change)")
}; };
QuickWidget diffopt_widgets[] = { quick_widget_t quick_widgets[] = {
QUICK_BUTTON (6, 10, 14, OPTY, N_("&Cancel"), B_CANCEL, NULL), /* *INDENT-OFF* */
QUICK_BUTTON (2, 10, 14, OPTY, N_("&OK"), B_ENTER, NULL), QUICK_START_GROUPBOX (N_("Diff algorithm")),
QUICK_RADIO (3, (const char **) quality_str, (int *) &dview->opt.quality, NULL),
QUICK_CHECKBOX (3, OPTX, 12, OPTY, QUICK_STOP_GROUPBOX,
N_("Strip &trailing carriage return"), &dview->opt.strip_trailing_cr), QUICK_START_GROUPBOX (N_("Diff extra options")),
QUICK_CHECKBOX (3, OPTX, 11, OPTY, QUICK_CHECKBOX (N_("&Ignore case"), &dview->opt.ignore_case, NULL),
N_("Ignore all &whitespace"), &dview->opt.ignore_all_space), QUICK_CHECKBOX (N_("Ignore tab &expansion"), &dview->opt.ignore_tab_expansion, NULL),
QUICK_CHECKBOX (3, OPTX, 10, OPTY, QUICK_CHECKBOX (N_("Ignore &space change"), &dview->opt.ignore_space_change, NULL),
N_("Ignore &space change"), &dview->opt.ignore_space_change), QUICK_CHECKBOX (N_("Ignore all &whitespace"), &dview->opt.ignore_all_space, NULL),
QUICK_CHECKBOX (3, OPTX, 9, OPTY, QUICK_CHECKBOX (N_("Strip &trailing carriage return"), &dview->opt.strip_trailing_cr,
N_("Ignore tab &expansion"), &dview->opt.ignore_tab_expansion), NULL),
QUICK_CHECKBOX (3, OPTX, 8, OPTY, QUICK_STOP_GROUPBOX,
N_("&Ignore case"), &dview->opt.ignore_case), QUICK_BUTTONS_OK_CANCEL,
QUICK_LABEL (3, OPTX, 7, OPTY, N_("Diff extra options")),
QUICK_RADIO (3, OPTX, 3, OPTY,
3, (const char **) quality_str, (int *) &dview->opt.quality),
QUICK_LABEL (3, OPTX, 2, OPTY, N_("Diff algorithm")),
QUICK_END QUICK_END
/* *INDENT-ON* */
}; };
QuickDialog diffopt = { quick_dialog_t qdlg = {
OPTX, OPTY, -1, -1, -1, -1, 56,
N_("Diff Options"), "[Diff Options]", N_("Diff Options"), "[Diff Options]",
diffopt_widgets, NULL, NULL, FALSE quick_widgets, NULL, NULL
}; };
if (quick_dialog (&diffopt) != B_CANCEL) if (quick_dialog (&qdlg) != B_CANCEL)
dview_reread (dview); dview_reread (dview);
} }
@ -2445,7 +2438,7 @@ dview_init (WDiff * dview, const char *args, const char *file1, const char *file
ndiff = redo_diff (dview); ndiff = redo_diff (dview);
if (ndiff < 0) if (ndiff < 0)
{ {
/* goto WIDGET_DESTROY stage: dview_fini() */ /* goto MSG_DESTROY stage: dview_fini() */
f_close (f[DIFF_LEFT]); f_close (f[DIFF_LEFT]);
f_close (f[DIFF_RIGHT]); f_close (f[DIFF_RIGHT]);
return -1; return -1;
@ -2867,7 +2860,7 @@ dview_update (WDiff * dview)
static void static void
dview_edit (WDiff * dview, diff_place_t ord) dview_edit (WDiff * dview, diff_place_t ord)
{ {
Dlg_head *h; WDialog *h;
gboolean h_modal; gboolean h_modal;
int linenum, lineofs; int linenum, lineofs;
@ -2877,7 +2870,7 @@ dview_edit (WDiff * dview, diff_place_t ord)
return; return;
} }
h = ((Widget *) dview)->owner; h = WIDGET (dview)->owner;
h_modal = h->modal; h_modal = h->modal;
get_line_numbers (dview->a[ord], dview->skip_rows, &linenum, &lineofs); get_line_numbers (dview->a[ord], dview->skip_rows, &linenum, &lineofs);
@ -2943,19 +2936,21 @@ dview_goto_cmd (WDiff * dview, diff_place_t ord)
static void static void
dview_labels (WDiff * dview) dview_labels (WDiff * dview)
{ {
Dlg_head *h; Widget *d;
WDialog *h;
WButtonBar *b; WButtonBar *b;
h = dview->widget.owner; d = WIDGET (dview);
h = d->owner;
b = find_buttonbar (h); b = find_buttonbar (h);
buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), diff_map, (Widget *) dview); buttonbar_set_label (b, 1, Q_ ("ButtonBar|Help"), diff_map, d);
buttonbar_set_label (b, 2, Q_ ("ButtonBar|Save"), diff_map, (Widget *) dview); buttonbar_set_label (b, 2, Q_ ("ButtonBar|Save"), diff_map, d);
buttonbar_set_label (b, 4, Q_ ("ButtonBar|Edit"), diff_map, (Widget *) dview); buttonbar_set_label (b, 4, Q_ ("ButtonBar|Edit"), diff_map, d);
buttonbar_set_label (b, 5, Q_ ("ButtonBar|Merge"), diff_map, (Widget *) dview); buttonbar_set_label (b, 5, Q_ ("ButtonBar|Merge"), diff_map, d);
buttonbar_set_label (b, 7, Q_ ("ButtonBar|Search"), diff_map, (Widget *) dview); buttonbar_set_label (b, 7, Q_ ("ButtonBar|Search"), diff_map, d);
buttonbar_set_label (b, 9, Q_ ("ButtonBar|Options"), diff_map, (Widget *) dview); buttonbar_set_label (b, 9, Q_ ("ButtonBar|Options"), diff_map, d);
buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), diff_map, (Widget *) dview); buttonbar_set_label (b, 10, Q_ ("ButtonBar|Quit"), diff_map, d);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -3309,26 +3304,26 @@ dview_handle_key (WDiff * dview, int key)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
dview_callback (Widget * w, widget_msg_t msg, int parm) dview_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WDiff *dview = (WDiff *) w; WDiff *dview = (WDiff *) w;
Dlg_head *h = dview->widget.owner; WDialog *h = w->owner;
cb_ret_t i; cb_ret_t i;
switch (msg) switch (msg)
{ {
case WIDGET_INIT: case MSG_INIT:
dview_labels (dview); dview_labels (dview);
dview_load_options (dview); dview_load_options (dview);
dview_update (dview); dview_update (dview);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_DRAW: case MSG_DRAW:
dview->new_frame = 1; dview->new_frame = 1;
dview_update (dview); dview_update (dview);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_KEY: case MSG_KEY:
i = dview_handle_key (dview, parm); i = dview_handle_key (dview, parm);
if (dview->view_quit) if (dview->view_quit)
dlg_stop (h); dlg_stop (h);
@ -3336,7 +3331,7 @@ dview_callback (Widget * w, widget_msg_t msg, int parm)
dview_update (dview); dview_update (dview);
return i; return i;
case WIDGET_COMMAND: case MSG_ACTION:
i = dview_execute_cmd (dview, parm); i = dview_execute_cmd (dview, parm);
if (dview->view_quit) if (dview->view_quit)
dlg_stop (h); dlg_stop (h);
@ -3344,20 +3339,20 @@ dview_callback (Widget * w, widget_msg_t msg, int parm)
dview_update (dview); dview_update (dview);
return i; return i;
case WIDGET_DESTROY: case MSG_DESTROY:
dview_save_options (dview); dview_save_options (dview);
dview_fini (dview); dview_fini (dview);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
dview_adjust_size (Dlg_head * h) dview_adjust_size (WDialog * h)
{ {
WDiff *dview; WDiff *dview;
WButtonBar *bar; WButtonBar *bar;
@ -3365,8 +3360,8 @@ dview_adjust_size (Dlg_head * h)
/* Look up the viewer and the buttonbar, we assume only two widgets here */ /* Look up the viewer and the buttonbar, we assume only two widgets here */
dview = (WDiff *) find_widget_type (h, dview_callback); dview = (WDiff *) find_widget_type (h, dview_callback);
bar = find_buttonbar (h); bar = find_buttonbar (h);
widget_set_size (&dview->widget, 0, 0, LINES - 1, COLS); widget_set_size (WIDGET (dview), 0, 0, LINES - 1, COLS);
widget_set_size ((Widget *) bar, LINES - 1, 0, 1, COLS); widget_set_size (WIDGET (bar), LINES - 1, 0, 1, COLS);
dview_compute_areas (dview); dview_compute_areas (dview);
} }
@ -3374,32 +3369,33 @@ dview_adjust_size (Dlg_head * h)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
dview_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) dview_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WDiff *dview = (WDiff *) data; WDiff *dview = (WDiff *) data;
WDialog *h = DIALOG (w);
switch (msg) switch (msg)
{ {
case DLG_RESIZE: case MSG_RESIZE:
dview_adjust_size (h); dview_adjust_size (h);
return MSG_HANDLED; return MSG_HANDLED;
case DLG_ACTION: case MSG_ACTION:
/* shortcut */ /* shortcut */
if (sender == NULL) if (sender == NULL)
return dview_execute_cmd (NULL, parm); return dview_execute_cmd (NULL, parm);
/* message from buttonbar */ /* message from buttonbar */
if (sender == (Widget *) find_buttonbar (h)) if (sender == WIDGET (find_buttonbar (h)))
{ {
if (data != NULL) if (data != NULL)
return send_message ((Widget *) data, WIDGET_COMMAND, parm); return send_message (data, NULL, MSG_ACTION, parm, NULL);
dview = (WDiff *) find_widget_type (h, dview_callback); dview = (WDiff *) find_widget_type (h, dview_callback);
return dview_execute_cmd (dview, parm); return dview_execute_cmd (dview, parm);
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case DLG_VALIDATE: case MSG_VALIDATE:
dview = (WDiff *) find_widget_type (h, dview_callback); dview = (WDiff *) find_widget_type (h, dview_callback);
h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */ h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */
if (dview_ok_to_exit (dview)) if (dview_ok_to_exit (dview))
@ -3407,14 +3403,14 @@ dview_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, v
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static char * static char *
dview_get_title (const Dlg_head * h, size_t len) dview_get_title (const WDialog * h, size_t len)
{ {
const WDiff *dview; const WDiff *dview;
const char *modified = " (*) "; const char *modified = " (*) ";
@ -3443,7 +3439,8 @@ diff_view (const char *file1, const char *file2, const char *label1, const char
{ {
int error; int error;
WDiff *dview; WDiff *dview;
Dlg_head *dview_dlg; Widget *w;
WDialog *dview_dlg;
/* Create dialog and widgets, put them on the dialog */ /* Create dialog and widgets, put them on the dialog */
dview_dlg = dview_dlg =
@ -3451,11 +3448,9 @@ diff_view (const char *file1, const char *file2, const char *label1, const char
"[Diff Viewer]", NULL, DLG_WANT_TAB); "[Diff Viewer]", NULL, DLG_WANT_TAB);
dview = g_new0 (WDiff, 1); dview = g_new0 (WDiff, 1);
w = WIDGET (dview);
init_widget (&dview->widget, 0, 0, LINES - 1, COLS, init_widget (w, 0, 0, LINES - 1, COLS, dview_callback, dview_event);
(callback_fn) dview_callback, (mouse_h) dview_event); widget_want_cursor (w, FALSE);
widget_want_cursor (dview->widget, 0);
add_widget (dview_dlg, dview); add_widget (dview_dlg, dview);
add_widget (dview_dlg, buttonbar_new (TRUE)); add_widget (dview_dlg, buttonbar_new (TRUE));

Просмотреть файл

@ -172,12 +172,12 @@ extern char *edit_window_close_char;
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
gboolean edit_add_window (Dlg_head * h, int y, int x, int lines, int cols, gboolean edit_add_window (WDialog * h, int y, int x, int lines, int cols,
const vfs_path_t * f, long fline); const vfs_path_t * f, long fline);
WEdit *find_editor (const Dlg_head * h); WEdit *find_editor (const WDialog * h);
gboolean edit_widget_is_editor (const Widget * w); gboolean edit_widget_is_editor (const Widget * w);
gboolean edit_drop_hotkey_menu (Dlg_head * h, int key); gboolean edit_drop_hotkey_menu (WDialog * h, int key);
void edit_menu_cmd (Dlg_head * h); void edit_menu_cmd (WDialog * h);
void user_menu (WEdit * edit, const char *menu_file, int selected_entry); void user_menu (WEdit * edit, const char *menu_file, int selected_entry);
void edit_init_menu (struct WMenuBar *menubar); void edit_init_menu (struct WMenuBar *menubar);
void edit_save_mode_cmd (void); void edit_save_mode_cmd (void);
@ -228,9 +228,9 @@ WEdit *edit_init (WEdit * edit, int y, int x, int lines, int cols,
const vfs_path_t * filename_vpath, long line); const vfs_path_t * filename_vpath, long line);
gboolean edit_clean (WEdit * edit); gboolean edit_clean (WEdit * edit);
gboolean edit_ok_to_exit (WEdit * edit); gboolean edit_ok_to_exit (WEdit * edit);
gboolean edit_load_cmd (Dlg_head * h); gboolean edit_load_cmd (WDialog * h);
gboolean edit_load_syntax_file (Dlg_head * h); gboolean edit_load_syntax_file (WDialog * h);
gboolean edit_load_menu_file (Dlg_head * h); gboolean edit_load_menu_file (WDialog * h);
gboolean edit_close_cmd (WEdit * edit); gboolean edit_close_cmd (WEdit * edit);
void edit_mark_cmd (WEdit * edit, gboolean unmark); void edit_mark_cmd (WEdit * edit, gboolean unmark);
void edit_mark_current_word_cmd (WEdit * edit); void edit_mark_current_word_cmd (WEdit * edit);
@ -265,10 +265,10 @@ gboolean edit_load_back_cmd (WEdit * edit);
gboolean edit_load_forward_cmd (WEdit * edit); gboolean edit_load_forward_cmd (WEdit * edit);
void edit_block_process_cmd (WEdit * edit, int macro_number); void edit_block_process_cmd (WEdit * edit, int macro_number);
void edit_refresh_cmd (void); void edit_refresh_cmd (void);
void edit_syntax_onoff_cmd (Dlg_head * h); void edit_syntax_onoff_cmd (WDialog * h);
void edit_show_tabs_tws_cmd (Dlg_head * h); void edit_show_tabs_tws_cmd (WDialog * h);
void edit_show_margin_cmd (Dlg_head * h); void edit_show_margin_cmd (WDialog * h);
void edit_show_numbers_cmd (Dlg_head * h); void edit_show_numbers_cmd (WDialog * h);
void edit_date_cmd (WEdit * edit); void edit_date_cmd (WEdit * edit);
void edit_goto_cmd (WEdit * edit); void edit_goto_cmd (WEdit * edit);
int eval_marks (WEdit * edit, off_t * start_mark, off_t * end_mark); int eval_marks (WEdit * edit, off_t * start_mark, off_t * end_mark);
@ -321,7 +321,7 @@ gboolean edit_line_is_blank (WEdit * edit, long line);
gboolean is_break_char (char c); gboolean is_break_char (char c);
long edit_indent_width (const WEdit * edit, off_t p); long edit_indent_width (const WEdit * edit, off_t p);
void edit_insert_indent (WEdit * edit, int indent); void edit_insert_indent (WEdit * edit, int indent);
void edit_options_dialog (Dlg_head * h); void edit_options_dialog (WDialog * h);
void edit_syntax_dialog (WEdit * edit); void edit_syntax_dialog (WEdit * edit);
void edit_mail_dialog (WEdit * edit); void edit_mail_dialog (WEdit * edit);
void format_paragraph (WEdit * edit, int force); void format_paragraph (WEdit * edit, int force);

Просмотреть файл

@ -515,7 +515,7 @@ edit_load_position (WEdit * edit)
book_mark_restore (edit, BOOK_MARK_COLOR); book_mark_restore (edit, BOOK_MARK_COLOR);
edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1)); edit_move_to_prev_col (edit, edit_bol (edit, edit->curs1));
edit_move_display (edit, line - (edit->widget.lines / 2)); edit_move_display (edit, line - (WIDGET (edit)->lines / 2));
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -906,7 +906,7 @@ static void
edit_end_page (WEdit * edit) edit_end_page (WEdit * edit)
{ {
edit_update_curs_row (edit); edit_update_curs_row (edit);
edit_move_down (edit, edit->widget.lines - edit->curs_row - 1, 0); edit_move_down (edit, WIDGET (edit)->lines - edit->curs_row - 1, 0);
} }
@ -938,7 +938,7 @@ edit_move_to_bottom (WEdit * edit)
edit_move_down (edit, edit->total_lines - edit->curs_row, 0); edit_move_down (edit, edit->total_lines - edit->curs_row, 0);
edit->start_display = edit->last_byte; edit->start_display = edit->last_byte;
edit->start_line = edit->total_lines; edit->start_line = edit->total_lines;
edit_scroll_upward (edit, edit->widget.lines - 1); edit_scroll_upward (edit, WIDGET (edit)->lines - 1);
edit->force |= REDRAW_PAGE; edit->force |= REDRAW_PAGE;
} }
} }
@ -1624,7 +1624,7 @@ edit_get_bracket (WEdit * edit, gboolean in_screen, unsigned long furthest_brack
break; break;
/* count lines if searching downward */ /* count lines if searching downward */
if (inc > 0 && a == '\n') if (inc > 0 && a == '\n')
if (n++ >= edit->widget.lines - edit->curs_row) /* out of screen */ if (n++ >= WIDGET (edit)->lines - edit->curs_row) /* out of screen */
break; break;
} }
/* count bracket depth */ /* count bracket depth */
@ -1807,7 +1807,7 @@ user_menu (WEdit * edit, const char *menu_file, int selected_entry)
edit_cursor_move (edit, curs - edit->curs1); edit_cursor_move (edit, curs - edit->curs1);
edit->force |= REDRAW_PAGE; edit->force |= REDRAW_PAGE;
send_message ((Widget *) edit, WIDGET_DRAW, 0); send_message (edit, NULL, MSG_DRAW, 0, NULL);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -2187,6 +2187,7 @@ edit_init (WEdit * edit, int y, int x, int lines, int cols, const vfs_path_t * f
long line) long line)
{ {
gboolean to_free = FALSE; gboolean to_free = FALSE;
Widget *w;
option_auto_syntax = 1; /* Resetting to auto on every invokation */ option_auto_syntax = 1; /* Resetting to auto on every invokation */
option_line_state_width = option_line_state ? LINE_STATE_WIDTH : 0; option_line_state_width = option_line_state ? LINE_STATE_WIDTH : 0;
@ -2226,13 +2227,11 @@ edit_init (WEdit * edit, int y, int x, int lines, int cols, const vfs_path_t * f
to_free = TRUE; to_free = TRUE;
} }
edit->drag_state = MCEDIT_DRAG_NORMAL; w = WIDGET (edit);
edit->widget.y = y; init_widget (w, y, x, lines, cols, NULL, NULL);
edit->widget.x = x;
edit->widget.lines = lines;
edit->widget.cols = cols;
edit_save_size (edit); edit_save_size (edit);
edit->fullscreen = TRUE; edit->fullscreen = TRUE;
edit->drag_state = MCEDIT_DRAG_NORMAL;
edit->stat1.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; edit->stat1.st_mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
edit->stat1.st_uid = getuid (); edit->stat1.st_uid = getuid ();
@ -2352,14 +2351,16 @@ edit_clean (WEdit * edit)
gboolean gboolean
edit_reload_line (WEdit * edit, const vfs_path_t * filename_vpath, long line) edit_reload_line (WEdit * edit, const vfs_path_t * filename_vpath, long line)
{ {
Widget *w = WIDGET (edit);
WEdit *e; WEdit *e;
int y = edit->widget.y;
int x = edit->widget.x; int y = w->y;
int lines = edit->widget.lines; int x = w->x;
int columns = edit->widget.cols; int lines = w->lines;
int columns = w->cols;
e = g_malloc0 (sizeof (WEdit)); e = g_malloc0 (sizeof (WEdit));
e->widget = edit->widget; *WIDGET (e) = *w;
if (edit_init (e, y, x, lines, columns, filename_vpath, line) == NULL) if (edit_init (e, y, x, lines, columns, filename_vpath, line) == NULL)
{ {
@ -3154,7 +3155,7 @@ edit_scroll_downward (WEdit * edit, long i)
{ {
long lines_below; long lines_below;
lines_below = edit->total_lines - edit->start_line - (edit->widget.lines - 1); lines_below = edit->total_lines - edit->start_line - (WIDGET (edit)->lines - 1);
if (lines_below > 0) if (lines_below > 0)
{ {
if (i > lines_below) if (i > lines_below)
@ -3471,7 +3472,7 @@ edit_find_bracket (WEdit * edit)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/** /**
* This executes a command as though the user initiated it through a key * This executes a command as though the user initiated it through a key
* press. Callback with WIDGET_KEY as a message calls this after * press. Callback with MSG_KEY as a message calls this after
* translating the key press. This function can be used to pass any * translating the key press. This function can be used to pass any
* command to the editor. Note that the screen wouldn't update * command to the editor. Note that the screen wouldn't update
* automatically. Either of command or char_for_insertion must be * automatically. Either of command or char_for_insertion must be
@ -3531,6 +3532,8 @@ edit_execute_key_command (WEdit * edit, unsigned long command, int char_for_inse
void void
edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion) edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
{ {
Widget *w = WIDGET (edit);
if (command == CK_WindowFullscreen) if (command == CK_WindowFullscreen)
{ {
edit_toggle_fullscreen (edit); edit_toggle_fullscreen (edit);
@ -3817,13 +3820,13 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
edit->column_highlight = 1; edit->column_highlight = 1;
case CK_PageUp: case CK_PageUp:
case CK_MarkPageUp: case CK_MarkPageUp:
edit_move_up (edit, edit->widget.lines - 1, 1); edit_move_up (edit, w->lines - 1, 1);
break; break;
case CK_MarkColumnPageDown: case CK_MarkColumnPageDown:
edit->column_highlight = 1; edit->column_highlight = 1;
case CK_PageDown: case CK_PageDown:
case CK_MarkPageDown: case CK_MarkPageDown:
edit_move_down (edit, edit->widget.lines - 1, 1); edit_move_down (edit, w->lines - 1, 1);
break; break;
case CK_MarkColumnLeft: case CK_MarkColumnLeft:
edit->column_highlight = 1; edit->column_highlight = 1;
@ -4000,8 +4003,8 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
if (p->next != NULL) if (p->next != NULL)
{ {
p = p->next; p = p->next;
if (p->line >= edit->start_line + edit->widget.lines || p->line < edit->start_line) if (p->line >= edit->start_line + w->lines || p->line < edit->start_line)
edit_move_display (edit, p->line - edit->widget.lines / 2); edit_move_display (edit, p->line - w->lines / 2);
edit_move_to_line (edit, p->line); edit_move_to_line (edit, p->line);
} }
} }
@ -4017,8 +4020,8 @@ edit_execute_cmd (WEdit * edit, unsigned long command, int char_for_insertion)
p = p->prev; p = p->prev;
if (p->line >= 0) if (p->line >= 0)
{ {
if (p->line >= edit->start_line + edit->widget.lines || p->line < edit->start_line) if (p->line >= edit->start_line + w->lines || p->line < edit->start_line)
edit_move_display (edit, p->line - edit->widget.lines / 2); edit_move_display (edit, p->line - w->lines / 2);
edit_move_to_line (edit, p->line); edit_move_to_line (edit, p->line);
} }
} }

Просмотреть файл

@ -7,8 +7,8 @@
Written by: Written by:
Paul Sheer, 1996, 1997 Paul Sheer, 1996, 1997
Andrew Borodin <aborodin@vmail.ru> 2012 Andrew Borodin <aborodin@vmail.ru>, 2012
Ilia Maslakov <il.smind@gmail.com> 2012 Ilia Maslakov <il.smind@gmail.com>, 2012
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -105,17 +105,42 @@ int edit_confirm_save = 1;
#define is_digit(x) ((x) >= '0' && (x) <= '9') #define is_digit(x) ((x) >= '0' && (x) <= '9')
#define MAIL_DLG_HEIGHT 12
#define MAX_WORD_COMPLETIONS 100 /* in listbox */ #define MAX_WORD_COMPLETIONS 100 /* in listbox */
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
static unsigned long edit_save_mode_radio_id, edit_save_mode_input_id;
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t
edit_save_mode_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{
switch (msg)
{
case MSG_ACTION:
if (sender != NULL && sender->id == edit_save_mode_radio_id)
{
Widget *ww;
ww = dlg_find_by_id (DIALOG (w), edit_save_mode_input_id);
widget_disable (ww, RADIO (sender)->sel != 2);
return MSG_HANDLED;
}
return MSG_NOT_HANDLED;
default:
return dlg_default_callback (w, sender, msg, parm, data);
}
}
/* --------------------------------------------------------------------------------------------- */
/* If 0 (quick save) then a) create/truncate <filename> file, /* If 0 (quick save) then a) create/truncate <filename> file,
b) save to <filename>; b) save to <filename>;
if 1 (safe save) then a) save to <tempnam>, if 1 (safe save) then a) save to <tempnam>,
@ -420,13 +445,10 @@ edit_check_newline (WEdit * edit)
static vfs_path_t * static vfs_path_t *
edit_get_save_file_as (WEdit * edit) edit_get_save_file_as (WEdit * edit)
{ {
#define DLG_WIDTH 64
#define DLG_HEIGHT 14
static LineBreaks cur_lb = LB_ASIS; static LineBreaks cur_lb = LB_ASIS;
char *filename;
char *filename = vfs_path_to_str (edit->filename_vpath);
char *filename_res; char *filename_res;
vfs_path_t *ret_vpath = NULL;
const char *lb_names[LB_NAMES] = { const char *lb_names[LB_NAMES] = {
N_("&Do not change"), N_("&Do not change"),
@ -435,41 +457,42 @@ edit_get_save_file_as (WEdit * edit)
N_("&Macintosh format (CR)") N_("&Macintosh format (CR)")
}; };
QuickWidget quick_widgets[] = { filename = vfs_path_to_str (edit->filename_vpath);
QUICK_BUTTON (6, 10, DLG_HEIGHT - 3, DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL),
QUICK_BUTTON (2, 10, DLG_HEIGHT - 3, DLG_HEIGHT, N_("&OK"), B_ENTER, NULL),
QUICK_RADIO (5, DLG_WIDTH, DLG_HEIGHT - 8, DLG_HEIGHT, LB_NAMES, lb_names, (int *) &cur_lb),
QUICK_LABEL (3, DLG_WIDTH, DLG_HEIGHT - 9, DLG_HEIGHT, N_("Change line breaks to:")),
QUICK_INPUT (3, DLG_WIDTH, DLG_HEIGHT - 11, DLG_HEIGHT, filename, DLG_WIDTH - 6, 0,
"save-as", &filename_res),
QUICK_LABEL (3, DLG_WIDTH, DLG_HEIGHT - 12, DLG_HEIGHT, N_("Enter file name:")),
QUICK_END
};
QuickDialog Quick_options = {
DLG_WIDTH, DLG_HEIGHT, -1, -1,
N_("Save As"), "[Save File As]",
quick_widgets, NULL, NULL, FALSE
};
if (quick_dialog (&Quick_options) != B_CANCEL)
{ {
char *fname; quick_widget_t quick_widgets[] = {
vfs_path_t *ret_vpath; /* *INDENT-OFF* */
QUICK_LABELED_INPUT (N_("Enter file name:"), input_label_above, filename, 0, "save-as",
&filename_res, NULL),
QUICK_SEPARATOR (TRUE),
QUICK_LABEL (N_("Change line breaks to:"), NULL),
QUICK_RADIO (LB_NAMES, lb_names, (int *) &cur_lb, NULL),
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
};
edit->lb = cur_lb; quick_dialog_t qdlg = {
fname = tilde_expand (filename_res); -1, -1, 64,
g_free (filename_res); N_("Save As"), "[Save File As]",
ret_vpath = vfs_path_from_str (fname); quick_widgets, NULL, NULL
g_free (fname); };
return ret_vpath;
if (quick_dialog (&qdlg) != B_CANCEL)
{
char *fname;
edit->lb = cur_lb;
fname = tilde_expand (filename_res);
g_free (filename_res);
ret_vpath = vfs_path_from_str (fname);
g_free (fname);
}
} }
g_free (filename); g_free (filename);
return NULL; return ret_vpath;
#undef DLG_WIDTH
#undef DLG_HEIGHT
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -512,9 +535,11 @@ edit_save_cmd (WEdit * edit)
*/ */
static inline gboolean static inline gboolean
edit_load_file_from_filename (Dlg_head * h, const vfs_path_t * vpath) edit_load_file_from_filename (WDialog * h, const vfs_path_t * vpath)
{ {
return edit_add_window (h, h->y + 1, h->x, h->lines - 2, h->cols, vpath, 0); Widget *w = WIDGET (h);
return edit_add_window (h, w->y + 1, w->x, w->lines - 2, w->cols, vpath, 0);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -1496,7 +1521,7 @@ edit_refresh_cmd (void)
*/ */
void void
edit_syntax_onoff_cmd (Dlg_head * h) edit_syntax_onoff_cmd (WDialog * h)
{ {
option_syntax_highlighting = !option_syntax_highlighting; option_syntax_highlighting = !option_syntax_highlighting;
g_list_foreach (h->widgets, edit_syntax_onoff_cb, NULL); g_list_foreach (h->widgets, edit_syntax_onoff_cb, NULL);
@ -1511,7 +1536,7 @@ edit_syntax_onoff_cmd (Dlg_head * h)
*/ */
void void
edit_show_tabs_tws_cmd (Dlg_head * h) edit_show_tabs_tws_cmd (WDialog * h)
{ {
enable_show_tabs_tws = !enable_show_tabs_tws; enable_show_tabs_tws = !enable_show_tabs_tws;
g_list_foreach (h->widgets, edit_redraw_page_cb, NULL); g_list_foreach (h->widgets, edit_redraw_page_cb, NULL);
@ -1526,7 +1551,7 @@ edit_show_tabs_tws_cmd (Dlg_head * h)
*/ */
void void
edit_show_margin_cmd (Dlg_head * h) edit_show_margin_cmd (WDialog * h)
{ {
show_right_margin = !show_right_margin; show_right_margin = !show_right_margin;
g_list_foreach (h->widgets, edit_redraw_page_cb, NULL); g_list_foreach (h->widgets, edit_redraw_page_cb, NULL);
@ -1541,7 +1566,7 @@ edit_show_margin_cmd (Dlg_head * h)
*/ */
void void
edit_show_numbers_cmd (Dlg_head * h) edit_show_numbers_cmd (WDialog * h)
{ {
option_line_state = !option_line_state; option_line_state = !option_line_state;
option_line_state_width = option_line_state ? LINE_STATE_WIDTH : 0; option_line_state_width = option_line_state ? LINE_STATE_WIDTH : 0;
@ -1554,10 +1579,6 @@ edit_show_numbers_cmd (Dlg_head * h)
void void
edit_save_mode_cmd (void) edit_save_mode_cmd (void)
{ {
/* diaog sizes */
const int DLG_X = 38;
const int DLG_Y = 13;
char *str_result; char *str_result;
const char *str[] = { const char *str[] = {
@ -1566,64 +1587,41 @@ edit_save_mode_cmd (void)
N_("&Do backups with following extension:") N_("&Do backups with following extension:")
}; };
QuickWidget widgets[] = {
/* 0 */
QUICK_BUTTON (18, DLG_X, DLG_Y - 3, DLG_Y, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */
QUICK_BUTTON (6, DLG_X, DLG_Y - 3, DLG_Y, N_("&OK"), B_ENTER, NULL),
/* 2 */
QUICK_CHECKBOX (4, DLG_X, 8, DLG_Y, N_("Check &POSIX new line"), &option_check_nl_at_eof),
/* 3 */
QUICK_INPUT (8, DLG_X, 6, DLG_Y, option_backup_ext, 9, 0, "edit-backup-ext", &str_result),
/* 4 */
QUICK_RADIO (4, DLG_X, 3, DLG_Y, 3, str, &option_save_mode),
QUICK_END
};
QuickDialog dialog = {
DLG_X, DLG_Y, -1, -1, N_("Edit Save Mode"),
"[Edit Save Mode]", widgets, NULL, NULL, FALSE
};
size_t i;
size_t maxlen = 0;
size_t w0, w1, b_len, w3;
#ifdef HAVE_ASSERT_H #ifdef HAVE_ASSERT_H
assert (option_backup_ext != NULL); assert (option_backup_ext != NULL);
#endif #endif
/* OK/Cancel buttons */
w0 = str_term_width1 (_(widgets[0].u.button.text)) + 3;
w1 = str_term_width1 (_(widgets[1].u.button.text)) + 5; /* default button */
b_len = w0 + w1 + 3;
maxlen = max (b_len, (size_t) str_term_width1 (_(dialog.title)) + 2);
w3 = 0;
for (i = 0; i < 3; i++)
{
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
size_t i;
for (i = 0; i < 3; i++)
str[i] = _(str[i]); str[i] = _(str[i]);
#endif #endif
w3 = max (w3, (size_t) str_term_width1 (str[i]));
}
maxlen = max (maxlen, w3 + 4);
dialog.xlen = min ((size_t) COLS, maxlen + 8);
widgets[3].u.input.len = w3;
widgets[1].relative_x = (dialog.xlen - b_len) / 2;
widgets[0].relative_x = widgets[1].relative_x + w0 + 2;
for (i = 0; i < sizeof (widgets) / sizeof (widgets[0]); i++)
widgets[i].x_divisions = dialog.xlen;
if (quick_dialog (&dialog) != B_CANCEL)
{ {
g_free (option_backup_ext); quick_widget_t quick_widgets[] = {
option_backup_ext = str_result; /* *INDENT-OFF* */
QUICK_RADIO (3, str, &option_save_mode, &edit_save_mode_radio_id),
QUICK_INPUT (option_backup_ext, 0, "edit-backup-ext", &str_result,
&edit_save_mode_input_id),
QUICK_SEPARATOR (TRUE),
QUICK_CHECKBOX (N_("Check &POSIX new line"), &option_check_nl_at_eof, NULL),
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
};
quick_dialog_t qdlg = {
-1, -1, 38,
N_("Edit Save Mode"), "[Edit Save Mode]",
quick_widgets, edit_save_mode_callback, NULL
};
if (quick_dialog (&qdlg) != B_CANCEL)
{
g_free (option_backup_ext);
option_backup_ext = str_result;
}
} }
} }
@ -2059,7 +2057,7 @@ edit_save_confirm_cmd (WEdit * edit)
*/ */
gboolean gboolean
edit_load_cmd (Dlg_head * h) edit_load_cmd (WDialog * h)
{ {
char *exp; char *exp;
gboolean ret = TRUE; /* possible cancel */ gboolean ret = TRUE; /* possible cancel */
@ -2089,7 +2087,7 @@ edit_load_cmd (Dlg_head * h)
*/ */
gboolean gboolean
edit_load_syntax_file (Dlg_head * h) edit_load_syntax_file (WDialog * h)
{ {
vfs_path_t *extdir_vpath; vfs_path_t *extdir_vpath;
int dir = 0; int dir = 0;
@ -2134,7 +2132,7 @@ edit_load_syntax_file (Dlg_head * h)
*/ */
gboolean gboolean
edit_load_menu_file (Dlg_head * h) edit_load_menu_file (WDialog * h)
{ {
vfs_path_t *buffer_vpath; vfs_path_t *buffer_vpath;
vfs_path_t *menufile_vpath; vfs_path_t *menufile_vpath;
@ -2204,14 +2202,14 @@ edit_close_cmd (WEdit * edit)
if (ret) if (ret)
{ {
Dlg_head *h = ((Widget *) edit)->owner; WDialog *h = WIDGET (edit)->owner;
if (edit->locked != 0) if (edit->locked != 0)
unlock_file (edit->filename_vpath); unlock_file (edit->filename_vpath);
del_widget (edit); del_widget (edit);
if (edit_widget_is_editor ((Widget *) h->current->data)) if (edit_widget_is_editor (WIDGET (h->current->data)))
edit = (WEdit *) h->current->data; edit = (WEdit *) h->current->data;
else else
{ {
@ -2665,7 +2663,7 @@ edit_replace_cmd (WEdit * edit, int again)
long l; long l;
int prompt; int prompt;
l = (long) (edit->curs_row - edit->widget.lines / 3); l = edit->curs_row - WIDGET (edit)->lines / 3;
if (l > 0) if (l > 0)
edit_scroll_downward (edit, l); edit_scroll_downward (edit, l);
if (l < 0) if (l < 0)
@ -3070,7 +3068,7 @@ edit_goto_cmd (WEdit * edit)
line = l; line = l;
if (l < 0) if (l < 0)
l = edit->total_lines + l + 2; l = edit->total_lines + l + 2;
edit_move_display (edit, l - edit->widget.lines / 2 - 1); edit_move_display (edit, l - WIDGET (edit)->lines / 2 - 1);
edit_move_to_line (edit, l - 1); edit_move_to_line (edit, l - 1);
edit->force |= REDRAW_COMPLETELY; edit->force |= REDRAW_COMPLETELY;
g_free (f); g_free (f);
@ -3295,30 +3293,31 @@ edit_mail_dialog (WEdit * edit)
static char *mail_subject_last = 0; static char *mail_subject_last = 0;
static char *mail_to_last = 0; static char *mail_to_last = 0;
QuickWidget quick_widgets[] = {
/* 0 */ QUICK_BUTTON (6, 10, 9, MAIL_DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL), quick_widget_t quick_widgets[] = {
/* 1 */ QUICK_BUTTON (2, 10, 9, MAIL_DLG_HEIGHT, N_("&OK"), B_ENTER, NULL), /* *INDENT-OFF* */
/* 2 */ QUICK_INPUT (3, 50, 8, MAIL_DLG_HEIGHT, "", 44, 0, "mail-dlg-input", &tmail_cc), QUICK_LABEL (N_("mail -s <subject> -c <cc> <to>"), NULL),
/* 3 */ QUICK_LABEL (3, 50, 7, MAIL_DLG_HEIGHT, N_("Copies to")), QUICK_LABELED_INPUT (N_("To"), input_label_above,
/* 4 */ QUICK_INPUT (3, 50, 6, MAIL_DLG_HEIGHT, "", 44, 0, "mail-dlg-input-2", mail_to_last != NULL ? mail_to_last : "", 0,
&tmail_subject), "mail-dlg-input-3", &tmail_to, NULL),
/* 5 */ QUICK_LABEL (3, 50, 5, MAIL_DLG_HEIGHT, N_("Subject")), QUICK_LABELED_INPUT (N_("Subject"), input_label_above,
/* 6 */ QUICK_INPUT (3, 50, 4, MAIL_DLG_HEIGHT, "", 44, 0, "mail-dlg-input-3", &tmail_to), mail_subject_last != NULL ? mail_subject_last : "", 0,
/* 7 */ QUICK_LABEL (3, 50, 3, MAIL_DLG_HEIGHT, N_("To")), "mail-dlg-input-2", &tmail_subject, NULL),
/* 8 */ QUICK_LABEL (3, 50, 2, MAIL_DLG_HEIGHT, N_("mail -s <subject> -c <cc> <to>")), QUICK_LABELED_INPUT (N_("Copies to"), input_label_above,
mail_cc_last != NULL ? mail_cc_last : "", 0,
"mail-dlg-input", &tmail_cc, NULL),
QUICK_BUTTONS_OK_CANCEL,
QUICK_END QUICK_END
/* *INDENT-ON* */
}; };
QuickDialog Quick_input = { quick_dialog_t qdlg = {
50, MAIL_DLG_HEIGHT, -1, -1, N_("Mail"), -1, -1, 50,
"[Input Line Keys]", quick_widgets, NULL, NULL, FALSE N_("Mail"), "[Input Line Keys]",
quick_widgets, NULL, NULL
}; };
quick_widgets[2].u.input.text = mail_cc_last ? mail_cc_last : ""; if (quick_dialog (&qdlg) != B_CANCEL)
quick_widgets[4].u.input.text = mail_subject_last ? mail_subject_last : "";
quick_widgets[6].u.input.text = mail_to_last ? mail_to_last : "";
if (quick_dialog (&Quick_input) != B_CANCEL)
{ {
g_free (mail_cc_last); g_free (mail_cc_last);
g_free (mail_subject_last); g_free (mail_subject_last);
@ -3330,12 +3329,12 @@ edit_mail_dialog (WEdit * edit)
} }
} }
/* --------------------------------------------------------------------------------------------- */
/*******************/ /*******************/
/* Word Completion */ /* Word Completion */
/*******************/ /*******************/
/* --------------------------------------------------------------------------------------------- */
/** /**
* Complete current word using regular expression search * Complete current word using regular expression search
* backwards beginning at the current cursor position. * backwards beginning at the current cursor position.
@ -3407,7 +3406,7 @@ edit_select_codepage_cmd (WEdit * edit)
edit_set_codeset (edit); edit_set_codeset (edit);
edit->force = REDRAW_PAGE; edit->force = REDRAW_PAGE;
send_message ((Widget *) edit, WIDGET_DRAW, 0); send_message (edit, NULL, MSG_DRAW, 0, NULL);
} }
#endif #endif

Просмотреть файл

@ -1,11 +1,12 @@
/* /*
Editor dialogs for high level editing commands Editor dialogs for high level editing commands
Copyright (C) 2009, 2011 Copyright (C) 2009, 2011, 2012
The Free Software Foundation, Inc. The Free Software Foundation, Inc.
Written by: Written by:
Slava Zanko <slavazanko@gmail.com>, 2009. Slava Zanko <slavazanko@gmail.com>, 2009.
Andrew Borodin, <aborodin@vmail.ru>, 2012.
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -59,14 +60,6 @@ edit_search_options_t edit_search_options = {
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#define SEARCH_DLG_WIDTH 58
#define SEARCH_DLG_MIN_HEIGHT 13
#define SEARCH_DLG_HEIGHT_SUPPLY 3
#define REPLACE_DLG_WIDTH 58
#define REPLACE_DLG_MIN_HEIGHT 17
#define REPLACE_DLG_HEIGHT_SUPPLY 5
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
@ -75,17 +68,18 @@ edit_search_options_t edit_search_options = {
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
editcmd_dialog_raw_key_query_cb (struct Dlg_head *h, Widget * sender, editcmd_dialog_raw_key_query_cb (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
dlg_msg_t msg, int parm, void *data)
{ {
WDialog *h = DIALOG (w);
switch (msg) switch (msg)
{ {
case DLG_KEY: case MSG_KEY:
h->ret_value = parm; h->ret_value = parm;
dlg_stop (h); dlg_stop (h);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
@ -93,205 +87,51 @@ editcmd_dialog_raw_key_query_cb (struct Dlg_head *h, Widget * sender,
/*** public functions ****************************************************************************/ /*** public functions ****************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void
editcmd_dialog_replace_show (WEdit * edit, const char *search_default, const char *replace_default,
/*@out@ */ char **search_text, /*@out@ */ char **replace_text)
{
if ((search_default == NULL) || (*search_default == '\0'))
search_default = INPUT_LAST_TEXT;
{
size_t num_of_types;
gchar **list_of_types = mc_search_get_types_strings_array (&num_of_types);
int REPLACE_DLG_HEIGHT = REPLACE_DLG_MIN_HEIGHT + num_of_types - REPLACE_DLG_HEIGHT_SUPPLY;
QuickWidget quick_widgets[] = {
/* 0 */ QUICK_BUTTON (6, 10, 13, REPLACE_DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */ QUICK_BUTTON (2, 10, 13, REPLACE_DLG_HEIGHT, N_("&OK"), B_ENTER, NULL),
#ifdef HAVE_CHARSET
/* 2 */ QUICK_CHECKBOX (33, REPLACE_DLG_WIDTH, 11, REPLACE_DLG_HEIGHT,
N_("&All charsets"),
&edit_search_options.all_codepages),
#endif
/* 3 */ QUICK_CHECKBOX (33, REPLACE_DLG_WIDTH, 10, REPLACE_DLG_HEIGHT,
N_("&Whole words"),
&edit_search_options.whole_words),
/* 4 */ QUICK_CHECKBOX (33, REPLACE_DLG_WIDTH, 9, REPLACE_DLG_HEIGHT,
N_("In se&lection"),
&edit_search_options.only_in_selection),
/* 5 */ QUICK_CHECKBOX (33, REPLACE_DLG_WIDTH, 8, REPLACE_DLG_HEIGHT, N_("&Backwards"),
&edit_search_options.backwards),
/* 6 */ QUICK_CHECKBOX (33, REPLACE_DLG_WIDTH, 7, REPLACE_DLG_HEIGHT,
N_("Cas&e sensitive"),
&edit_search_options.case_sens),
/* 7 */ QUICK_RADIO (3, REPLACE_DLG_WIDTH, 7, REPLACE_DLG_HEIGHT,
num_of_types, (const char **) list_of_types,
(int *) &edit_search_options.type),
/* 8 */ QUICK_LABEL (3, REPLACE_DLG_WIDTH, 4, REPLACE_DLG_HEIGHT,
N_("Enter replacement string:")),
/* 9 */ QUICK_INPUT (3, REPLACE_DLG_WIDTH, 5, REPLACE_DLG_HEIGHT,
replace_default, REPLACE_DLG_WIDTH - 6, 0, "replace",
replace_text),
/* 10 */ QUICK_LABEL (3, REPLACE_DLG_WIDTH, 2, REPLACE_DLG_HEIGHT,
N_("Enter search string:")),
/* 11 */ QUICK_INPUT (3, REPLACE_DLG_WIDTH, 3, REPLACE_DLG_HEIGHT,
search_default, REPLACE_DLG_WIDTH - 6, 0,
MC_HISTORY_SHARED_SEARCH, search_text),
QUICK_END
};
QuickDialog Quick_input = {
REPLACE_DLG_WIDTH, REPLACE_DLG_HEIGHT, -1, -1, N_("Replace"),
"[Input Line Keys]", quick_widgets, NULL, NULL, FALSE
};
if (quick_dialog (&Quick_input) != B_CANCEL)
{
edit->replace_mode = 0;
}
else
{
*replace_text = NULL;
*search_text = NULL;
}
g_strfreev (list_of_types);
}
}
/* --------------------------------------------------------------------------------------------- */
gboolean gboolean
editcmd_dialog_search_show (WEdit * edit) editcmd_dialog_search_show (WEdit * edit)
{ {
char *search_text; char *search_text;
size_t num_of_types; size_t num_of_types;
gchar **list_of_types = mc_search_get_types_strings_array (&num_of_types); gchar **list_of_types;
int SEARCH_DLG_HEIGHT = SEARCH_DLG_MIN_HEIGHT + num_of_types - SEARCH_DLG_HEIGHT_SUPPLY;
size_t i;
int dialog_result; int dialog_result;
QuickWidget quick_widgets[] = { list_of_types = mc_search_get_types_strings_array (&num_of_types);
/* 0 */
QUICK_BUTTON (6, 10, 11, SEARCH_DLG_HEIGHT, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */
QUICK_BUTTON (4, 10, 11, SEARCH_DLG_HEIGHT, N_("&Find all"), B_USER, NULL),
/* 2 */
QUICK_BUTTON (2, 10, 11, SEARCH_DLG_HEIGHT, N_("&OK"), B_ENTER, NULL),
#ifdef HAVE_CHARSET
/* 3 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 9, SEARCH_DLG_HEIGHT, N_("&All charsets"),
&edit_search_options.all_codepages),
#endif
/* 4 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 8, SEARCH_DLG_HEIGHT, N_("&Whole words"),
&edit_search_options.whole_words),
/* 5 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 7, SEARCH_DLG_HEIGHT, N_("In se&lection"),
&edit_search_options.only_in_selection),
/* 6 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 6, SEARCH_DLG_HEIGHT, N_("&Backwards"),
&edit_search_options.backwards),
/* 7 */
QUICK_CHECKBOX (33, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT, N_("Cas&e sensitive"),
&edit_search_options.case_sens),
/* 8 */
QUICK_RADIO (3, SEARCH_DLG_WIDTH, 5, SEARCH_DLG_HEIGHT,
num_of_types, (const char **) list_of_types,
(int *) &edit_search_options.type),
/* 9 */
QUICK_INPUT (3, SEARCH_DLG_WIDTH, 3, SEARCH_DLG_HEIGHT,
INPUT_LAST_TEXT, SEARCH_DLG_WIDTH - 6, 0,
MC_HISTORY_SHARED_SEARCH, &search_text),
/* 10 */
QUICK_LABEL (3, SEARCH_DLG_WIDTH, 2, SEARCH_DLG_HEIGHT, N_("Enter search string:")),
QUICK_END
};
#ifdef HAVE_CHARSET
size_t last_checkbox = 7;
#else
size_t last_checkbox = 6;
#endif
QuickDialog Quick_input = {
SEARCH_DLG_WIDTH, SEARCH_DLG_HEIGHT, -1, -1, N_("Search"),
"[Input Line Keys]", quick_widgets, NULL, NULL, TRUE
};
#ifdef ENABLE_NLS
char **list_of_types_nls;
/* header title */
Quick_input.title = _(Quick_input.title);
/* buttons */
for (i = 0; i < 3; i++)
quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
/* checkboxes */
for (i = 3; i <= last_checkbox; i++)
quick_widgets[i].u.checkbox.text = _(quick_widgets[i].u.checkbox.text);
/* label */
quick_widgets[10].u.label.text = _(quick_widgets[10].u.label.text);
/* radiobuttons */
/* create copy of radio items to avoid memory leak */
list_of_types_nls = g_new0 (char *, num_of_types + 1);
for (i = 0; i < num_of_types; i++)
list_of_types_nls[i] = g_strdup (_(list_of_types[i]));
g_strfreev (list_of_types);
list_of_types = list_of_types_nls;
quick_widgets[last_checkbox + 1].u.radio.items = (const char **) list_of_types;
#endif
/* calculate widget coordinates */
{ {
int len = 0; quick_widget_t quick_widgets[] = {
int dlg_width; /* *INDENT-OFF* */
gchar **radio = list_of_types; QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above,
int b0_len, b1_len, b2_len; INPUT_LAST_TEXT, 0, MC_HISTORY_SHARED_SEARCH, &search_text, NULL),
const int button_gap = 2; QUICK_SEPARATOR (TRUE),
QUICK_START_COLUMNS,
QUICK_RADIO (num_of_types, (const char **) list_of_types,
(int *) &edit_search_options.type, NULL),
QUICK_NEXT_COLUMN,
QUICK_CHECKBOX (N_("Cas&e sensitive"), &edit_search_options.case_sens, NULL),
QUICK_CHECKBOX (N_("&Backwards"), &edit_search_options.backwards, NULL),
QUICK_CHECKBOX (N_("In se&lection"), &edit_search_options.only_in_selection, NULL),
QUICK_CHECKBOX (N_("&Whole words"), &edit_search_options.whole_words, NULL),
#ifdef HAVE_CHARSET
QUICK_CHECKBOX (N_("&All charsets"), &edit_search_options.all_codepages, NULL),
#endif
QUICK_STOP_COLUMNS,
QUICK_START_BUTTONS (TRUE, TRUE),
QUICK_BUTTON (N_("&OK"), B_ENTER, NULL, NULL),
QUICK_BUTTON (N_("&Find all"), B_USER, NULL, NULL),
QUICK_BUTTON (N_("&Cancel"), B_CANCEL, NULL, NULL),
QUICK_END
/* *INDENT-ON* */
};
/* length of radiobuttons */ quick_dialog_t qdlg = {
while (*radio != NULL) -1, -1, 58,
{ N_("Search"), "[Input Line Keys]",
len = max (len, str_term_width1 (*radio)); quick_widgets, NULL, NULL
radio++; };
}
/* length of checkboxes */
for (i = 3; i <= last_checkbox; i++)
len = max (len, str_term_width1 (quick_widgets[i].u.checkbox.text) + 4);
/* preliminary dialog width */ dialog_result = quick_dialog (&qdlg);
dlg_width = max (len * 2, str_term_width1 (Quick_input.title)) + 4;
/* length of buttons */
b0_len = str_term_width1 (quick_widgets[0].u.button.text) + 3;
b1_len = str_term_width1 (quick_widgets[1].u.button.text) + 3;
b2_len = str_term_width1 (quick_widgets[2].u.button.text) + 5; /* default button */
len = b0_len + b1_len + b2_len + button_gap * 2;
/* dialog width */
Quick_input.xlen = max (SEARCH_DLG_WIDTH, max (dlg_width, len + 6));
/* correct widget coordinates */
for (i = 0; i < sizeof (quick_widgets) / sizeof (quick_widgets[0]); i++)
quick_widgets[i].x_divisions = Quick_input.xlen;
/* checkbox positions */
for (i = 3; i <= last_checkbox; i++)
quick_widgets[i].relative_x = Quick_input.xlen / 2 + 2;
/* input length */
quick_widgets[last_checkbox + 2].u.input.len = Quick_input.xlen - 6;
/* button positions */
quick_widgets[2].relative_x = Quick_input.xlen / 2 - len / 2;
quick_widgets[1].relative_x = quick_widgets[2].relative_x + b2_len + button_gap;
quick_widgets[0].relative_x = quick_widgets[1].relative_x + b1_len + button_gap;
} }
dialog_result = quick_dialog (&Quick_input);
g_strfreev (list_of_types); g_strfreev (list_of_types);
if ((dialog_result == B_CANCEL) || (search_text == NULL) || (search_text[0] == '\0')) if ((dialog_result == B_CANCEL) || (search_text == NULL) || (search_text[0] == '\0'))
@ -333,6 +173,122 @@ editcmd_dialog_search_show (WEdit * edit)
return (edit->search != NULL); return (edit->search != NULL);
} }
/* --------------------------------------------------------------------------------------------- */
void
editcmd_dialog_replace_show (WEdit * edit, const char *search_default, const char *replace_default,
/*@out@ */ char **search_text, /*@out@ */ char **replace_text)
{
size_t num_of_types;
gchar **list_of_types;
if ((search_default == NULL) || (*search_default == '\0'))
search_default = INPUT_LAST_TEXT;
list_of_types = mc_search_get_types_strings_array (&num_of_types);
{
quick_widget_t quick_widgets[] = {
/* *INDENT-OFF* */
QUICK_LABELED_INPUT (N_("Enter search string:"), input_label_above,
search_default, 0, MC_HISTORY_SHARED_SEARCH, search_text, NULL),
QUICK_LABELED_INPUT (N_("Enter replacement string:"), input_label_above,
replace_default, 0, "replace", replace_text, NULL),
QUICK_SEPARATOR (TRUE),
QUICK_START_COLUMNS,
QUICK_RADIO (num_of_types, (const char **) list_of_types,
(int *) &edit_search_options.type, NULL),
QUICK_NEXT_COLUMN,
QUICK_CHECKBOX (N_("Cas&e sensitive"), &edit_search_options.case_sens, NULL),
QUICK_CHECKBOX (N_("&Backwards"), &edit_search_options.backwards, NULL),
QUICK_CHECKBOX (N_("In se&lection"), &edit_search_options.only_in_selection, NULL),
QUICK_CHECKBOX (N_("&Whole words"), &edit_search_options.whole_words, NULL),
#ifdef HAVE_CHARSET
QUICK_CHECKBOX (N_("&All charsets"), &edit_search_options.all_codepages, NULL),
#endif
QUICK_STOP_COLUMNS,
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
};
quick_dialog_t qdlg = {
-1, -1, 58,
N_("Replace"), "[Input Line Keys]",
quick_widgets, NULL, NULL
};
if (quick_dialog (&qdlg) != B_CANCEL)
edit->replace_mode = 0;
else
{
*replace_text = NULL;
*search_text = NULL;
}
}
g_strfreev (list_of_types);
}
/* --------------------------------------------------------------------------------------------- */
int
editcmd_dialog_replace_prompt_show (WEdit * edit, char *from_text, char *to_text, int xpos,
int ypos)
{
Widget *w = WIDGET (edit);
/* dialog size */
int dlg_height = 10;
char tmp[BUF_MEDIUM];
char *repl_from, *repl_to;
int retval;
if (xpos == -1)
xpos = w->x + option_line_state_width + 1;
if (ypos == -1)
ypos = w->y + w->lines / 2;
/* Sometimes menu can hide replaced text. I don't like it */
if ((edit->curs_row >= ypos - 1) && (edit->curs_row <= ypos + dlg_height - 1))
ypos -= dlg_height;
g_snprintf (tmp, sizeof (tmp), "\"%s\"", from_text);
repl_from = g_strdup (str_trunc (tmp, - 7));
g_snprintf (tmp, sizeof (tmp), "\"%s\"", to_text);
repl_to = g_strdup (str_trunc (tmp, - 7));
{
quick_widget_t quick_widgets[] = {
/* *INDENT-OFF* */
QUICK_LABEL (repl_from, NULL),
QUICK_LABEL (N_("Replace with:"), NULL),
QUICK_LABEL (repl_to, NULL),
QUICK_START_BUTTONS (TRUE, TRUE),
QUICK_BUTTON (N_("&Replace"), B_ENTER, NULL, NULL),
QUICK_BUTTON (N_("A&ll"), B_REPLACE_ALL, NULL, NULL),
QUICK_BUTTON (N_("&Skip"), B_SKIP_REPLACE, NULL, NULL),
QUICK_BUTTON (N_("&Cancel"), B_CANCEL, NULL, NULL),
QUICK_END
/* *INDENT-ON* */
};
quick_dialog_t qdlg = {
ypos, xpos, -1,
N_("Confirm replace"), NULL,
quick_widgets, NULL, NULL
};
retval = quick_dialog (&qdlg);
}
g_free (repl_from);
g_free (repl_to);
return retval;
}
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/* gets a raw key from the keyboard. Passing cancel = 1 draws /* gets a raw key from the keyboard. Passing cancel = 1 draws
a cancel button thus allowing c-c etc. Alternatively, cancel = 0 a cancel button thus allowing c-c etc. Alternatively, cancel = 0
@ -342,19 +298,29 @@ editcmd_dialog_search_show (WEdit * edit)
int int
editcmd_dialog_raw_key_query (const char *heading, const char *query, gboolean cancel) editcmd_dialog_raw_key_query (const char *heading, const char *query, gboolean cancel)
{ {
int w; int w, wq;
struct Dlg_head *raw_dlg; int y = 2;
WDialog *raw_dlg;
w = str_term_width1 (query) + 7; w = str_term_width1 (heading) + 6;
wq = str_term_width1 (query);
w = max (w, wq + 3 * 2 + 1 + 2);
raw_dlg = raw_dlg =
create_dlg (TRUE, 0, 0, 7, w, dialog_colors, editcmd_dialog_raw_key_query_cb, NULL, create_dlg (TRUE, 0, 0, cancel ? 7 : 5, w, dialog_colors, editcmd_dialog_raw_key_query_cb,
NULL, heading, DLG_CENTER | DLG_TRYUP | DLG_WANT_TAB); NULL, NULL, heading, DLG_CENTER | DLG_TRYUP | DLG_WANT_TAB);
add_widget (raw_dlg, input_new (3 - cancel, w - 5, input_get_default_colors (),
2, "", 0, INPUT_COMPLETE_DEFAULT)); add_widget (raw_dlg, label_new (y, 3, query));
add_widget (raw_dlg, label_new (3 - cancel, 2, query)); add_widget (raw_dlg, input_new (y++, 3 + wq + 1, input_get_default_colors (),
w - (6 + wq + 1), "", 0, INPUT_COMPLETE_DEFAULT));
if (cancel) if (cancel)
add_widget (raw_dlg, button_new (4, w / 2 - 5, B_CANCEL, NORMAL_BUTTON, _("Cancel"), 0)); {
add_widget (raw_dlg, hline_new (y++, -1, -1));
/* Button w/o hotkey to allow use any key as raw or macro one */
add_widget_autopos (raw_dlg, button_new (y, 1, B_CANCEL, NORMAL_BUTTON, _("Cancel"), NULL),
WPOS_KEEP_TOP | WPOS_CENTER_HORZ, NULL);
}
w = run_dlg (raw_dlg); w = run_dlg (raw_dlg);
destroy_dlg (raw_dlg); destroy_dlg (raw_dlg);
@ -371,7 +337,7 @@ editcmd_dialog_completion_show (WEdit * edit, int max_len, int word_len,
int start_x, start_y, offset, i; int start_x, start_y, offset, i;
char *curr = NULL; char *curr = NULL;
Dlg_head *compl_dlg; WDialog *compl_dlg;
WListbox *compl_list; WListbox *compl_list;
int compl_dlg_h; /* completion dialog height */ int compl_dlg_h; /* completion dialog height */
int compl_dlg_w; /* completion dialog width */ int compl_dlg_w; /* completion dialog width */
@ -458,7 +424,7 @@ editcmd_dialog_select_definition_show (WEdit * edit, char *match_expr, int max_l
int start_x, start_y, offset, i; int start_x, start_y, offset, i;
char *curr = NULL; char *curr = NULL;
etags_hash_t *curr_def = NULL; etags_hash_t *curr_def = NULL;
Dlg_head *def_dlg; WDialog *def_dlg;
WListbox *def_list; WListbox *def_list;
int def_dlg_h; /* dialog height */ int def_dlg_h; /* dialog height */
int def_dlg_w; /* dialog width */ int def_dlg_w; /* dialog width */
@ -569,89 +535,3 @@ editcmd_dialog_select_definition_show (WEdit * edit, char *match_expr, int max_l
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
int
editcmd_dialog_replace_prompt_show (WEdit * edit, char *from_text, char *to_text, int xpos,
int ypos)
{
/* dialog sizes */
int dlg_height = 9;
int dlg_width = 8;
int retval;
int i;
int btn_pos;
char *repl_from, *repl_to;
char tmp[BUF_MEDIUM];
QuickWidget quick_widgets[] = {
/* 0 */ QUICK_BUTTON (44, dlg_width, 6, dlg_height, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */ QUICK_BUTTON (29, dlg_width, 6, dlg_height, N_("&Skip"), B_SKIP_REPLACE, NULL),
/* 2 */ QUICK_BUTTON (21, dlg_width, 6, dlg_height, N_("A&ll"), B_REPLACE_ALL, NULL),
/* 3 */ QUICK_BUTTON (4, dlg_width, 6, dlg_height, N_("&Replace"), B_ENTER, NULL),
/* 4 */ QUICK_LABEL (3, dlg_width, 2, dlg_height, NULL),
/* 5 */ QUICK_LABEL (3, dlg_width, 3, dlg_height, N_("Replace with:")),
/* 6 */ QUICK_LABEL (3, dlg_width, 4, dlg_height, NULL),
QUICK_END
};
#ifdef ENABLE_NLS
for (i = 0; i < 4; i++)
quick_widgets[i].u.button.text = _(quick_widgets[i].u.button.text);
#endif
/* calculate button positions */
btn_pos = 4;
for (i = 3; i > -1; i--)
{
quick_widgets[i].relative_x = btn_pos;
btn_pos += str_term_width1 (quick_widgets[i].u.button.text) + 5;
if (i == 3) /* default button */
btn_pos += 2;
}
dlg_width = btn_pos + 2;
/* correct widget coordinates */
for (i = 0; i < 7; i++)
quick_widgets[i].x_divisions = dlg_width;
g_snprintf (tmp, sizeof (tmp), "\"%s\"", from_text);
repl_from = g_strdup (str_fit_to_term (tmp, dlg_width - 7, J_LEFT));
g_snprintf (tmp, sizeof (tmp), "\"%s\"", to_text);
repl_to = g_strdup (str_fit_to_term (tmp, dlg_width - 7, J_LEFT));
quick_widgets[4].u.label.text = repl_from;
quick_widgets[6].u.label.text = repl_to;
if (xpos == -1)
xpos = (edit->widget.cols - dlg_width) / 2;
if (ypos == -1)
ypos = edit->widget.lines * 2 / 3;
{
QuickDialog Quick_input = {
dlg_width, dlg_height, 0, 0, N_("Confirm replace"),
"[Input Line Keys]", quick_widgets, NULL, NULL, FALSE
};
/* Sometimes menu can hide replaced text. I don't like it */
if ((edit->curs_row >= ypos - 1) && (edit->curs_row <= ypos + dlg_height - 1))
ypos -= dlg_height;
Quick_input.ypos = ypos;
Quick_input.xpos = xpos;
retval = quick_dialog (&Quick_input);
g_free (repl_from);
g_free (repl_to);
return retval;
}
}
/* --------------------------------------------------------------------------------------------- */

Просмотреть файл

@ -193,7 +193,8 @@ status_string (WEdit * edit, char *s, int w)
static inline void static inline void
edit_status_fullscreen (WEdit * edit, int color) edit_status_fullscreen (WEdit * edit, int color)
{ {
const int w = edit->widget.owner->cols; Widget *h = WIDGET (WIDGET (edit)->owner);
const int w = h->cols;
const size_t status_size = w + 1; const size_t status_size = w + 1;
char *const status = g_malloc (status_size); char *const status = g_malloc (status_size);
int status_len; int status_len;
@ -222,7 +223,7 @@ edit_status_fullscreen (WEdit * edit, int color)
fname = str_trunc (fname, fname_len); fname = str_trunc (fname, fname_len);
} }
dlg_move (edit->widget.owner, 0, 0); widget_move (h, 0, 0);
tty_setcolor (color); tty_setcolor (color);
printwstr (fname, fname_len + gap); printwstr (fname, fname_len + gap);
printwstr (status, w - (fname_len + gap)); printwstr (status, w - (fname_len + gap));
@ -233,7 +234,7 @@ edit_status_fullscreen (WEdit * edit, int color)
if (edit->total_lines + 1 != 0) if (edit->total_lines + 1 != 0)
percent = (edit->curs_line + 1) * 100 / (edit->total_lines + 1); percent = (edit->curs_line + 1) * 100 / (edit->total_lines + 1);
dlg_move (edit->widget.owner, 0, w - 6 - 6); widget_move (h, 0, w - 6 - 6);
tty_printf (" %3d%%", percent); tty_printf (" %3d%%", percent);
} }
@ -250,8 +251,9 @@ edit_status_fullscreen (WEdit * edit, int color)
static inline void static inline void
edit_status_window (WEdit * edit) edit_status_window (WEdit * edit)
{ {
Widget *w = WIDGET (edit);
int y, x; int y, x;
int cols = edit->widget.cols; int cols = w->cols;
tty_setcolor (STATUSBAR_COLOR); tty_setcolor (STATUSBAR_COLOR);
@ -271,12 +273,12 @@ edit_status_window (WEdit * edit)
#endif #endif
edit_move (2, 0); edit_move (2, 0);
tty_printf ("[%s]", str_term_trim (fname, edit->widget.cols - 8 - 6)); tty_printf ("[%s]", str_term_trim (fname, w->cols - 8 - 6));
g_free (full_fname); g_free (full_fname);
} }
tty_getyx (&y, &x); tty_getyx (&y, &x);
x -= edit->widget.x; x -= w->x;
x += 4; x += 4;
if (x + 6 <= cols - 2 - 6) if (x + 6 <= cols - 2 - 6)
{ {
@ -289,7 +291,7 @@ edit_status_window (WEdit * edit)
if (cols > 30) if (cols > 30)
{ {
edit_move (2, edit->widget.lines - 1); edit_move (2, w->lines - 1);
tty_printf ("%3ld %5ld/%ld %6ld/%ld", tty_printf ("%3ld %5ld/%ld %6ld/%ld",
edit->curs_col + edit->over_col, edit->curs_col + edit->over_col,
edit->curs_line + 1, edit->total_lines + 1, edit->curs1, edit->last_byte); edit->curs_line + 1, edit->total_lines + 1, edit->curs1, edit->last_byte);
@ -302,7 +304,7 @@ edit_status_window (WEdit * edit)
*/ */
if (cols > 46) if (cols > 46)
{ {
edit_move (32, edit->widget.lines - 1); edit_move (32, w->lines - 1);
if (edit->curs1 >= edit->last_byte) if (edit->curs1 >= edit->last_byte)
tty_print_string ("[<EOF> ]"); tty_print_string ("[<EOF> ]");
#ifdef HAVE_CHARSET #ifdef HAVE_CHARSET
@ -365,14 +367,14 @@ edit_draw_frame (const WEdit * edit, int color, gboolean active)
static inline void static inline void
edit_draw_window_icons (const WEdit * edit, int color) edit_draw_window_icons (const WEdit * edit, int color)
{ {
const Widget *w = (const Widget *) edit; const Widget *w = WIDGET (edit);
char tmp[17]; char tmp[17];
tty_setcolor (color); tty_setcolor (color);
if (edit->fullscreen) if (edit->fullscreen)
dlg_move (w->owner, 0, w->owner->cols - 6); widget_move (w->owner, 0, WIDGET (w->owner)->cols - 6);
else else
widget_move (w, 0, edit->widget.cols - 8); widget_move (w, 0, w->cols - 8);
g_snprintf (tmp, sizeof (tmp), "[%s][%s]", edit_window_state_char, edit_window_close_char); g_snprintf (tmp, sizeof (tmp), "[%s][%s]", edit_window_state_char, edit_window_close_char);
tty_print_string (tmp); tty_print_string (tmp);
} }
@ -383,6 +385,8 @@ static inline void
print_to_widget (WEdit * edit, long row, int start_col, int start_col_real, print_to_widget (WEdit * edit, long row, int start_col, int start_col_real,
long end_col, struct line_s line[], char *status, int bookmarked) long end_col, struct line_s line[], char *status, int bookmarked)
{ {
Widget *w = WIDGET (edit);
struct line_s *p; struct line_s *p;
int x = start_col_real; int x = start_col_real;
@ -406,25 +410,25 @@ print_to_widget (WEdit * edit, long row, int start_col, int start_col_real,
len = end_col + 1 - start_col; len = end_col + 1 - start_col;
wrap_start = option_word_wrap_line_length + edit->start_col; wrap_start = option_word_wrap_line_length + edit->start_col;
if (len > 0 && edit->widget.y + y >= 0) if (len > 0 && w->y + y >= 0)
{ {
if (!show_right_margin || wrap_start > end_col) if (!show_right_margin || wrap_start > end_col)
tty_draw_hline (edit->widget.y + y, edit->widget.x + x1, ' ', len); tty_draw_hline (w->y + y, w->x + x1, ' ', len);
else if (wrap_start < 0) else if (wrap_start < 0)
{ {
tty_setcolor (EDITOR_RIGHT_MARGIN_COLOR); tty_setcolor (EDITOR_RIGHT_MARGIN_COLOR);
tty_draw_hline (edit->widget.y + y, edit->widget.x + x1, ' ', len); tty_draw_hline (w->y + y, w->x + x1, ' ', len);
} }
else else
{ {
if (wrap_start > 0) if (wrap_start > 0)
tty_draw_hline (edit->widget.y + y, edit->widget.x + x1, ' ', wrap_start); tty_draw_hline (w->y + y, w->x + x1, ' ', wrap_start);
len -= wrap_start; len -= wrap_start;
if (len > 0) if (len > 0)
{ {
tty_setcolor (EDITOR_RIGHT_MARGIN_COLOR); tty_setcolor (EDITOR_RIGHT_MARGIN_COLOR);
tty_draw_hline (edit->widget.y + y, edit->widget.x + x1 + wrap_start, ' ', len); tty_draw_hline (w->y + y, w->x + x1 + wrap_start, ' ', len);
} }
} }
} }
@ -499,6 +503,8 @@ print_to_widget (WEdit * edit, long row, int start_col, int start_col_real,
static void static void
edit_draw_this_line (WEdit * edit, off_t b, long row, long start_col, long end_col) edit_draw_this_line (WEdit * edit, off_t b, long row, long start_col, long end_col)
{ {
Widget *w = WIDGET (edit);
struct line_s line[MAX_LINE_LEN]; struct line_s line[MAX_LINE_LEN];
struct line_s *p = line; struct line_s *p = line;
@ -513,7 +519,7 @@ edit_draw_this_line (WEdit * edit, off_t b, long row, long start_col, long end_c
int book_mark = 0; int book_mark = 0;
char line_stat[LINE_STATE_WIDTH + 1] = "\0"; char line_stat[LINE_STATE_WIDTH + 1] = "\0";
if (row > edit->widget.lines - 1 - EDIT_TEXT_VERTICAL_OFFSET - 2 * (edit->fullscreen ? 0 : 1)) if (row > w->lines - 1 - EDIT_TEXT_VERTICAL_OFFSET - 2 * (edit->fullscreen ? 0 : 1))
return; return;
if (book_mark_query_color (edit, edit->start_line + row, BOOK_MARK_COLOR)) if (book_mark_query_color (edit, edit->start_line + row, BOOK_MARK_COLOR))
@ -529,10 +535,8 @@ edit_draw_this_line (WEdit * edit, off_t b, long row, long start_col, long end_c
end_col -= EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width; end_col -= EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width;
if (!edit->fullscreen) if (!edit->fullscreen)
{ {
const Widget *w = (const Widget *) edit;
end_col--; end_col--;
if (w->x + w->cols <= w->owner->cols) if (w->x + w->cols <= WIDGET (w->owner)->cols)
end_col--; end_col--;
} }
@ -841,8 +845,8 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
static long prev_curs_row = 0; static long prev_curs_row = 0;
static off_t prev_curs = 0; static off_t prev_curs = 0;
Widget *w = (Widget *) edit; Widget *w = WIDGET (edit);
Dlg_head *h = w->owner; Widget *wh = WIDGET (w->owner);
long row = 0, curs_row; long row = 0, curs_row;
int force = edit->force; int force = edit->force;
@ -854,24 +858,24 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
/* draw only visible region */ /* draw only visible region */
last_line = h->y + h->lines - 1; last_line = wh->y + wh->lines - 1;
y1 = w->y; y1 = w->y;
if (y1 > last_line - 1 /* buttonbar */ ) if (y1 > last_line - 1 /* buttonbar */ )
return; return;
last_column = h->x + h->cols - 1; last_column = wh->x + wh->cols - 1;
x1 = w->x; x1 = w->x;
if (x1 > last_column) if (x1 > last_column)
return; return;
y2 = w->y + w->lines - 1; y2 = w->y + w->lines - 1;
if (y2 < h->y + 1 /* menubar */ ) if (y2 < wh->y + 1 /* menubar */ )
return; return;
x2 = w->x + w->cols - 1; x2 = w->x + w->cols - 1;
if (x2 < h->x) if (x2 < wh->x)
return; return;
if ((force & REDRAW_IN_BOUNDS) == 0) if ((force & REDRAW_IN_BOUNDS) == 0)
@ -881,17 +885,17 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
if (y2 <= last_line - 1 /* buttonbar */ ) if (y2 <= last_line - 1 /* buttonbar */ )
end_row = w->lines - 1; end_row = w->lines - 1;
else if (y1 >= h->y + 1 /* menubar */ ) else if (y1 >= wh->y + 1 /* menubar */ )
end_row = h->lines - 1 - y1 - 1; end_row = wh->lines - 1 - y1 - 1;
else else
end_row = start_row + h->lines - 1 - 1; end_row = start_row + wh->lines - 1 - 1;
if (x2 <= last_column) if (x2 <= last_column)
end_column = w->cols - 1; end_column = w->cols - 1;
else if (x1 >= h->x) else if (x1 >= wh->x)
end_column = h->cols - 1 - x1; end_column = wh->cols - 1 - x1;
else else
end_column = start_column + h->cols - 1; end_column = start_column + wh->cols - 1;
} }
/* /*
@ -967,7 +971,7 @@ render_edit_text (WEdit * edit, long start_row, long start_column, long end_row,
} }
} }
if ((force & REDRAW_LINE_BELOW) != 0 && row < edit->widget.lines - 1) if ((force & REDRAW_LINE_BELOW) != 0 && row < w->lines - 1)
{ {
row = curs_row + 1; row = curs_row + 1;
b = edit_bol (edit, edit->curs1); b = edit_bol (edit, edit->curs1);
@ -1049,22 +1053,24 @@ edit_status (WEdit * edit, gboolean active)
void void
edit_scroll_screen_over_cursor (WEdit * edit) edit_scroll_screen_over_cursor (WEdit * edit)
{ {
Widget *w = WIDGET (edit);
long p; long p;
long outby; long outby;
int b_extreme, t_extreme, l_extreme, r_extreme; int b_extreme, t_extreme, l_extreme, r_extreme;
if (edit->widget.lines <= 0 || edit->widget.cols <= 0) if (w->lines <= 0 || w->cols <= 0)
return; return;
edit->widget.lines -= EDIT_TEXT_VERTICAL_OFFSET; w->lines -= EDIT_TEXT_VERTICAL_OFFSET;
edit->widget.cols -= EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width; w->cols -= EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width;
if (!edit->fullscreen) if (!edit->fullscreen)
{ {
edit->widget.x++; w->x++;
edit->widget.cols -= 2; w->cols -= 2;
edit->widget.y++; w->y++;
edit->widget.lines -= 2; w->lines -= 2;
} }
r_extreme = EDIT_RIGHT_EXTREME; r_extreme = EDIT_RIGHT_EXTREME;
@ -1073,39 +1079,39 @@ edit_scroll_screen_over_cursor (WEdit * edit)
t_extreme = EDIT_TOP_EXTREME; t_extreme = EDIT_TOP_EXTREME;
if (edit->found_len != 0) if (edit->found_len != 0)
{ {
b_extreme = max (edit->widget.lines / 4, b_extreme); b_extreme = max (w->lines / 4, b_extreme);
t_extreme = max (edit->widget.lines / 4, t_extreme); t_extreme = max (w->lines / 4, t_extreme);
} }
if (b_extreme + t_extreme + 1 > edit->widget.lines) if (b_extreme + t_extreme + 1 > w->lines)
{ {
int n; int n;
n = b_extreme + t_extreme; n = b_extreme + t_extreme;
if (n == 0) if (n == 0)
n = 1; n = 1;
b_extreme = (b_extreme * (edit->widget.lines - 1)) / n; b_extreme = (b_extreme * (w->lines - 1)) / n;
t_extreme = (t_extreme * (edit->widget.lines - 1)) / n; t_extreme = (t_extreme * (w->lines - 1)) / n;
} }
if (l_extreme + r_extreme + 1 > edit->widget.cols) if (l_extreme + r_extreme + 1 > w->cols)
{ {
int n; int n;
n = l_extreme + t_extreme; n = l_extreme + t_extreme;
if (n == 0) if (n == 0)
n = 1; n = 1;
l_extreme = (l_extreme * (edit->widget.cols - 1)) / n; l_extreme = (l_extreme * (w->cols - 1)) / n;
r_extreme = (r_extreme * (edit->widget.cols - 1)) / n; r_extreme = (r_extreme * (w->cols - 1)) / n;
} }
p = edit_get_col (edit) + edit->over_col; p = edit_get_col (edit) + edit->over_col;
edit_update_curs_row (edit); edit_update_curs_row (edit);
outby = p + edit->start_col - edit->widget.cols + 1 + (r_extreme + edit->found_len); outby = p + edit->start_col - w->cols + 1 + (r_extreme + edit->found_len);
if (outby > 0) if (outby > 0)
edit_scroll_right (edit, outby); edit_scroll_right (edit, outby);
outby = l_extreme - p - edit->start_col; outby = l_extreme - p - edit->start_col;
if (outby > 0) if (outby > 0)
edit_scroll_left (edit, outby); edit_scroll_left (edit, outby);
p = edit->curs_row; p = edit->curs_row;
outby = p - edit->widget.lines + 1 + b_extreme; outby = p - w->lines + 1 + b_extreme;
if (outby > 0) if (outby > 0)
edit_scroll_downward (edit, outby); edit_scroll_downward (edit, outby);
outby = t_extreme - p; outby = t_extreme - p;
@ -1113,14 +1119,14 @@ edit_scroll_screen_over_cursor (WEdit * edit)
edit_scroll_upward (edit, outby); edit_scroll_upward (edit, outby);
edit_update_curs_row (edit); edit_update_curs_row (edit);
edit->widget.lines += EDIT_TEXT_VERTICAL_OFFSET; w->lines += EDIT_TEXT_VERTICAL_OFFSET;
edit->widget.cols += EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width; w->cols += EDIT_TEXT_HORIZONTAL_OFFSET + option_line_state_width;
if (!edit->fullscreen) if (!edit->fullscreen)
{ {
edit->widget.x--; w->x--;
edit->widget.cols += 2; w->cols += 2;
edit->widget.y--; w->y--;
edit->widget.lines += 2; w->lines += 2;
} }
} }

Просмотреть файл

@ -259,7 +259,7 @@ create_options_menu (void)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
edit_drop_menu_cmd (Dlg_head * h, int which) edit_drop_menu_cmd (WDialog * h, int which)
{ {
WMenuBar *menubar; WMenuBar *menubar;
@ -306,7 +306,7 @@ edit_init_menu (struct WMenuBar *menubar)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
edit_menu_cmd (Dlg_head * h) edit_menu_cmd (WDialog * h)
{ {
edit_drop_menu_cmd (h, -1); edit_drop_menu_cmd (h, -1);
} }
@ -314,7 +314,7 @@ edit_menu_cmd (Dlg_head * h)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
gboolean gboolean
edit_drop_hotkey_menu (Dlg_head * h, int key) edit_drop_hotkey_menu (WDialog * h, int key)
{ {
int m = 0; int m = 0;
switch (key) switch (key)

Просмотреть файл

@ -7,7 +7,7 @@
Written by: Written by:
Paul Sheer, 1996, 1997 Paul Sheer, 1996, 1997
Andrew Borodin <aborodin@vmail.ru> 2012 Andrew Borodin <aborodin@vmail.ru>, 2012
This file is part of the Midnight Commander. This file is part of the Midnight Commander.
@ -46,17 +46,14 @@
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#define OPT_DLG_H 17
#define OPT_DLG_W 74
/*** file scope type declarations ****************************************************************/ /*** file scope type declarations ****************************************************************/
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
static const char *wrap_str[] = { static const char *wrap_str[] = {
N_("None"), N_("&None"),
N_("Dynamic paragraphing"), N_("&Dynamic paragraphing"),
N_("Type writer wrap"), N_("Type &writer wrap"),
NULL NULL
}; };
@ -106,7 +103,7 @@ edit_reload_syntax (void *data, void *user_data)
{ {
(void) user_data; (void) user_data;
if (edit_widget_is_editor ((Widget *) data)) if (edit_widget_is_editor (WIDGET (data)))
{ {
WEdit *edit = (WEdit *) data; WEdit *edit = (WEdit *) data;
edit_load_syntax (edit, NULL, edit->syntax_type); edit_load_syntax (edit, NULL, edit->syntax_type);
@ -118,56 +115,13 @@ edit_reload_syntax (void *data, void *user_data)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
void void
edit_options_dialog (Dlg_head * h) edit_options_dialog (WDialog * h)
{ {
char wrap_length[16], tab_spacing[16], *p, *q; char wrap_length[16], tab_spacing[16];
char *p, *q;
int wrap_mode = 0; int wrap_mode = 0;
int old_syntax_hl; int old_syntax_hl;
QuickWidget quick_widgets[] = {
/* 0 */ QUICK_BUTTON (6, 10, OPT_DLG_H - 3, OPT_DLG_H, N_("&Cancel"), B_CANCEL, NULL),
/* 1 */ QUICK_BUTTON (2, 10, OPT_DLG_H - 3, OPT_DLG_H, N_("&OK"), B_ENTER, NULL),
/* 2 */ QUICK_LABEL (OPT_DLG_W / 2 + 1, OPT_DLG_W, 12, OPT_DLG_H,
N_("Word wrap line length:")),
/* 3 */ QUICK_INPUT (OPT_DLG_W / 2 + 25, OPT_DLG_W, 12, OPT_DLG_H,
wrap_length, OPT_DLG_W / 2 - 4 - 24, 0, "edit-word-wrap", &p),
/* 4 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 11, OPT_DLG_H,
N_("&Group undo"), &option_group_undo),
/* 5 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 10, OPT_DLG_H,
N_("Cursor beyond end of line"), &option_cursor_beyond_eol),
/* 6 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 9, OPT_DLG_H,
N_("Pers&istent selection"), &option_persistent_selections),
/* 7 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 8, OPT_DLG_H,
N_("Synta&x highlighting"), &option_syntax_highlighting),
/* 8 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 7, OPT_DLG_H,
N_("Visible tabs"), &visible_tabs),
/* 9 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 6, OPT_DLG_H,
N_("Visible trailing spaces"), &visible_tws),
/* 10 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 5, OPT_DLG_H,
N_("Save file &position"), &option_save_position),
/* 11 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 4, OPT_DLG_H,
N_("Confir&m before saving"), &edit_confirm_save),
/* 12 */ QUICK_CHECKBOX (OPT_DLG_W / 2 + 1, OPT_DLG_W, 3, OPT_DLG_H,
N_("&Return does autoindent"), &option_return_does_auto_indent),
/* 13 */ QUICK_LABEL (3, OPT_DLG_W, 11, OPT_DLG_H, N_("Tab spacing:")),
/* 14 */ QUICK_INPUT (3 + 24, OPT_DLG_W, 11, OPT_DLG_H,
tab_spacing, OPT_DLG_W / 2 - 4 - 24, 0, "edit-tab-spacing", &q),
/* 15 */ QUICK_CHECKBOX (3, OPT_DLG_W, 10, OPT_DLG_H,
N_("Fill tabs with &spaces"), &option_fill_tabs_with_spaces),
/* 16 */ QUICK_CHECKBOX (3, OPT_DLG_W, 9, OPT_DLG_H,
N_("&Backspace through tabs"), &option_backspace_through_tabs),
/* 17 */ QUICK_CHECKBOX (3, OPT_DLG_W, 8, OPT_DLG_H,
N_("&Fake half tabs"), &option_fake_half_tabs),
/* 18 */ QUICK_RADIO (4, OPT_DLG_W, 4, OPT_DLG_H, 3, wrap_str, &wrap_mode),
/* 19 */ QUICK_LABEL (3, OPT_DLG_W, 3, OPT_DLG_H, N_("Wrap mode")),
QUICK_END
};
QuickDialog Quick_options = {
OPT_DLG_W, OPT_DLG_H, -1, -1, N_("Editor options"),
"[Editor options]", quick_widgets, NULL, NULL, FALSE
};
#ifdef ENABLE_NLS #ifdef ENABLE_NLS
static gboolean i18n_flag = FALSE; static gboolean i18n_flag = FALSE;
@ -188,8 +142,55 @@ edit_options_dialog (Dlg_head * h)
else else
wrap_mode = 0; wrap_mode = 0;
if (quick_dialog (&Quick_options) == B_CANCEL) {
return; /* *INDENT-OFF* */
quick_widget_t quick_widgets[] = {
QUICK_START_COLUMNS,
QUICK_START_GROUPBOX (N_("Wrap mode")),
QUICK_RADIO (3, wrap_str, &wrap_mode, NULL),
QUICK_STOP_GROUPBOX,
QUICK_SEPARATOR (FALSE),
QUICK_START_GROUPBOX (N_("Tabulation")),
QUICK_CHECKBOX (N_("&Fake half tabs"), &option_fake_half_tabs, NULL),
QUICK_CHECKBOX (N_("&Backspace through tabs"), &option_backspace_through_tabs,
NULL),
QUICK_CHECKBOX (N_("Fill tabs with &spaces"), &option_fill_tabs_with_spaces,
NULL),
QUICK_LABELED_INPUT (N_("Tab spacing:"), input_label_left, tab_spacing, 0,
"edit-tab-spacing", &q, NULL),
QUICK_STOP_GROUPBOX,
QUICK_NEXT_COLUMN,
QUICK_START_GROUPBOX (N_("Other options")),
QUICK_CHECKBOX (N_("&Return does autoindent"), &option_return_does_auto_indent,
NULL),
QUICK_CHECKBOX (N_("Confir&m before saving"), &edit_confirm_save, NULL),
QUICK_CHECKBOX (N_("Save file &position"), &option_save_position, NULL),
QUICK_CHECKBOX (N_("&Visible trailing spaces"), &visible_tws, NULL),
QUICK_CHECKBOX (N_("Visible &tabs"), &visible_tabs, NULL),
QUICK_CHECKBOX (N_("Synta&x highlighting"), &option_syntax_highlighting, NULL),
QUICK_CHECKBOX (N_("Pers&istent selection"), &option_persistent_selections,
NULL),
QUICK_CHECKBOX (N_("Cursor be&yond end of line"), &option_cursor_beyond_eol,
NULL),
QUICK_CHECKBOX (N_("&Group undo"), &option_group_undo, NULL),
QUICK_LABELED_INPUT (N_("Word wrap line length:"), input_label_left,
wrap_length, 0, "edit-word-wrap", &p, NULL),
QUICK_STOP_GROUPBOX,
QUICK_STOP_COLUMNS,
QUICK_BUTTONS_OK_CANCEL,
QUICK_END
/* *INDENT-ON* */
};
quick_dialog_t qdlg = {
-1, -1, 74,
N_("Editor options"), "[Editor options]",
quick_widgets, NULL, NULL
};
if (quick_dialog (&qdlg) == B_CANCEL)
return;
}
old_syntax_hl = option_syntax_highlighting; old_syntax_hl = option_syntax_highlighting;

Просмотреть файл

@ -84,8 +84,7 @@ static unsigned int edit_dlg_init_refcounter = 0;
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
static cb_ret_t edit_callback (Widget * w, widget_msg_t msg, int parm); static cb_ret_t edit_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
static cb_ret_t edit_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
void *data); void *data);
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -139,49 +138,31 @@ edit_dlg_deinit (void)
static void static void
edit_about (void) edit_about (void)
{ {
const char *header = N_("About"); quick_widget_t quick_widgets[] = {
const char *button_name = N_("&OK"); /* *INDENT-OFF* */
const char *const version = "MCEdit " VERSION; QUICK_LABEL ("MCEdit " VERSION, NULL),
char text[BUF_LARGE]; QUICK_SEPARATOR (TRUE),
QUICK_LABEL (N_("A user friendly text editor\n"
"written for the Midnight Commander."), NULL),
QUICK_SEPARATOR (FALSE),
QUICK_LABEL (N_("Copyright (C) 1996-2012 the Free Software Foundation"), NULL),
QUICK_START_BUTTONS (TRUE, TRUE),
QUICK_BUTTON (N_("&OK"), B_ENTER, NULL, NULL),
QUICK_END
/* *INDENT-ON* */
};
int win_len, version_len, button_len; quick_dialog_t qdlg = {
int cols, lines; -1, -1, 40,
N_("About"), "[Internal File Editor]",
quick_widgets, NULL, NULL
};
Dlg_head *about_dlg; quick_widgets[0].pos_flags = WPOS_KEEP_TOP | WPOS_CENTER_HORZ;
quick_widgets[2].pos_flags = WPOS_KEEP_TOP | WPOS_CENTER_HORZ;
quick_widgets[4].pos_flags = WPOS_KEEP_TOP | WPOS_CENTER_HORZ;
#ifdef ENABLE_NLS (void) quick_dialog (&qdlg);
header = _(header);
button_name = _(button_name);
#endif
button_len = str_term_width1 (button_name) + 5;
version_len = str_term_width1 (version);
g_snprintf (text, sizeof (text),
_("Copyright (C) 1996-2012 the Free Software Foundation\n\n"
" A user friendly text editor\n"
" written for the Midnight Commander"));
win_len = str_term_width1 (header);
win_len = max (win_len, version_len);
win_len = max (win_len, button_len);
/* count width and height of text */
str_msg_term_size (text, &lines, &cols);
lines += 9;
cols = max (win_len, cols) + 6;
/* dialog */
about_dlg = create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL,
"[Internal File Editor]", header, DLG_CENTER | DLG_TRYUP);
add_widget (about_dlg, label_new (3, (cols - version_len) / 2, version));
add_widget (about_dlg, label_new (5, 3, text));
add_widget (about_dlg, button_new (lines - 3, (cols - button_len) / 2,
B_ENTER, NORMAL_BUTTON, button_name, NULL));
run_dlg (about_dlg);
destroy_dlg (about_dlg);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -208,16 +189,16 @@ edit_help (void)
static void static void
edit_dialog_resize_cb (void *data, void *user_data) edit_dialog_resize_cb (void *data, void *user_data)
{ {
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
(void) user_data; (void) user_data;
if (edit_widget_is_editor (w) && ((WEdit *) w)->fullscreen) if (edit_widget_is_editor (w) && ((WEdit *) w)->fullscreen)
{ {
Dlg_head *h = w->owner; Widget *wh = WIDGET (w->owner);
w->lines = h->lines - 2; w->lines = wh->lines - 2;
w->cols = h->cols; w->cols = wh->cols;
} }
} }
@ -232,9 +213,8 @@ static void
edit_restore_size (WEdit * edit) edit_restore_size (WEdit * edit)
{ {
edit->drag_state = MCEDIT_DRAG_NORMAL; edit->drag_state = MCEDIT_DRAG_NORMAL;
widget_set_size ((Widget *) edit, edit->y_prev, edit->x_prev, widget_set_size (WIDGET (edit), edit->y_prev, edit->x_prev, edit->lines_prev, edit->cols_prev);
edit->lines_prev, edit->cols_prev); dlg_redraw (WIDGET (edit)->owner);
dlg_redraw (((Widget *) edit)->owner);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -248,25 +228,25 @@ edit_restore_size (WEdit * edit)
static void static void
edit_window_move (WEdit * edit, unsigned long command) edit_window_move (WEdit * edit, unsigned long command)
{ {
Widget *w = (Widget *) edit; Widget *w = WIDGET (edit);
Dlg_head *h = w->owner; Widget *wh = WIDGET (w->owner);
switch (command) switch (command)
{ {
case CK_Up: case CK_Up:
if (w->y > h->y + 1) /* menubar */ if (w->y > wh->y + 1) /* menubar */
w->y--; w->y--;
break; break;
case CK_Down: case CK_Down:
if (w->y < h->y + h->lines - 2) /* buttonbar */ if (w->y < wh->y + wh->lines - 2) /* buttonbar */
w->y++; w->y++;
break; break;
case CK_Left: case CK_Left:
if (w->x + w->cols > h->x) if (w->x + w->cols > wh->x)
w->x--; w->x--;
break; break;
case CK_Right: case CK_Right:
if (w->x < h->x + h->cols) if (w->x < wh->x + wh->cols)
w->x++; w->x++;
break; break;
default: default:
@ -274,7 +254,7 @@ edit_window_move (WEdit * edit, unsigned long command)
} }
edit->force |= REDRAW_PAGE; edit->force |= REDRAW_PAGE;
dlg_redraw (h); dlg_redraw (w->owner);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -288,8 +268,8 @@ edit_window_move (WEdit * edit, unsigned long command)
static void static void
edit_window_resize (WEdit * edit, unsigned long command) edit_window_resize (WEdit * edit, unsigned long command)
{ {
Widget *w = (Widget *) edit; Widget *w = WIDGET (edit);
Dlg_head *h = w->owner; Widget *wh = WIDGET (w->owner);
switch (command) switch (command)
{ {
@ -298,7 +278,7 @@ edit_window_resize (WEdit * edit, unsigned long command)
w->lines--; w->lines--;
break; break;
case CK_Down: case CK_Down:
if (w->y + w->lines < h->y + h->lines - 1) /* buttonbar */ if (w->y + w->lines < wh->y + wh->lines - 1) /* buttonbar */
w->lines++; w->lines++;
break; break;
case CK_Left: case CK_Left:
@ -306,7 +286,7 @@ edit_window_resize (WEdit * edit, unsigned long command)
w->cols--; w->cols--;
break; break;
case CK_Right: case CK_Right:
if (w->x + w->cols < h->x + h->cols) if (w->x + w->cols < wh->x + wh->cols)
w->cols++; w->cols++;
break; break;
default: default:
@ -314,7 +294,7 @@ edit_window_resize (WEdit * edit, unsigned long command)
} }
edit->force |= REDRAW_COMPLETELY; edit->force |= REDRAW_COMPLETELY;
dlg_redraw (h); dlg_redraw (w->owner);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -334,7 +314,7 @@ get_hotkey (int n)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
edit_window_list (const Dlg_head * h) edit_window_list (const WDialog * h)
{ {
const size_t offset = 2; /* skip menu and buttonbar */ const size_t offset = 2; /* skip menu and buttonbar */
const size_t dlg_num = g_list_length (h->widgets) - offset; const size_t dlg_num = g_list_length (h->widgets) - offset;
@ -350,7 +330,7 @@ edit_window_list (const Dlg_head * h)
listbox = create_listbox_window (lines, cols, _("Open files"), "[Open files]"); listbox = create_listbox_window (lines, cols, _("Open files"), "[Open files]");
for (w = h->widgets; w != NULL; w = g_list_next (w)) for (w = h->widgets; w != NULL; w = g_list_next (w))
if (edit_widget_is_editor ((Widget *) w->data)) if (edit_widget_is_editor (WIDGET (w->data)))
{ {
WEdit *e = (WEdit *) w->data; WEdit *e = (WEdit *) w->data;
char *fname; char *fname;
@ -367,7 +347,7 @@ edit_window_list (const Dlg_head * h)
} }
listbox_add_item (listbox->list, LISTBOX_APPEND_AT_END, get_hotkey (i++), listbox_add_item (listbox->list, LISTBOX_APPEND_AT_END, get_hotkey (i++),
str_term_trim (fname, listbox->list->widget.cols - 2), NULL); str_term_trim (fname, WIDGET (listbox->list)->cols - 2), NULL);
g_free (fname); g_free (fname);
} }
@ -405,7 +385,7 @@ edit_get_shortcut (unsigned long command)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static char * static char *
edit_get_title (const Dlg_head * h, size_t len) edit_get_title (const WDialog * h, size_t len)
{ {
const WEdit *edit = find_editor (h); const WEdit *edit = find_editor (h);
const char *modified = edit->modified ? "(*) " : " "; const char *modified = edit->modified ? "(*) " : " ";
@ -436,7 +416,7 @@ static int
edit_event (Gpm_Event * event, void *data) edit_event (Gpm_Event * event, void *data)
{ {
WEdit *edit = (WEdit *) data; WEdit *edit = (WEdit *) data;
Widget *w = (Widget *) data; Widget *w = WIDGET (data);
Gpm_Event local; Gpm_Event local;
if (!mouse_global_in_widget (event, w)) if (!mouse_global_in_widget (event, w))
@ -460,13 +440,13 @@ edit_event (Gpm_Event * event, void *data)
/* click on the top line (move) */ /* click on the top line (move) */
int dx = edit->fullscreen ? 0 : 2; int dx = edit->fullscreen ? 0 : 2;
if (local.x == edit->widget.cols - dx - 1) if (local.x == w->cols - dx - 1)
{ {
edit_dialog_callback (w->owner, NULL, DLG_ACTION, CK_Close, NULL); send_message (w->owner, NULL, MSG_ACTION, CK_Close, NULL);
return MOU_NORMAL; return MOU_NORMAL;
} }
if (local.x == edit->widget.cols - dx - 4) if (local.x == w->cols - dx - 4)
{ {
edit_toggle_fullscreen (edit); edit_toggle_fullscreen (edit);
return MOU_NORMAL; return MOU_NORMAL;
@ -628,7 +608,7 @@ edit_event (Gpm_Event * event, void *data)
} }
else if (!edit->fullscreen) else if (!edit->fullscreen)
{ {
Dlg_head *h = w->owner; Widget *h = WIDGET (w->owner);
if (edit->drag_state == MCEDIT_DRAG_MOVE) if (edit->drag_state == MCEDIT_DRAG_MOVE)
{ {
@ -655,7 +635,7 @@ edit_event (Gpm_Event * event, void *data)
edit->force |= REDRAW_COMPLETELY; edit->force |= REDRAW_COMPLETELY;
} }
dlg_redraw (h); dlg_redraw (w->owner);
} }
} }
@ -674,13 +654,14 @@ edit_event (Gpm_Event * event, void *data)
static int static int
edit_dialog_event (Gpm_Event * event, void *data) edit_dialog_event (Gpm_Event * event, void *data)
{ {
Dlg_head *h = (Dlg_head *) data; WDialog *h = DIALOG (data);
Widget *w; Widget *w;
Widget *wh = WIDGET (h);
int ret = MOU_UNHANDLED; int ret = MOU_UNHANDLED;
w = (Widget *) find_menubar (h); w = WIDGET (find_menubar (h));
if (event->y == h->y + 1 && (event->type & GPM_DOWN) != 0 && !((WMenuBar *) w)->is_active) if (event->y == wh->y + 1 && (event->type & GPM_DOWN) != 0 && !MENUBAR (w)->is_active)
{ {
/* menubar */ /* menubar */
@ -690,11 +671,11 @@ edit_dialog_event (Gpm_Event * event, void *data)
/* Try find top fullscreen window */ /* Try find top fullscreen window */
for (l = h->widgets; l != NULL; l = g_list_next (l)) for (l = h->widgets; l != NULL; l = g_list_next (l))
if (edit_widget_is_editor ((Widget *) l->data) && ((WEdit *) l->data)->fullscreen) if (edit_widget_is_editor (WIDGET (l->data)) && ((WEdit *) l->data)->fullscreen)
top = l; top = l;
/* Handle fullscreen/close buttons in the top line */ /* Handle fullscreen/close buttons in the top line */
x = h->x + h->cols + 1 - 6; x = wh->x + wh->cols + 1 - 6;
if (top != NULL && event->x >= x) if (top != NULL && event->x >= x)
{ {
@ -713,7 +694,7 @@ edit_dialog_event (Gpm_Event * event, void *data)
if (x <= 2) if (x <= 2)
edit_toggle_fullscreen (e); edit_toggle_fullscreen (e);
else else
edit_dialog_callback (h, NULL, DLG_ACTION, CK_Close, NULL); send_message (h, NULL, MSG_ACTION, CK_Close, NULL);
ret = MOU_NORMAL; ret = MOU_NORMAL;
} }
@ -728,14 +709,15 @@ edit_dialog_event (Gpm_Event * event, void *data)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
edit_dialog_command_execute (Dlg_head * h, unsigned long command) edit_dialog_command_execute (WDialog * h, unsigned long command)
{ {
Widget *wh = WIDGET (h);
gboolean ret = MSG_HANDLED; gboolean ret = MSG_HANDLED;
switch (command) switch (command)
{ {
case CK_EditNew: case CK_EditNew:
edit_add_window (h, h->y + 1, h->x, h->lines - 2, h->cols, NULL, 0); edit_add_window (h, wh->y + 1, wh->x, wh->lines - 2, wh->cols, NULL, 0);
break; break;
case CK_EditFile: case CK_EditFile:
edit_load_cmd (h); edit_load_cmd (h);
@ -748,7 +730,7 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
break; break;
case CK_Close: case CK_Close:
/* if there are no opened files anymore, close MC editor */ /* if there are no opened files anymore, close MC editor */
if (edit_widget_is_editor ((Widget *) h->current->data) && if (edit_widget_is_editor (WIDGET (h->current->data)) &&
edit_close_cmd ((WEdit *) h->current->data) && find_editor (h) == NULL) edit_close_cmd ((WEdit *) h->current->data) && find_editor (h) == NULL)
dlg_stop (h); dlg_stop (h);
break; break;
@ -762,7 +744,7 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
case CK_Quit: case CK_Quit:
case CK_Cancel: case CK_Cancel:
{ {
Widget *w = (Widget *) h->current->data; Widget *w = WIDGET (h->current->data);
if (!edit_widget_is_editor (w) || ((WEdit *) w)->drag_state == MCEDIT_DRAG_NORMAL) if (!edit_widget_is_editor (w) || ((WEdit *) w)->drag_state == MCEDIT_DRAG_NORMAL)
dlg_stop (h); dlg_stop (h);
@ -796,7 +778,7 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
break; break;
case CK_WindowMove: case CK_WindowMove:
case CK_WindowResize: case CK_WindowResize:
if (edit_widget_is_editor ((Widget *) h->current->data)) if (edit_widget_is_editor (WIDGET (h->current->data)))
edit_handle_move_resize ((WEdit *) h->current->data, command); edit_handle_move_resize ((WEdit *) h->current->data, command);
break; break;
case CK_WindowList: case CK_WindowList:
@ -830,7 +812,7 @@ edit_dialog_command_execute (Dlg_head * h, unsigned long command)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static inline void static inline void
edit_quit (Dlg_head * h) edit_quit (WDialog * h)
{ {
GList *l; GList *l;
WEdit *e = NULL; WEdit *e = NULL;
@ -838,7 +820,7 @@ edit_quit (Dlg_head * h)
h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */ h->state = DLG_ACTIVE; /* don't stop the dialog before final decision */
for (l = h->widgets; l != NULL; l = g_list_next (l)) for (l = h->widgets; l != NULL; l = g_list_next (l))
if (edit_widget_is_editor ((Widget *) l->data)) if (edit_widget_is_editor (WIDGET (l->data)))
{ {
e = (WEdit *) l->data; e = (WEdit *) l->data;
@ -868,13 +850,13 @@ static inline void
edit_set_buttonbar (WEdit * edit, WButtonBar * bb) edit_set_buttonbar (WEdit * edit, WButtonBar * bb)
{ {
buttonbar_set_label (bb, 1, Q_ ("ButtonBar|Help"), editor_map, NULL); buttonbar_set_label (bb, 1, Q_ ("ButtonBar|Help"), editor_map, NULL);
buttonbar_set_label (bb, 2, Q_ ("ButtonBar|Save"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 2, Q_ ("ButtonBar|Save"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 3, Q_ ("ButtonBar|Mark"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 3, Q_ ("ButtonBar|Mark"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 4, Q_ ("ButtonBar|Replac"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 4, Q_ ("ButtonBar|Replac"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 5, Q_ ("ButtonBar|Copy"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 5, Q_ ("ButtonBar|Copy"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 6, Q_ ("ButtonBar|Move"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 6, Q_ ("ButtonBar|Move"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 7, Q_ ("ButtonBar|Search"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 7, Q_ ("ButtonBar|Search"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 8, Q_ ("ButtonBar|Delete"), editor_map, (Widget *) edit); buttonbar_set_label (bb, 8, Q_ ("ButtonBar|Delete"), editor_map, WIDGET (edit));
buttonbar_set_label (bb, 9, Q_ ("ButtonBar|PullDn"), editor_map, NULL); buttonbar_set_label (bb, 9, Q_ ("ButtonBar|PullDn"), editor_map, NULL);
buttonbar_set_label (bb, 10, Q_ ("ButtonBar|Quit"), editor_map, NULL); buttonbar_set_label (bb, 10, Q_ ("ButtonBar|Quit"), editor_map, NULL);
} }
@ -883,66 +865,67 @@ edit_set_buttonbar (WEdit * edit, WButtonBar * bb)
/** Callback for the edit dialog */ /** Callback for the edit dialog */
static cb_ret_t static cb_ret_t
edit_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) edit_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WMenuBar *menubar; WMenuBar *menubar;
WButtonBar *buttonbar; WButtonBar *buttonbar;
WDialog *h = DIALOG (w);
switch (msg) switch (msg)
{ {
case DLG_INIT: case MSG_INIT:
edit_dlg_init (); edit_dlg_init ();
return MSG_HANDLED; return MSG_HANDLED;
case DLG_DRAW: case MSG_DRAW:
/* don't use common_dialog_repaint() -- we don't need a frame */ /* don't use dlg_default_repaint() -- we don't need a frame */
tty_setcolor (EDITOR_BACKGROUND); tty_setcolor (EDITOR_BACKGROUND);
dlg_erase (h); dlg_erase (h);
return MSG_HANDLED; return MSG_HANDLED;
case DLG_RESIZE: case MSG_RESIZE:
menubar = find_menubar (h); menubar = find_menubar (h);
buttonbar = find_buttonbar (h); buttonbar = find_buttonbar (h);
/* dlg_set_size() is surplus for this case */ /* dlg_set_size() is surplus for this case */
h->lines = LINES; w->lines = LINES;
h->cols = COLS; w->cols = COLS;
widget_set_size (&buttonbar->widget, h->lines - 1, h->x, 1, h->cols); widget_set_size (WIDGET (buttonbar), w->lines - 1, w->x, 1, w->cols);
widget_set_size (&menubar->widget, h->y, h->x, 1, h->cols); widget_set_size (WIDGET (menubar), w->y, w->x, 1, w->cols);
menubar_arrange (menubar); menubar_arrange (menubar);
g_list_foreach (h->widgets, (GFunc) edit_dialog_resize_cb, NULL); g_list_foreach (h->widgets, (GFunc) edit_dialog_resize_cb, NULL);
return MSG_HANDLED; return MSG_HANDLED;
case DLG_ACTION: case MSG_ACTION:
/* shortcut */ /* shortcut */
if (sender == NULL) if (sender == NULL)
return edit_dialog_command_execute (h, parm); return edit_dialog_command_execute (h, parm);
/* message from menu */ /* message from menu */
menubar = find_menubar (h); menubar = find_menubar (h);
if (sender == (Widget *) menubar) if (sender == WIDGET (menubar))
{ {
if (edit_dialog_command_execute (h, parm) == MSG_HANDLED) if (edit_dialog_command_execute (h, parm) == MSG_HANDLED)
return MSG_HANDLED; return MSG_HANDLED;
/* try send command to the current window */ /* try send command to the current window */
return send_message ((Widget *) h->current->data, WIDGET_COMMAND, parm); return send_message (h->current->data, NULL, MSG_ACTION, parm, NULL);
} }
/* message from buttonbar */ /* message from buttonbar */
buttonbar = find_buttonbar (h); buttonbar = find_buttonbar (h);
if (sender == (Widget *) buttonbar) if (sender == WIDGET (buttonbar))
{ {
if (data != NULL) if (data != NULL)
return send_message ((Widget *) data, WIDGET_COMMAND, parm); return send_message (data, NULL, MSG_ACTION, parm, NULL);
return edit_dialog_command_execute (h, parm); return edit_dialog_command_execute (h, parm);
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case DLG_KEY: case MSG_KEY:
{ {
Widget *w = h->current->data; Widget *we = WIDGET (h->current->data);
cb_ret_t ret = MSG_NOT_HANDLED; cb_ret_t ret = MSG_NOT_HANDLED;
if (edit_widget_is_editor (w)) if (edit_widget_is_editor (we))
{ {
WEdit *e = (WEdit *) w; WEdit *e = (WEdit *) we;
unsigned long command; unsigned long command;
if (!e->extmod) if (!e->extmod)
@ -961,46 +944,46 @@ edit_dialog_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, vo
} }
/* hardcoded menu hotkeys (see edit_drop_hotkey_menu) */ /* hardcoded menu hotkeys (see edit_drop_hotkey_menu) */
case DLG_UNHANDLED_KEY: case MSG_UNHANDLED_KEY:
return edit_drop_hotkey_menu (h, parm) ? MSG_HANDLED : MSG_NOT_HANDLED; return edit_drop_hotkey_menu (h, parm) ? MSG_HANDLED : MSG_NOT_HANDLED;
case DLG_VALIDATE: case MSG_VALIDATE:
edit_quit (h); edit_quit (h);
return MSG_HANDLED; return MSG_HANDLED;
case DLG_END: case MSG_END:
edit_dlg_deinit (); edit_dlg_deinit ();
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
edit_callback (Widget * w, widget_msg_t msg, int parm) edit_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
WEdit *e = (WEdit *) w; WEdit *e = (WEdit *) w;
switch (msg) switch (msg)
{ {
case WIDGET_FOCUS: case MSG_FOCUS:
edit_set_buttonbar (e, find_buttonbar (e->widget.owner)); edit_set_buttonbar (e, find_buttonbar (w->owner));
/* fall through */ /* fall through */
case WIDGET_DRAW: case MSG_DRAW:
e->force |= REDRAW_COMPLETELY; e->force |= REDRAW_COMPLETELY;
edit_update_screen (e); edit_update_screen (e);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_UNFOCUS: case MSG_UNFOCUS:
/* redraw frame and status */ /* redraw frame and status */
edit_status (e, FALSE); edit_status (e, FALSE);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_KEY: case MSG_KEY:
{ {
int cmd, ch; int cmd, ch;
cb_ret_t ret = MSG_NOT_HANDLED; cb_ret_t ret = MSG_NOT_HANDLED;
@ -1021,13 +1004,13 @@ edit_callback (Widget * w, widget_msg_t msg, int parm)
return ret; return ret;
} }
case WIDGET_COMMAND: case MSG_ACTION:
/* command from menubar or buttonbar */ /* command from menubar or buttonbar */
edit_execute_key_command (e, parm, -1); edit_execute_key_command (e, parm, -1);
edit_update_screen (e); edit_update_screen (e);
return MSG_HANDLED; return MSG_HANDLED;
case WIDGET_CURSOR: case MSG_CURSOR:
{ {
int y, x; int y, x;
@ -1039,12 +1022,12 @@ edit_callback (Widget * w, widget_msg_t msg, int parm)
return MSG_HANDLED; return MSG_HANDLED;
} }
case WIDGET_DESTROY: case MSG_DESTROY:
edit_clean (e); edit_clean (e);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_proc (msg, parm); return widget_default_callback (w, sender, msg, parm, data);
} }
} }
@ -1079,7 +1062,7 @@ gboolean
edit_files (const GList * files) edit_files (const GList * files)
{ {
static gboolean made_directory = FALSE; static gboolean made_directory = FALSE;
Dlg_head *edit_dlg; WDialog *edit_dlg;
WMenuBar *menubar; WMenuBar *menubar;
const GList *file; const GList *file;
gboolean ok = FALSE; gboolean ok = FALSE;
@ -1117,11 +1100,12 @@ edit_files (const GList * files)
for (file = files; file != NULL; file = g_list_next (file)) for (file = files; file != NULL; file = g_list_next (file))
{ {
Widget *w = WIDGET (edit_dlg);
mcedit_arg_t *f = (mcedit_arg_t *) file->data; mcedit_arg_t *f = (mcedit_arg_t *) file->data;
gboolean f_ok; gboolean f_ok;
f_ok = edit_add_window (edit_dlg, edit_dlg->y + 1, edit_dlg->x, f_ok = edit_add_window (edit_dlg, w->y + 1, w->x, w->lines - 2, w->cols, f->file_vpath,
edit_dlg->lines - 2, edit_dlg->cols, f->file_vpath, f->line_number); f->line_number);
/* at least one file has been opened succefully */ /* at least one file has been opened succefully */
ok = ok || f_ok; ok = ok || f_ok;
} }
@ -1146,9 +1130,9 @@ edit_get_file_name (const WEdit * edit)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
WEdit * WEdit *
find_editor (const Dlg_head * h) find_editor (const WDialog * h)
{ {
if (edit_widget_is_editor ((Widget *) h->current->data)) if (edit_widget_is_editor (WIDGET (h->current->data)))
return (WEdit *) h->current->data; return (WEdit *) h->current->data;
return (WEdit *) find_widget_type (h, edit_callback); return (WEdit *) find_widget_type (h, edit_callback);
} }
@ -1172,11 +1156,12 @@ edit_widget_is_editor (const Widget * w)
void void
edit_update_screen (WEdit * e) edit_update_screen (WEdit * e)
{ {
WDialog *h = WIDGET (e)->owner;
edit_scroll_screen_over_cursor (e); edit_scroll_screen_over_cursor (e);
edit_update_curs_col (e); edit_update_curs_col (e);
edit_status (e, (e->force & REDRAW_COMPLETELY) != 0 && edit_status (e, (e->force & REDRAW_COMPLETELY) != 0 && (void *) e == h->current->data);
(void *) e == ((Widget *) e)->owner->current->data);
/* pop all events for this window for internal handling */ /* pop all events for this window for internal handling */
if (!is_idle ()) if (!is_idle ())
@ -1188,7 +1173,7 @@ edit_update_screen (WEdit * e)
edit_render_keypress (e); edit_render_keypress (e);
} }
buttonbar_redraw (find_buttonbar (((Widget *) e)->owner)); buttonbar_redraw (find_buttonbar (h));
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -1201,10 +1186,12 @@ edit_update_screen (WEdit * e)
void void
edit_save_size (WEdit * edit) edit_save_size (WEdit * edit)
{ {
edit->y_prev = edit->widget.y; Widget *w = WIDGET (edit);
edit->x_prev = edit->widget.x;
edit->lines_prev = edit->widget.lines; edit->y_prev = w->y;
edit->cols_prev = edit->widget.cols; edit->x_prev = w->x;
edit->lines_prev = w->lines;
edit->cols_prev = w->cols;
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -1223,7 +1210,7 @@ edit_save_size (WEdit * edit)
*/ */
gboolean gboolean
edit_add_window (Dlg_head * h, int y, int x, int lines, int cols, const vfs_path_t * f, long fline) edit_add_window (WDialog * h, int y, int x, int lines, int cols, const vfs_path_t * f, long fline)
{ {
WEdit *edit; WEdit *edit;
Widget *w; Widget *w;
@ -1232,10 +1219,9 @@ edit_add_window (Dlg_head * h, int y, int x, int lines, int cols, const vfs_path
if (edit == NULL) if (edit == NULL)
return FALSE; return FALSE;
w = (Widget *) edit; w = WIDGET (edit);
w->callback = edit_callback; w->callback = edit_callback;
w->mouse = edit_event; w->mouse = edit_event;
widget_want_cursor (*w, TRUE);
add_widget (h, w); add_widget (h, w);
dlg_redraw (h); dlg_redraw (h);
@ -1348,8 +1334,6 @@ edit_handle_move_resize (WEdit * edit, unsigned long command)
void void
edit_toggle_fullscreen (WEdit * edit) edit_toggle_fullscreen (WEdit * edit)
{ {
Dlg_head *h = ((Widget *) edit)->owner;
edit->fullscreen = !edit->fullscreen; edit->fullscreen = !edit->fullscreen;
edit->force = REDRAW_COMPLETELY; edit->force = REDRAW_COMPLETELY;
@ -1357,8 +1341,11 @@ edit_toggle_fullscreen (WEdit * edit)
edit_restore_size (edit); edit_restore_size (edit);
else else
{ {
Widget *w = WIDGET (edit);
Widget *h = WIDGET (w->owner);
edit_save_size (edit); edit_save_size (edit);
widget_set_size ((Widget *) edit, h->y + 1, h->x, h->lines - 2, h->cols); widget_set_size (w, h->y + 1, h->x, h->lines - 2, h->cols);
edit->force |= REDRAW_PAGE; edit->force |= REDRAW_PAGE;
edit_update_screen (edit); edit_update_screen (edit);
} }

Просмотреть файл

@ -70,7 +70,7 @@ spell_dialog_spell_suggest_show (WEdit * edit, const char *word, char **new_word
unsigned int i; unsigned int i;
int res; int res;
char *curr = NULL; char *curr = NULL;
Dlg_head *sug_dlg; WDialog *sug_dlg;
WListbox *sug_list; WListbox *sug_list;
int max_btn_len = 0; int max_btn_len = 0;
int add_len; int add_len;
@ -109,9 +109,15 @@ spell_dialog_spell_suggest_show (WEdit * edit, const char *word, char **new_word
sug_dlg_w += max_btn_len; sug_dlg_w += max_btn_len;
sug_dlg_w = max (sug_dlg_w, word_label_len) + 1; sug_dlg_w = max (sug_dlg_w, word_label_len) + 1;
sug_dlg = create_dlg (TRUE, ypos, xpos, sug_dlg_h, sug_dlg_w, sug_dlg = create_dlg (TRUE, ypos, xpos, sug_dlg_h, sug_dlg_w,
dialog_colors, NULL, NULL, "[ASpell]", _("Check word"), DLG_COMPACT); dialog_colors, NULL, NULL, "[ASpell]", _("Check word"), DLG_COMPACT);
add_widget (sug_dlg, label_new (1, 2, lang_label));
add_widget (sug_dlg, label_new (3, 2, word_label));
add_widget (sug_dlg, groupbox_new (4, 2, sug_dlg_h - 5, 25, _("Suggest")));
sug_list = listbox_new (5, 2, sug_dlg_h - 7, 24, FALSE, NULL); sug_list = listbox_new (5, 2, sug_dlg_h - 7, 24, FALSE, NULL);
for (i = 0; i < suggest->len; i++) for (i = 0; i < suggest->len; i++)
listbox_add_item (sug_list, LISTBOX_APPEND_AT_END, 0, g_array_index (suggest, char *, i), listbox_add_item (sug_list, LISTBOX_APPEND_AT_END, 0, g_array_index (suggest, char *, i),
@ -123,10 +129,6 @@ spell_dialog_spell_suggest_show (WEdit * edit, const char *word, char **new_word
add_widget (sug_dlg, skip_btn); add_widget (sug_dlg, skip_btn);
add_widget (sug_dlg, cancel_button); add_widget (sug_dlg, cancel_button);
add_widget (sug_dlg, label_new (1, 2, lang_label));
add_widget (sug_dlg, label_new (3, 2, word_label));
add_widget (sug_dlg, groupbox_new (4, 2, sug_dlg_h - 5, 25, _("Suggest")));
res = run_dlg (sug_dlg); res = run_dlg (sug_dlg);
if (res == B_ENTER) if (res == B_ENTER)
{ {

Просмотреть файл

@ -58,16 +58,13 @@
/*** file scope macro definitions ****************************************************************/ /*** file scope macro definitions ****************************************************************/
#define BX 5 #define BX 5
#define BY 6 #define BY 5
#define TX 50
#define TY 2
#define BUTTONS 9 #define BUTTONS 9
#define BUTTONS_PERM 5
#define B_SETALL B_USER #define B_SETALL B_USER
#define B_SKIP (B_USER + 1) #define B_SKIP (B_USER + 1)
#define B_OWN (B_USER + 3) #define B_OWN (B_USER + 3)
#define B_GRP (B_USER + 4) #define B_GRP (B_USER + 4)
#define B_OTH (B_USER + 5) #define B_OTH (B_USER + 5)
@ -78,43 +75,47 @@
/*** file scope variables ************************************************************************/ /*** file scope variables ************************************************************************/
static struct Dlg_head *ch_dlg; static struct WDialog *ch_dlg;
static struct static struct
{ {
int ret_cmd, flags, y, x; unsigned long id;
int ret_cmd, flags, x, len;
const char *text; const char *text;
} chown_advanced_but[BUTTONS] = } chown_advanced_but[BUTTONS] =
{ {
/* *INDENT-OFF* */ /* *INDENT-OFF* */
{ B_CANCEL, NORMAL_BUTTON, 4, 53, N_("&Cancel") }, { 0, B_ENTER, NARROW_BUTTON, 3, 0, " "},
{ B_ENTER, DEFPUSH_BUTTON,4, 40, N_("&Set") }, { 0, B_ENTER, NARROW_BUTTON, 11, 0, " "},
{ B_SKIP, NORMAL_BUTTON, 4, 23, N_("S&kip") }, { 0, B_ENTER, NARROW_BUTTON, 19, 0, " "},
{ B_SETALL, NORMAL_BUTTON, 4, 0, N_("Set &all")}, { 0, B_ENTER, NARROW_BUTTON, 29, 0, ""},
{ B_ENTER, NARROW_BUTTON, 0, 47, ""}, { 0, B_ENTER, NARROW_BUTTON, 47, 0, ""},
{ B_ENTER, NARROW_BUTTON, 0, 29, ""},
{ B_ENTER, NARROW_BUTTON, 0, 19, " "}, { 0, B_SETALL, NORMAL_BUTTON, 0, 0, N_("Set &all")},
{ B_ENTER, NARROW_BUTTON, 0, 11, " "}, { 0, B_SKIP, NORMAL_BUTTON, 0, 0, N_("S&kip") },
{ B_ENTER, NARROW_BUTTON, 0, 3, " "} { 0, B_ENTER, DEFPUSH_BUTTON, 0, 0, N_("&Set") },
{ 0, B_CANCEL, NORMAL_BUTTON, 0, 0, N_("&Cancel") }
/* *INDENT-ON* */ /* *INDENT-ON* */
}; };
static WButton *b_att[3]; /* permission */ static WButton *b_att[3]; /* permission */
static WButton *b_user, *b_group; /* owner */ static WButton *b_user, *b_group; /* owner */
static WLabel *l_filename;
static WLabel *l_mode;
static int files_on_begin; /* Number of files at startup */
static int flag_pos; static int flag_pos;
static int x_toggle; static int x_toggle;
static char ch_flags[11]; static char ch_flags[11];
static const char ch_perm[] = "rwx"; static const char ch_perm[] = "rwx";
static mode_t ch_cmode; static mode_t ch_cmode;
static struct stat *sf_stat; static struct stat *sf_stat;
static int need_update; static gboolean need_update = FALSE;
static int end_chown; static gboolean end_chown = FALSE;
static int current_file; static int current_file;
static int single_set; static gboolean single_set = FALSE;
static char *fname; static char *fname;
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -136,7 +137,7 @@ inc_flag_pos (int f_pos)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
} }
flag_pos++; flag_pos++;
if (!(flag_pos % 3) || f_pos > 2) if ((flag_pos % 3) == 0 || f_pos > 2)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
return MSG_HANDLED; return MSG_HANDLED;
} }
@ -146,13 +147,13 @@ inc_flag_pos (int f_pos)
static cb_ret_t static cb_ret_t
dec_flag_pos (int f_pos) dec_flag_pos (int f_pos)
{ {
if (!flag_pos) if (flag_pos == 0)
{ {
flag_pos = 10; flag_pos = 10;
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
} }
flag_pos--; flag_pos--;
if (!((flag_pos + 1) % 3) || f_pos > 2) if (((flag_pos + 1) % 3) == 0 || f_pos > 2)
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
return MSG_HANDLED; return MSG_HANDLED;
} }
@ -230,19 +231,19 @@ print_flags (void)
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
dlg_move (ch_dlg, BY + 1, 9 + i); widget_move (ch_dlg, BY + 1, 9 + i);
tty_print_char (ch_flags[i]); tty_print_char (ch_flags[i]);
} }
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
dlg_move (ch_dlg, BY + 1, 17 + i); widget_move (ch_dlg, BY + 1, 17 + i);
tty_print_char (ch_flags[i + 3]); tty_print_char (ch_flags[i + 3]);
} }
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
dlg_move (ch_dlg, BY + 1, 25 + i); widget_move (ch_dlg, BY + 1, 25 + i);
tty_print_char (ch_flags[i + 6]); tty_print_char (ch_flags[i + 6]);
} }
@ -250,12 +251,12 @@ print_flags (void)
for (i = 0; i < 15; i++) for (i = 0; i < 15; i++)
{ {
dlg_move (ch_dlg, BY + 1, 35 + i); widget_move (ch_dlg, BY + 1, 35 + i);
tty_print_char (ch_flags[9]); tty_print_char (ch_flags[9]);
} }
for (i = 0; i < 15; i++) for (i = 0; i < 15; i++)
{ {
dlg_move (ch_dlg, BY + 1, 53 + i); widget_move (ch_dlg, BY + 1, 53 + i);
tty_print_char (ch_flags[10]); tty_print_char (ch_flags[10]);
} }
} }
@ -263,49 +264,67 @@ print_flags (void)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
update_mode (Dlg_head * h) chown_info_update (void)
{
char buffer[BUF_SMALL];
/* mode */
g_snprintf (buffer, sizeof (buffer), "Permissions (octal): %o", get_mode ());
label_set_text (l_mode, buffer);
/* permissions */
update_permissions ();
}
/* --------------------------------------------------------------------------------------------- */
static void
update_mode (WDialog * h)
{ {
print_flags (); print_flags ();
tty_setcolor (COLOR_NORMAL); chown_info_update ();
dlg_move (h, BY + 2, 9); send_message (h->current->data, NULL, MSG_FOCUS, 0, NULL);
tty_printf ("%12o", get_mode ());
send_message ((Widget *) h->current->data, WIDGET_FOCUS, 0);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
chl_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) chl_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
switch (msg) switch (msg)
{ {
case DLG_KEY: case MSG_KEY:
switch (parm) switch (parm)
{ {
case KEY_LEFT: case KEY_LEFT:
case KEY_RIGHT: case KEY_RIGHT:
h->ret_value = parm; {
dlg_stop (h); WDialog *h = DIALOG (w);
h->ret_value = parm;
dlg_stop (h);
}
} }
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
do_enter_key (Dlg_head * h, int f_pos) do_enter_key (WDialog * h, int f_pos)
{ {
Dlg_head *chl_dlg; WDialog *chl_dlg;
WListbox *chl_list; WListbox *chl_list;
struct passwd *chl_pass; struct passwd *chl_pass;
struct group *chl_grp; struct group *chl_grp;
int fe; int fe;
int lxx, lyy, chl_end, b_pos; int lxx, lyy, b_pos;
int is_owner; gboolean chl_end, is_owner;
const char *title; const char *title;
int result;
do do
{ {
@ -314,25 +333,21 @@ do_enter_key (Dlg_head * h, int f_pos)
lxx = (COLS - 74) / 2 + (is_owner ? 35 : 53); lxx = (COLS - 74) / 2 + (is_owner ? 35 : 53);
lyy = (LINES - 13) / 2; lyy = (LINES - 13) / 2;
chl_end = 0; chl_end = FALSE;
chl_dlg = chl_dlg =
create_dlg (TRUE, lyy, lxx, 13, 17, dialog_colors, chl_callback, NULL, create_dlg (TRUE, lyy, lxx, 13, 17, dialog_colors, chl_callback, NULL,
"[Advanced Chown]", title, DLG_COMPACT | DLG_REVERSE); "[Advanced Chown]", title, DLG_COMPACT);
/* get new listboxes */ /* get new listboxes */
chl_list = listbox_new (1, 1, 11, 15, FALSE, NULL); chl_list = listbox_new (1, 1, 11, 15, FALSE, NULL);
listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0, "<Unknown>", NULL); listbox_add_item (chl_list, LISTBOX_APPEND_AT_END, 0, "<Unknown>", NULL);
if (is_owner) if (is_owner)
{ {
/* get and put user names in the listbox */ /* get and put user names in the listbox */
setpwent (); setpwent ();
while ((chl_pass = getpwent ())) while ((chl_pass = getpwent ()) != NULL)
{
listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_pass->pw_name, NULL); listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_pass->pw_name, NULL);
}
endpwent (); endpwent ();
fe = listbox_search_text (chl_list, get_owner (sf_stat->st_uid)); fe = listbox_search_text (chl_list, get_owner (sf_stat->st_uid));
} }
@ -340,10 +355,8 @@ do_enter_key (Dlg_head * h, int f_pos)
{ {
/* get and put group names in the listbox */ /* get and put group names in the listbox */
setgrent (); setgrent ();
while ((chl_grp = getgrent ())) while ((chl_grp = getgrent ()) != NULL)
{
listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_grp->gr_name, NULL); listbox_add_item (chl_list, LISTBOX_APPEND_SORTED, 0, chl_grp->gr_name, NULL);
}
endgrent (); endgrent ();
fe = listbox_search_text (chl_list, get_group (sf_stat->st_gid)); fe = listbox_search_text (chl_list, get_group (sf_stat->st_gid));
} }
@ -353,30 +366,30 @@ do_enter_key (Dlg_head * h, int f_pos)
b_pos = chl_list->pos; b_pos = chl_list->pos;
add_widget (chl_dlg, chl_list); add_widget (chl_dlg, chl_list);
run_dlg (chl_dlg); result = run_dlg (chl_dlg);
if (b_pos != chl_list->pos) if (b_pos != chl_list->pos)
{ {
int ok = 0; gboolean ok = FALSE;
char *text; char *text;
listbox_get_current (chl_list, &text, NULL); listbox_get_current (chl_list, &text, NULL);
if (is_owner) if (is_owner)
{ {
chl_pass = getpwnam (text); chl_pass = getpwnam (text);
if (chl_pass) if (chl_pass != NULL)
{ {
ok = 1; ok = TRUE;
sf_stat->st_uid = chl_pass->pw_uid; sf_stat->st_uid = chl_pass->pw_uid;
} }
} }
else else
{ {
chl_grp = getgrnam (text); chl_grp = getgrnam (text);
if (chl_grp) if (chl_grp != NULL)
{ {
sf_stat->st_gid = chl_grp->gr_gid; sf_stat->st_gid = chl_grp->gr_gid;
ok = 1; ok = TRUE;
} }
} }
if (ok) if (ok)
@ -388,17 +401,17 @@ do_enter_key (Dlg_head * h, int f_pos)
if (ok) if (ok)
print_flags (); print_flags ();
} }
if (chl_dlg->ret_value == KEY_LEFT) if (result == KEY_LEFT)
{ {
if (!is_owner) if (!is_owner)
chl_end = 1; chl_end = TRUE;
dlg_one_up (ch_dlg); dlg_one_up (ch_dlg);
f_pos--; f_pos--;
} }
else if (chl_dlg->ret_value == KEY_RIGHT) else if (result == KEY_RIGHT)
{ {
if (is_owner) if (is_owner)
chl_end = 1; chl_end = TRUE;
dlg_one_down (ch_dlg); dlg_one_down (ch_dlg);
f_pos++; f_pos++;
} }
@ -413,58 +426,30 @@ do_enter_key (Dlg_head * h, int f_pos)
static void static void
chown_refresh (void) chown_refresh (void)
{ {
common_dialog_repaint (ch_dlg); dlg_default_repaint (ch_dlg);
tty_setcolor (COLOR_NORMAL); tty_setcolor (COLOR_NORMAL);
dlg_move (ch_dlg, BY - 1, 8); widget_move (ch_dlg, BY - 1, 8);
tty_print_string (_("owner")); tty_print_string (_("owner"));
dlg_move (ch_dlg, BY - 1, 16); widget_move (ch_dlg, BY - 1, 16);
tty_print_string (_("group")); tty_print_string (_("group"));
dlg_move (ch_dlg, BY - 1, 24); widget_move (ch_dlg, BY - 1, 24);
tty_print_string (_("other")); tty_print_string (_("other"));
dlg_move (ch_dlg, BY - 1, 35); widget_move (ch_dlg, BY - 1, 35);
tty_print_string (_("owner")); tty_print_string (_("owner"));
dlg_move (ch_dlg, BY - 1, 53); widget_move (ch_dlg, BY - 1, 53);
tty_print_string (_("group")); tty_print_string (_("group"));
dlg_move (ch_dlg, 3, 4); widget_move (ch_dlg, BY + 1, 3);
tty_print_string (_("On"));
dlg_move (ch_dlg, BY + 1, 4);
tty_print_string (_("Flag")); tty_print_string (_("Flag"));
dlg_move (ch_dlg, BY + 2, 4);
tty_print_string (_("Mode"));
if (!single_set)
{
dlg_move (ch_dlg, 3, 54);
tty_printf (_("%6d of %d"), files_on_begin - (current_panel->marked) + 1, files_on_begin);
}
print_flags (); print_flags ();
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void
chown_info_update (void)
{
/* display file info */
tty_setcolor (COLOR_NORMAL);
/* name && mode */
dlg_move (ch_dlg, 3, 8);
tty_print_string (str_fit_to_term (fname, 45, J_LEFT_FIT));
dlg_move (ch_dlg, BY + 2, 9);
tty_printf ("%12o", get_mode ());
/* permissions */
update_permissions ();
}
/* --------------------------------------------------------------------------------------------- */
static void static void
b_setpos (int f_pos) b_setpos (int f_pos)
{ {
@ -477,46 +462,57 @@ b_setpos (int f_pos)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) advanced_chown_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
int i = 0, f_pos = BUTTONS - dlg_get_current_widget_id (h) - single_set - 1; WDialog *h = DIALOG (w);
int i;
int f_pos;
unsigned int id;
id = dlg_get_current_widget_id (h);
for (i = 0; i < BUTTONS_PERM; i++)
if (chown_advanced_but[i].id == id)
break;
f_pos = i;
i = 0;
switch (msg) switch (msg)
{ {
case DLG_DRAW: case MSG_DRAW:
chown_refresh (); chown_refresh ();
chown_info_update (); chown_info_update ();
return MSG_HANDLED; return MSG_HANDLED;
case DLG_POST_KEY: case MSG_POST_KEY:
if (f_pos < 3) if (f_pos < 3)
b_setpos (f_pos); b_setpos (f_pos);
return MSG_HANDLED; return MSG_HANDLED;
case DLG_FOCUS: case MSG_FOCUS:
if (f_pos < 3) if (f_pos < 3)
{ {
if ((flag_pos / 3) != f_pos) if ((flag_pos / 3) != f_pos)
flag_pos = f_pos * 3; flag_pos = f_pos * 3;
b_setpos (f_pos); b_setpos (f_pos);
} }
else if (f_pos < 5) else if (f_pos < BUTTONS_PERM)
flag_pos = f_pos + 6; flag_pos = f_pos + 6;
return MSG_HANDLED; return MSG_HANDLED;
case DLG_KEY: case MSG_KEY:
switch (parm) switch (parm)
{ {
case XCTRL ('b'): case XCTRL ('b'):
case KEY_LEFT: case KEY_LEFT:
if (f_pos < 5) if (f_pos < BUTTONS_PERM)
return (dec_flag_pos (f_pos)); return (dec_flag_pos (f_pos));
break; break;
case XCTRL ('f'): case XCTRL ('f'):
case KEY_RIGHT: case KEY_RIGHT:
if (f_pos < 5) if (f_pos < BUTTONS_PERM)
return (inc_flag_pos (f_pos)); return (inc_flag_pos (f_pos));
break; break;
@ -527,7 +523,7 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
case '\n': case '\n':
case KEY_ENTER: case KEY_ENTER:
if (f_pos <= 2 || f_pos >= 5) if (f_pos <= 2 || f_pos >= BUTTONS_PERM)
break; break;
do_enter_key (h, f_pos); do_enter_key (h, f_pos);
return MSG_HANDLED; return MSG_HANDLED;
@ -544,8 +540,8 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
ch_flags[i * 3 + parm - 3] = (x_toggle & (1 << parm)) ? '-' : '+'; ch_flags[i * 3 + parm - 3] = (x_toggle & (1 << parm)) ? '-' : '+';
x_toggle ^= (1 << parm); x_toggle ^= (1 << parm);
update_mode (h); update_mode (h);
dlg_broadcast_msg (h, WIDGET_DRAW, FALSE); dlg_broadcast_msg (h, MSG_DRAW);
send_message ((Widget *) h->current->data, WIDGET_FOCUS, 0); send_message (h->current->data, NULL, MSG_FOCUS, 0, NULL);
break; break;
case XCTRL ('x'): case XCTRL ('x'):
@ -560,8 +556,8 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
ch_flags[i * 3 + parm] = (x_toggle & (1 << parm)) ? '-' : '+'; ch_flags[i * 3 + parm] = (x_toggle & (1 << parm)) ? '-' : '+';
x_toggle ^= (1 << parm); x_toggle ^= (1 << parm);
update_mode (h); update_mode (h);
dlg_broadcast_msg (h, WIDGET_DRAW, FALSE); dlg_broadcast_msg (h, MSG_DRAW);
send_message ((Widget *) h->current->data, WIDGET_FOCUS, 0); send_message (h->current->data, NULL, MSG_FOCUS, 0, NULL);
break; break;
case 'x': case 'x':
@ -574,7 +570,7 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
if (f_pos > 2) if (f_pos > 2)
break; break;
flag_pos = f_pos * 3 + i; /* (strchr(ch_perm,parm)-ch_perm); */ flag_pos = f_pos * 3 + i; /* (strchr(ch_perm,parm)-ch_perm); */
if (((WButton *) h->current->data)->text.start[(flag_pos % 3)] == '-') if (BUTTON (h->current->data)->text.start[(flag_pos % 3)] == '-')
ch_flags[flag_pos] = '+'; ch_flags[flag_pos] = '+';
else else
ch_flags[flag_pos] = '-'; ch_flags[flag_pos] = '-';
@ -588,11 +584,12 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
i++; i++;
case '1': case '1':
if (f_pos > 2) if (f_pos <= 2)
break; {
flag_pos = i + f_pos * 3; flag_pos = i + f_pos * 3;
ch_flags[flag_pos] = '='; ch_flags[flag_pos] = '=';
update_mode (h); update_mode (h);
}
break; break;
case '-': case '-':
@ -609,8 +606,8 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
{ {
ch_flags[flag_pos] = parm; ch_flags[flag_pos] = parm;
update_mode (h); update_mode (h);
advanced_chown_callback (h, sender, DLG_KEY, KEY_RIGHT, NULL); send_message (h, sender, MSG_KEY, KEY_RIGHT, NULL);
if (flag_pos > 8 || !(flag_pos % 3)) if (flag_pos > 8 || (flag_pos % 3) == 0)
dlg_one_down (h); dlg_one_down (h);
} }
break; break;
@ -618,7 +615,7 @@ advanced_chown_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm,
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
@ -628,63 +625,107 @@ static void
init_chown_advanced (void) init_chown_advanced (void)
{ {
int i; int i;
enum int dlg_h = 12;
{ dlg_h = 13, dlg_w = 74, n_elem = 4 }; int dlg_w = 74;
#ifdef ENABLE_NLS int y;
static int i18n_len = 0;
if (i18n_len == 0) static gboolean i18n = FALSE;
if (!i18n)
{ {
int dx, cx; for (i = BUTTONS_PERM; i < BUTTONS; i++)
for (i = 0; i < n_elem; i++)
{ {
#ifdef ENABLE_NLS
chown_advanced_but[i].text = _(chown_advanced_but[i].text); chown_advanced_but[i].text = _(chown_advanced_but[i].text);
i18n_len += str_term_width1 (chown_advanced_but[i].text) + 3;
if (DEFPUSH_BUTTON == chown_advanced_but[i].flags)
i18n_len += 2; /* "<>" */
}
cx = dx = (dlg_w - i18n_len - 2) / (n_elem + 1);
/* Reversed order */
for (i = n_elem - 1; i >= 0; i--)
{
chown_advanced_but[i].x = cx;
cx += str_term_width1 (chown_advanced_but[i].text) + 3 + dx;
}
}
#endif /* ENABLE_NLS */ #endif /* ENABLE_NLS */
sf_stat = g_new (struct stat, 1); chown_advanced_but[i].len = str_term_width1 (chown_advanced_but[i].text) + 3;
if (chown_advanced_but[i].flags == DEFPUSH_BUTTON)
chown_advanced_but[i].len += 2; /* "<>" */
}
i18n = TRUE;
}
do_refresh (); do_refresh ();
end_chown = need_update = current_file = 0;
single_set = (current_panel->marked < 2) ? 2 : 0; sf_stat = g_new (struct stat, 1);
current_file = 0;
end_chown = need_update = FALSE;
single_set = (current_panel->marked < 2);
memset (ch_flags, '=', 11); memset (ch_flags, '=', 11);
flag_pos = 0; flag_pos = 0;
x_toggle = 070; x_toggle = 070;
if (!single_set)
dlg_h += 2;
ch_dlg = ch_dlg =
create_dlg (TRUE, 0, 0, dlg_h, dlg_w, dialog_colors, advanced_chown_callback, NULL, create_dlg (TRUE, 0, 0, dlg_h, dlg_w, dialog_colors, advanced_chown_callback, NULL,
"[Advanced Chown]", _("Chown advanced command"), DLG_CENTER | DLG_REVERSE); "[Advanced Chown]", _("Chown advanced command"), DLG_CENTER);
#define XTRACT(i) BY+chown_advanced_but[i].y, BX+chown_advanced_but[i].x, \
l_filename = label_new (2, 3, "");
add_widget (ch_dlg, l_filename);
add_widget (ch_dlg, hline_new (3, -1, -1));
#define XTRACT(i,y) y, BX+chown_advanced_but[i].x, \
chown_advanced_but[i].ret_cmd, chown_advanced_but[i].flags, \ chown_advanced_but[i].ret_cmd, chown_advanced_but[i].flags, \
(chown_advanced_but[i].text), 0 (chown_advanced_but[i].text), NULL
b_att[0] = button_new (XTRACT (0, BY));
chown_advanced_but[0].id = add_widget (ch_dlg, b_att[0]);
b_att[1] = button_new (XTRACT (1, BY));
chown_advanced_but[1].id = add_widget (ch_dlg, b_att[1]);
b_att[2] = button_new (XTRACT (2, BY));
chown_advanced_but[2].id = add_widget (ch_dlg, b_att[2]);
b_user = button_new (XTRACT (3, BY));
chown_advanced_but[3].id = add_widget (ch_dlg, b_user);
b_group = button_new (XTRACT (4, BY));
chown_advanced_but[4].id = add_widget (ch_dlg, b_group);
#undef XTRACT
for (i = 0; i < BUTTONS - 5; i++) l_mode = label_new (BY + 2, 3, "");
if (!single_set || i < 2) add_widget (ch_dlg, l_mode);
add_widget (ch_dlg, button_new (XTRACT (i)));
b_att[0] = button_new (XTRACT (8)); y = BY + 3;
b_att[1] = button_new (XTRACT (7)); if (!single_set)
b_att[2] = button_new (XTRACT (6)); {
b_user = button_new (XTRACT (5)); i = BUTTONS_PERM;
b_group = button_new (XTRACT (4)); add_widget (ch_dlg, hline_new (y++, -1, -1));
chown_advanced_but[i].id = add_widget (ch_dlg,
button_new (y,
WIDGET (ch_dlg)->cols / 2 -
chown_advanced_but[i].len,
chown_advanced_but[i].ret_cmd,
chown_advanced_but[i].flags,
chown_advanced_but[i].text, NULL));
i++;
chown_advanced_but[i].id = add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 + 1,
chown_advanced_but[i].ret_cmd,
chown_advanced_but[i].flags,
chown_advanced_but[i].text, NULL));
y++;
}
add_widget (ch_dlg, b_group); i = BUTTONS_PERM + 2;
add_widget (ch_dlg, b_user); add_widget (ch_dlg, hline_new (y++, -1, -1));
add_widget (ch_dlg, b_att[2]); chown_advanced_but[i].id = add_widget (ch_dlg,
add_widget (ch_dlg, b_att[1]); button_new (y,
add_widget (ch_dlg, b_att[0]); WIDGET (ch_dlg)->cols / 2 -
chown_advanced_but[i].len,
chown_advanced_but[i].ret_cmd,
chown_advanced_but[i].flags,
chown_advanced_but[i].text, NULL));
i++;
chown_advanced_but[i].id = add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 + 1,
chown_advanced_but[i].ret_cmd,
chown_advanced_but[i].flags,
chown_advanced_but[i].text, NULL));
dlg_select_widget (b_att[0]);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -732,7 +773,7 @@ apply_advanced_chowns (struct stat *sf)
lc_fname = current_panel->dir.list[current_file].fname; lc_fname = current_panel->dir.list[current_file].fname;
vpath = vfs_path_from_str (lc_fname); vpath = vfs_path_from_str (lc_fname);
need_update = end_chown = 1; need_update = end_chown = TRUE;
if (mc_chmod (vpath, get_mode ()) == -1) if (mc_chmod (vpath, get_mode ()) == -1)
message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"), message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"),
lc_fname, unix_error_string (errno)); lc_fname, unix_error_string (errno));
@ -754,7 +795,9 @@ apply_advanced_chowns (struct stat *sf)
vfs_path_free (vpath); vfs_path_free (vpath);
break; break;
} }
ch_cmode = sf->st_mode; ch_cmode = sf->st_mode;
if (mc_chmod (vpath, get_mode ()) == -1) if (mc_chmod (vpath, get_mode ()) == -1)
message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"), message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"),
lc_fname, unix_error_string (errno)); lc_fname, unix_error_string (errno));
@ -767,7 +810,7 @@ apply_advanced_chowns (struct stat *sf)
do_file_mark (current_panel, current_file, 0); do_file_mark (current_panel, current_file, 0);
vfs_path_free (vpath); vfs_path_free (vpath);
} }
while (current_panel->marked); while (current_panel->marked != 0);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -777,11 +820,18 @@ apply_advanced_chowns (struct stat *sf)
void void
chown_advanced_cmd (void) chown_advanced_cmd (void)
{ {
files_on_begin = current_panel->marked; /* Number of files at startup */
int files_on_begin;
files_on_begin = max (1, current_panel->marked);
do do
{ /* do while any files remaining */ { /* do while any files remaining */
int file_idx;
char buffer[BUF_MEDIUM];
vfs_path_t *vpath; vfs_path_t *vpath;
int result;
init_chown_advanced (); init_chown_advanced ();
if (current_panel->marked) if (current_panel->marked)
@ -796,56 +846,53 @@ chown_advanced_cmd (void)
vfs_path_free (vpath); vfs_path_free (vpath);
break; break;
} }
ch_cmode = sf_stat->st_mode; ch_cmode = sf_stat->st_mode;
file_idx = files_on_begin == 1 ? 1 : (files_on_begin - current_panel->marked + 1);
g_snprintf (buffer, sizeof (buffer), "%s (%d/%d)",
str_fit_to_term (fname, WIDGET(ch_dlg)->cols - 20, J_LEFT_FIT),
file_idx, files_on_begin);
label_set_text (l_filename, buffer);
chown_refresh (); chown_refresh ();
update_ownership (); update_ownership ();
/* game can begin */ result = run_dlg (ch_dlg);
run_dlg (ch_dlg);
switch (ch_dlg->ret_value) switch (result)
{ {
case B_CANCEL: case B_CANCEL:
end_chown = 1; end_chown = TRUE;
break; break;
case B_ENTER: case B_ENTER:
{ need_update = TRUE;
vfs_path_t *fname_vpath; if (mc_chmod (vpath, get_mode ()) == -1)
message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"),
fname_vpath = vfs_path_from_str (fname); fname, unix_error_string (errno));
need_update = 1; /* call mc_chown only, if mc_chmod didn't fail */
if (mc_chmod (fname_vpath, get_mode ()) == -1) else if (mc_chown
message (D_ERROR, MSG_ERROR, _("Cannot chmod \"%s\"\n%s"), (vpath, (ch_flags[9] == '+') ? sf_stat->st_uid : (uid_t) - 1,
fname, unix_error_string (errno)); (ch_flags[10] == '+') ? sf_stat->st_gid : (gid_t) - 1) == -1)
/* call mc_chown only, if mc_chmod didn't fail */ message (D_ERROR, MSG_ERROR, _("Cannot chown \"%s\"\n%s"), fname,
else if (mc_chown unix_error_string (errno));
(fname_vpath, (ch_flags[9] == '+') ? sf_stat->st_uid : (uid_t) - 1,
(ch_flags[10] == '+') ? sf_stat->st_gid : (gid_t) - 1) == -1)
message (D_ERROR, MSG_ERROR, _("Cannot chown \"%s\"\n%s"), fname,
unix_error_string (errno));
vfs_path_free (fname_vpath);
}
break; break;
case B_SETALL: case B_SETALL:
apply_advanced_chowns (sf_stat); apply_advanced_chowns (sf_stat);
break; break;
case B_SKIP: case B_SKIP:
break; break;
} }
if (current_panel->marked && ch_dlg->ret_value != B_CANCEL) if (current_panel->marked && result != B_CANCEL)
{ {
do_file_mark (current_panel, current_file, 0); do_file_mark (current_panel, current_file, 0);
need_update = 1; need_update = TRUE;
} }
destroy_dlg (ch_dlg); destroy_dlg (ch_dlg);
vfs_path_free (vpath); vfs_path_free (vpath);
} }
while (current_panel->marked && !end_chown); while (current_panel->marked && !end_chown);

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -18,7 +18,7 @@
/*** declarations of public functions ************************************************************/ /*** declarations of public functions ************************************************************/
int display_box (WPanel * p, char **user, char **mini, int *use_msformat, int num); int panel_listing_box (WPanel * p, char **user, char **mini, int *use_msformat, int num);
const panel_field_t *sort_box (panel_sort_info_t * info); const panel_field_t *sort_box (panel_sort_info_t * info);
void confirm_box (void); void confirm_box (void);
void display_bits_box (void); void display_bits_box (void);

Просмотреть файл

@ -80,18 +80,18 @@ static struct
} check_perm[] = } check_perm[] =
{ {
/* *INDENT-OFF* */ /* *INDENT-OFF* */
{ S_IXOTH, N_("execute/search by others"), FALSE, NULL }, { S_ISUID, N_("set &user ID on execution"), FALSE, NULL },
{ S_IWOTH, N_("write by others"), FALSE, NULL }, { S_ISGID, N_("set &group ID on execution"), FALSE, NULL },
{ S_IROTH, N_("read by others"), FALSE, NULL }, { S_ISVTX, N_("stick&y bit"), FALSE, NULL },
{ S_IXGRP, N_("execute/search by group"), FALSE, NULL }, { S_IRUSR, N_("&read by owner"), FALSE, NULL },
{ S_IWGRP, N_("write by group"), FALSE, NULL }, { S_IWUSR, N_("&write by owner"), FALSE, NULL },
{ S_IRGRP, N_("read by group"), FALSE, NULL }, { S_IXUSR, N_("e&xecute/search by owner"), FALSE, NULL },
{ S_IXUSR, N_("execute/search by owner"), FALSE, NULL }, { S_IRGRP, N_("rea&d by group"), FALSE, NULL },
{ S_IWUSR, N_("write by owner"), FALSE, NULL }, { S_IWGRP, N_("write by grou&p"), FALSE, NULL },
{ S_IRUSR, N_("read by owner"), FALSE, NULL }, { S_IXGRP, N_("execu&te/search by group"), FALSE, NULL },
{ S_ISVTX, N_("sticky bit"), FALSE, NULL }, { S_IROTH, N_("read &by others"), FALSE, NULL },
{ S_ISGID, N_("set group ID on execution"), FALSE, NULL }, { S_IWOTH, N_("wr&ite by others"), FALSE, NULL },
{ S_ISUID, N_("set user ID on execution"), FALSE, NULL } { S_IXOTH, N_("execute/searc&h by others"), FALSE, NULL }
/* *INDENT-ON* */ /* *INDENT-ON* */
}; };
@ -118,17 +118,18 @@ static struct
} chmod_but[] = } chmod_but[] =
{ {
/* *INDENT-OFF* */ /* *INDENT-OFF* */
{ B_CANCEL, NORMAL_BUTTON, 3, 0, N_("&Cancel") }, { B_ALL, NORMAL_BUTTON, 6, 0, N_("Set &all") },
{ B_ENTER, DEFPUSH_BUTTON, 3, 0, N_("&Set") },
{ B_CLRMRK, NORMAL_BUTTON, 5, 0, N_("C&lear marked") },
{ B_SETMRK, NORMAL_BUTTON, 5, 0, N_("S&et marked") },
{ B_MARKED, NORMAL_BUTTON, 6, 0, N_("&Marked all") }, { B_MARKED, NORMAL_BUTTON, 6, 0, N_("&Marked all") },
{ B_ALL, NORMAL_BUTTON, 6, 0, N_("Set &all") } { B_SETMRK, NORMAL_BUTTON, 5, 0, N_("S&et marked") },
{ B_CLRMRK, NORMAL_BUTTON, 5, 0, N_("C&lear marked") },
{ B_ENTER, DEFPUSH_BUTTON, 3, 0, N_("&Set") },
{ B_CANCEL, NORMAL_BUTTON, 3, 0, N_("&Cancel") }
/* *INDENT-ON* */ /* *INDENT-ON* */
}; };
static const unsigned int chmod_but_num = G_N_ELEMENTS (chmod_but); static const unsigned int chmod_but_num = G_N_ELEMENTS (chmod_but);
/* --------------------------------------------------------------------------------------------- */
/*** file scope functions ************************************************************************/ /*** file scope functions ************************************************************************/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -180,25 +181,25 @@ chmod_i18n (void)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
chmod_toggle_select (Dlg_head * h, int Id) chmod_toggle_select (WDialog * h, int Id)
{ {
tty_setcolor (COLOR_NORMAL); tty_setcolor (COLOR_NORMAL);
check_perm[Id].selected = !check_perm[Id].selected; check_perm[Id].selected = !check_perm[Id].selected;
dlg_move (h, PY + check_perm_num - Id, PX + 1); widget_move (h, PY + Id + 1, PX + 1);
tty_print_char (check_perm[Id].selected ? '*' : ' '); tty_print_char (check_perm[Id].selected ? '*' : ' ');
dlg_move (h, PY + check_perm_num - Id, PX + 3); widget_move (h, PY + Id + 1, PX + 3);
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static void static void
chmod_refresh (Dlg_head * h) chmod_refresh (WDialog * h)
{ {
int y = file_gb->widget.y + 1; int y = WIDGET (file_gb)->y + 1;
int x = file_gb->widget.x + 2; int x = WIDGET (file_gb)->x + 2;
common_dialog_repaint (h); dlg_default_repaint (h);
tty_setcolor (COLOR_NORMAL); tty_setcolor (COLOR_NORMAL);
@ -215,40 +216,34 @@ chmod_refresh (Dlg_head * h)
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static cb_ret_t static cb_ret_t
chmod_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *data) chmod_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
{ {
char buffer[BUF_TINY]; WDialog *h = DIALOG (w);
int id;
id = dlg_get_current_widget_id (h) - (chmod_but_num - (single_set ? 4 : 0)) - 1;
switch (msg) switch (msg)
{ {
case DLG_ACTION: case MSG_ACTION:
/* close dialog due to SIGINT (ctrl-g) */
if (sender == NULL && parm == CK_Cancel)
return MSG_NOT_HANDLED;
/* handle checkboxes */
if (id >= 0)
{ {
gboolean sender_is_checkbox = FALSE; /* handle checkboxes */
unsigned int i; unsigned int i;
/* close dialog due to SIGINT (ctrl-g) */
if (sender == NULL && parm == CK_Cancel)
return MSG_NOT_HANDLED;
/* whether action was sent by checkbox? */ /* whether action was sent by checkbox? */
for (i = 0; i < check_perm_num; i++) for (i = 0; i < check_perm_num; i++)
if (sender == (Widget *) check_perm[i].check) if (sender == WIDGET (check_perm[i].check))
{
sender_is_checkbox = TRUE;
break; break;
}
if (sender_is_checkbox) if (i < check_perm_num)
{ {
c_stat ^= check_perm[id].mode; char buffer[BUF_TINY];
c_stat ^= check_perm[i].mode;
g_snprintf (buffer, sizeof (buffer), "%o", (unsigned int) c_stat); g_snprintf (buffer, sizeof (buffer), "%o", (unsigned int) c_stat);
label_set_text (statl, buffer); label_set_text (statl, buffer);
chmod_toggle_select (h, id); chmod_toggle_select (h, i);
mode_change = TRUE; mode_change = TRUE;
return MSG_HANDLED; return MSG_HANDLED;
} }
@ -256,32 +251,44 @@ chmod_callback (Dlg_head * h, Widget * sender, dlg_msg_t msg, int parm, void *da
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case DLG_KEY: case MSG_KEY:
if ((parm == 'T' || parm == 't' || parm == KEY_IC) && id > 0) if (parm == 'T' || parm == 't' || parm == KEY_IC)
{ {
chmod_toggle_select (h, id); unsigned int i;
if (parm == KEY_IC) unsigned long id;
dlg_one_down (h);
return MSG_HANDLED; id = dlg_get_current_widget_id (h);
for (i = 0; i < check_perm_num; i++)
if (id == WIDGET (check_perm[i].check)->id)
break;
if (i < check_perm_num)
{
chmod_toggle_select (h, i);
if (parm == KEY_IC)
dlg_one_down (h);
return MSG_HANDLED;
}
} }
return MSG_NOT_HANDLED; return MSG_NOT_HANDLED;
case DLG_DRAW: case MSG_DRAW:
chmod_refresh (h); chmod_refresh (h);
return MSG_HANDLED; return MSG_HANDLED;
default: default:
return default_dlg_callback (h, sender, msg, parm, data); return dlg_default_callback (w, sender, msg, parm, data);
} }
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static Dlg_head * static WDialog *
init_chmod (const char *fname, const struct stat *sf_stat) init_chmod (const char *fname, const struct stat *sf_stat)
{ {
Dlg_head *ch_dlg; WDialog *ch_dlg;
int lines, cols; int lines, cols;
int y;
int perm_gb_len; int perm_gb_len;
int file_gb_len; int file_gb_len;
unsigned int i; unsigned int i;
@ -306,50 +313,66 @@ init_chmod (const char *fname, const struct stat *sf_stat)
ch_dlg = ch_dlg =
create_dlg (TRUE, 0, 0, lines, cols, dialog_colors, create_dlg (TRUE, 0, 0, lines, cols, dialog_colors,
chmod_callback, NULL, "[Chmod]", _("Chmod command"), DLG_CENTER | DLG_REVERSE); chmod_callback, NULL, "[Chmod]", _("Chmod command"), DLG_CENTER);
for (i = 0; i < chmod_but_num; i++) add_widget (ch_dlg, groupbox_new (PY, PX, check_perm_num + 2, perm_gb_len, _("Permission")));
{
add_widget (ch_dlg,
button_new (lines - chmod_but[i].y, ch_dlg->cols / 2 + 1,
chmod_but[i].ret_cmd, chmod_but[i].flags, chmod_but[i].text, 0));
i++;
add_widget (ch_dlg,
button_new (lines - chmod_but[i].y, ch_dlg->cols / 2 - chmod_but[i].len,
chmod_but[i].ret_cmd, chmod_but[i].flags, chmod_but[i].text, 0));
if (single_set)
break;
}
file_gb = groupbox_new (PY, PX + perm_gb_len + 1, check_perm_num + 2, file_gb_len, _("File"));
add_widget (ch_dlg, file_gb);
for (i = 0; i < check_perm_num; i++) for (i = 0; i < check_perm_num; i++)
{ {
check_perm[i].check = check_new (PY + (check_perm_num - i), PX + 2, check_perm[i].check = check_new (PY + i + 1, PX + 2,
(c_stat & check_perm[i].mode) != 0 ? 1 : 0, (c_stat & check_perm[i].mode) != 0 ? 1 : 0,
check_perm[i].text); check_perm[i].text);
add_widget (ch_dlg, check_perm[i].check); add_widget (ch_dlg, check_perm[i].check);
} }
add_widget (ch_dlg, groupbox_new (PY, PX, check_perm_num + 2, perm_gb_len, _("Permission"))); file_gb = groupbox_new (PY, PX + perm_gb_len + 1, check_perm_num + 2, file_gb_len, _("File"));
add_widget (ch_dlg, file_gb);
/* Set the labels */ /* Set the labels */
/* Do this at end to have a widget id in a simple way */ y = PY + 2;
lines = PY + 2;
cols = PX + perm_gb_len + 3; cols = PX + perm_gb_len + 3;
c_fname = str_trunc (fname, file_gb_len - 3); c_fname = str_trunc (fname, file_gb_len - 3);
add_widget (ch_dlg, label_new (lines, cols, c_fname)); add_widget (ch_dlg, label_new (y, cols, c_fname));
c_fown = str_trunc (get_owner (sf_stat->st_uid), file_gb_len - 3);
add_widget (ch_dlg, label_new (lines + 4, cols, c_fown));
c_fgrp = str_trunc (get_group (sf_stat->st_gid), file_gb_len - 3);
add_widget (ch_dlg, label_new (lines + 6, cols, c_fgrp));
g_snprintf (buffer, sizeof (buffer), "%o", (unsigned int) c_stat); g_snprintf (buffer, sizeof (buffer), "%o", (unsigned int) c_stat);
statl = label_new (lines + 2, cols, buffer); statl = label_new (y + 2, cols, buffer);
add_widget (ch_dlg, statl); add_widget (ch_dlg, statl);
c_fown = str_trunc (get_owner (sf_stat->st_uid), file_gb_len - 3);
add_widget (ch_dlg, label_new (y + 4, cols, c_fown));
c_fgrp = str_trunc (get_group (sf_stat->st_gid), file_gb_len - 3);
add_widget (ch_dlg, label_new (y + 6, cols, c_fgrp));
if (!single_set)
{
i = 0;
add_widget (ch_dlg, hline_new (lines - chmod_but[i].y - 1, -1, -1));
for (; i < chmod_but_num - 2; i++)
{
y = lines - chmod_but[i].y;
add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 - chmod_but[i].len,
chmod_but[i].ret_cmd, chmod_but[i].flags, chmod_but[i].text,
NULL));
i++;
add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 + 1,
chmod_but[i].ret_cmd, chmod_but[i].flags, chmod_but[i].text,
NULL));
}
}
i = chmod_but_num - 2;
y = lines - chmod_but[i].y;
add_widget (ch_dlg, hline_new (y - 1, -1, -1));
add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 - chmod_but[i].len, chmod_but[i].ret_cmd,
chmod_but[i].flags, chmod_but[i].text, NULL));
i++;
add_widget (ch_dlg,
button_new (y, WIDGET (ch_dlg)->cols / 2 + 1, chmod_but[i].ret_cmd,
chmod_but[i].flags, chmod_but[i].text, NULL));
/* select first checkbox */
dlg_select_widget (check_perm[0].check);
return ch_dlg; return ch_dlg;
} }
@ -435,7 +458,7 @@ chmod_cmd (void)
do do
{ /* do while any files remaining */ { /* do while any files remaining */
vfs_path_t *vpath; vfs_path_t *vpath;
Dlg_head *ch_dlg; WDialog *ch_dlg;
struct stat sf_stat; struct stat sf_stat;
char *fname; char *fname;
int result; int result;

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше