mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-22 20:36:50 +03:00
Find widget API: support groups.
Signed-off-by: Andrew Borodin <aborodin@vmail.ru>
This commit is contained in:
parent
fdf3d9c3b7
commit
e9d23e90f0
@ -284,5 +284,5 @@ buttonbar_set_label (WButtonBar * bb, int idx, const char *text, const global_ke
|
|||||||
WButtonBar *
|
WButtonBar *
|
||||||
find_buttonbar (const WDialog * h)
|
find_buttonbar (const WDialog * h)
|
||||||
{
|
{
|
||||||
return BUTTONBAR (find_widget_type (h, buttonbar_callback));
|
return BUTTONBAR (widget_find_by_type (CONST_WIDGET (h), buttonbar_callback));
|
||||||
}
|
}
|
||||||
|
@ -115,17 +115,6 @@ dlg_read_history (WDialog * h)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int
|
|
||||||
dlg_find_widget_callback (const void *a, const void *b)
|
|
||||||
{
|
|
||||||
const Widget *w = CONST_WIDGET (a);
|
|
||||||
const widget_cb_fn f = b;
|
|
||||||
|
|
||||||
return (w->callback == f) ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
refresh_cmd (void)
|
refresh_cmd (void)
|
||||||
{
|
{
|
||||||
@ -468,16 +457,6 @@ frontend_dlg_run (WDialog * h)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static int
|
|
||||||
dlg_find_widget_by_id (gconstpointer a, gconstpointer b)
|
|
||||||
{
|
|
||||||
const Widget *w = CONST_WIDGET (a);
|
|
||||||
unsigned long id = GPOINTER_TO_UINT (b);
|
|
||||||
|
|
||||||
return w->id == id ? 0 : 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
static void
|
static void
|
||||||
dlg_widget_set_position (gpointer data, gpointer user_data)
|
dlg_widget_set_position (gpointer data, gpointer user_data)
|
||||||
{
|
{
|
||||||
@ -742,42 +721,6 @@ do_refresh (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
/** Find the widget with the given callback in the dialog h */
|
|
||||||
|
|
||||||
Widget *
|
|
||||||
find_widget_type (const WDialog * h, widget_cb_fn callback)
|
|
||||||
{
|
|
||||||
GList *w;
|
|
||||||
|
|
||||||
w = g_list_find_custom (CONST_GROUP (h)->widgets, (gconstpointer) callback,
|
|
||||||
dlg_find_widget_callback);
|
|
||||||
|
|
||||||
return (w == NULL) ? NULL : WIDGET (w->data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
GList *
|
|
||||||
dlg_find (const WDialog * h, const Widget * w)
|
|
||||||
{
|
|
||||||
const WGroup *g = CONST_GROUP (h);
|
|
||||||
|
|
||||||
return (w->owner == NULL || w->owner != g) ? NULL : g_list_find (g->widgets, w);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
|
||||||
/** Find the widget with the given id */
|
|
||||||
|
|
||||||
Widget *
|
|
||||||
dlg_find_by_id (const WDialog * h, unsigned long id)
|
|
||||||
{
|
|
||||||
GList *w;
|
|
||||||
|
|
||||||
w = g_list_find_custom (CONST_GROUP (h)->widgets, GUINT_TO_POINTER (id), dlg_find_widget_by_id);
|
|
||||||
return w != NULL ? WIDGET (w->data) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -137,11 +137,6 @@ void dlg_default_repaint (WDialog * h);
|
|||||||
void dlg_erase (WDialog * h);
|
void dlg_erase (WDialog * h);
|
||||||
void dlg_stop (WDialog * h);
|
void dlg_stop (WDialog * h);
|
||||||
|
|
||||||
/* Widget selection */
|
|
||||||
Widget *find_widget_type (const WDialog * h, widget_cb_fn callback);
|
|
||||||
GList *dlg_find (const WDialog * h, const Widget * w);
|
|
||||||
Widget *dlg_find_by_id (const WDialog * h, unsigned long id);
|
|
||||||
|
|
||||||
/* Redraw all dialogs */
|
/* Redraw all dialogs */
|
||||||
void do_refresh (void);
|
void do_refresh (void);
|
||||||
|
|
||||||
|
@ -148,6 +148,102 @@ group_send_broadcast_msg_custom (WGroup * g, widget_msg_t msg, gboolean reverse,
|
|||||||
while (first != p);
|
while (first != p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default group callback function to find widget in the group.
|
||||||
|
*
|
||||||
|
* @param w WGroup object
|
||||||
|
* @param what widget to find
|
||||||
|
*
|
||||||
|
* @return holder of @what if found, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
static GList *
|
||||||
|
group_default_find (const Widget * w, const Widget * what)
|
||||||
|
{
|
||||||
|
GList *w0;
|
||||||
|
|
||||||
|
w0 = widget_default_find (w, what);
|
||||||
|
if (w0 == NULL)
|
||||||
|
{
|
||||||
|
GList *iter;
|
||||||
|
|
||||||
|
for (iter = GROUP (w)->widgets; iter != NULL; iter = g_list_next (iter))
|
||||||
|
{
|
||||||
|
w0 = widget_find (WIDGET (iter->data), what);
|
||||||
|
if (w0 != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return w0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default group callback function to find widget in the group using widget callback.
|
||||||
|
*
|
||||||
|
* @param w WGroup object
|
||||||
|
* @param cb widget callback
|
||||||
|
*
|
||||||
|
* @return widget object if found, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
static Widget *
|
||||||
|
group_default_find_by_type (const Widget * w, widget_cb_fn cb)
|
||||||
|
{
|
||||||
|
Widget *w0;
|
||||||
|
|
||||||
|
w0 = widget_default_find_by_type (w, cb);
|
||||||
|
if (w0 == NULL)
|
||||||
|
{
|
||||||
|
GList *iter;
|
||||||
|
|
||||||
|
for (iter = GROUP (w)->widgets; iter != NULL; iter = g_list_next (iter))
|
||||||
|
{
|
||||||
|
w0 = widget_find_by_type (WIDGET (iter->data), cb);
|
||||||
|
if (w0 != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return w0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default group callback function to find widget by widget ID in the group.
|
||||||
|
*
|
||||||
|
* @param w WGroup object
|
||||||
|
* @param id widget ID
|
||||||
|
*
|
||||||
|
* @return widget object if widget with specified id is found in group, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
static Widget *
|
||||||
|
group_default_find_by_id (const Widget * w, unsigned long id)
|
||||||
|
{
|
||||||
|
Widget *w0;
|
||||||
|
|
||||||
|
w0 = widget_default_find_by_id (w, id);
|
||||||
|
if (w0 == NULL)
|
||||||
|
{
|
||||||
|
GList *iter;
|
||||||
|
|
||||||
|
for (iter = GROUP (w)->widgets; iter != NULL; iter = g_list_next (iter))
|
||||||
|
{
|
||||||
|
w0 = widget_find_by_id (WIDGET (iter->data), id);
|
||||||
|
if (w0 != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return w0;
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/*** public functions ****************************************************************************/
|
/*** public functions ****************************************************************************/
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -172,6 +268,10 @@ group_init (WGroup * g, int y1, int x1, int lines, int cols, widget_cb_fn callba
|
|||||||
|
|
||||||
widget_init (w, y1, x1, lines, cols, callback != NULL ? callback : group_default_callback,
|
widget_init (w, y1, x1, lines, cols, callback != NULL ? callback : group_default_callback,
|
||||||
mouse_callback);
|
mouse_callback);
|
||||||
|
|
||||||
|
w->find = group_default_find;
|
||||||
|
w->find_by_type = group_default_find_by_type;
|
||||||
|
w->find_by_id = group_default_find_by_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -398,7 +498,7 @@ group_select_widget_by_id (const WGroup * g, unsigned long id)
|
|||||||
{
|
{
|
||||||
Widget *w;
|
Widget *w;
|
||||||
|
|
||||||
w = dlg_find_by_id (DIALOG (g), id);
|
w = widget_find_by_id (CONST_WIDGET (g), id);
|
||||||
if (w != NULL)
|
if (w != NULL)
|
||||||
widget_select (w);
|
widget_select (w);
|
||||||
}
|
}
|
||||||
|
@ -257,7 +257,7 @@ menubar_draw (const WMenuBar * menubar)
|
|||||||
static void
|
static void
|
||||||
menubar_remove (WMenuBar * menubar)
|
menubar_remove (WMenuBar * menubar)
|
||||||
{
|
{
|
||||||
WGroup *g;
|
Widget *g;
|
||||||
|
|
||||||
if (!menubar->is_dropped)
|
if (!menubar->is_dropped)
|
||||||
return;
|
return;
|
||||||
@ -266,15 +266,15 @@ 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. */
|
||||||
g = WIDGET (menubar)->owner;
|
g = WIDGET (WIDGET (menubar)->owner);
|
||||||
g->current = g_list_find (g->widgets, dlg_find_by_id (DIALOG (g), menubar->previous_widget));
|
GROUP (g)->current = widget_find (g, widget_find_by_id (g, menubar->previous_widget));
|
||||||
|
|
||||||
menubar->is_dropped = FALSE;
|
menubar->is_dropped = FALSE;
|
||||||
do_refresh ();
|
do_refresh ();
|
||||||
menubar->is_dropped = TRUE;
|
menubar->is_dropped = TRUE;
|
||||||
|
|
||||||
/* restore current widget */
|
/* restore current widget */
|
||||||
g->current = g_list_find (g->widgets, menubar);
|
GROUP (g)->current = widget_find (g, WIDGET (menubar));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -1039,7 +1039,7 @@ menubar_arrange (WMenuBar * menubar)
|
|||||||
WMenuBar *
|
WMenuBar *
|
||||||
find_menubar (const WDialog * h)
|
find_menubar (const WDialog * h)
|
||||||
{
|
{
|
||||||
return MENUBAR (find_widget_type (h, menubar_callback));
|
return MENUBAR (widget_find_by_type (CONST_WIDGET (h), menubar_callback));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -108,7 +108,7 @@ widget_focus (Widget * w)
|
|||||||
if (g->current == NULL || !widget_get_state (WIDGET (g->current->data), WST_FOCUSED))
|
if (g->current == NULL || !widget_get_state (WIDGET (g->current->data), WST_FOCUSED))
|
||||||
{
|
{
|
||||||
widget_do_focus (w, TRUE);
|
widget_do_focus (w, TRUE);
|
||||||
g->current = dlg_find (DIALOG (g), w);
|
g->current = widget_find (WIDGET (g), w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!widget_get_state (w, WST_FOCUSED))
|
else if (!widget_get_state (w, WST_FOCUSED))
|
||||||
@ -290,6 +290,10 @@ widget_init (Widget * w, int y, int x, int lines, int cols,
|
|||||||
|
|
||||||
w->options = WOP_DEFAULT;
|
w->options = WOP_DEFAULT;
|
||||||
w->state = WST_DEFAULT;
|
w->state = WST_DEFAULT;
|
||||||
|
|
||||||
|
w->find = widget_default_find;
|
||||||
|
w->find_by_type = widget_default_find_by_type;
|
||||||
|
w->find_by_id = widget_default_find_by_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -599,19 +603,19 @@ widget_replace (Widget * old_w, Widget * new_w)
|
|||||||
void
|
void
|
||||||
widget_select (Widget * w)
|
widget_select (Widget * w)
|
||||||
{
|
{
|
||||||
WDialog *h;
|
WGroup *g;
|
||||||
|
|
||||||
if (!widget_get_options (w, WOP_SELECTABLE))
|
if (!widget_get_options (w, WOP_SELECTABLE))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
h = DIALOG (w->owner);
|
g = GROUP (w->owner);
|
||||||
if (h != NULL)
|
if (g != NULL)
|
||||||
{
|
{
|
||||||
if (widget_get_options (w, WOP_TOP_SELECT))
|
if (widget_get_options (w, WOP_TOP_SELECT))
|
||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
l = dlg_find (h, w);
|
l = widget_find (WIDGET (g), w);
|
||||||
widget_reorder (l, TRUE);
|
widget_reorder (l, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -627,7 +631,7 @@ widget_select (Widget * w)
|
|||||||
void
|
void
|
||||||
widget_set_bottom (Widget * w)
|
widget_set_bottom (Widget * w)
|
||||||
{
|
{
|
||||||
widget_reorder (dlg_find (DIALOG (w->owner), w), FALSE);
|
widget_reorder (widget_find (WIDGET (w->owner), w), FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
@ -646,6 +650,56 @@ widget_overlapped (const Widget * a, const Widget * b)
|
|||||||
|| (a->x >= b->x + b->cols) || (b->y >= a->y + a->lines) || (a->y >= b->y + b->lines));
|
|| (a->x >= b->x + b->cols) || (b->y >= a->y + a->lines) || (a->y >= b->y + b->lines));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Default callback function to find widget.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param what widget to find
|
||||||
|
*
|
||||||
|
* @return holder of @what if widget is @what, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
GList *
|
||||||
|
widget_default_find (const Widget * w, const Widget * what)
|
||||||
|
{
|
||||||
|
return (w != what
|
||||||
|
|| w->owner == NULL) ? NULL : g_list_find (CONST_GROUP (w->owner)->widgets, what);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default callback function to find widget by widget type using widget callback.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param cb widget callback
|
||||||
|
*
|
||||||
|
* @return @w if widget callback is @cb, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
Widget *
|
||||||
|
widget_default_find_by_type (const Widget * w, widget_cb_fn cb)
|
||||||
|
{
|
||||||
|
return (w->callback == cb ? WIDGET (w) : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Default callback function to find widget by widget ID.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param id widget ID
|
||||||
|
*
|
||||||
|
* @return @w if widget id is equal to @id, NULL otherwise
|
||||||
|
*/
|
||||||
|
|
||||||
|
Widget *
|
||||||
|
widget_default_find_by_id (const Widget * w, unsigned long id)
|
||||||
|
{
|
||||||
|
return (w->id == id ? WIDGET (w) : NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
/* get mouse pointer location within widget */
|
/* get mouse pointer location within widget */
|
||||||
|
|
||||||
|
@ -146,6 +146,10 @@ struct Widget
|
|||||||
mouse_msg_t last_msg; /* The previous event type processed. */
|
mouse_msg_t last_msg; /* The previous event type processed. */
|
||||||
int last_buttons_down;
|
int last_buttons_down;
|
||||||
} mouse;
|
} mouse;
|
||||||
|
|
||||||
|
GList *(*find) (const Widget * w, const Widget * what);
|
||||||
|
Widget *(*find_by_type) (const Widget * w, widget_cb_fn cb);
|
||||||
|
Widget *(*find_by_id) (const Widget * w, unsigned long id);
|
||||||
};
|
};
|
||||||
|
|
||||||
/* structure for label (caption) with hotkey, if original text does not contain
|
/* structure for label (caption) with hotkey, if original text does not contain
|
||||||
@ -197,6 +201,10 @@ void widget_replace (Widget * old, Widget * new);
|
|||||||
void widget_select (Widget * w);
|
void widget_select (Widget * w);
|
||||||
void widget_set_bottom (Widget * w);
|
void widget_set_bottom (Widget * w);
|
||||||
|
|
||||||
|
GList *widget_default_find (const Widget * w, const Widget * what);
|
||||||
|
Widget *widget_default_find_by_type (const Widget * w, widget_cb_fn cb);
|
||||||
|
Widget *widget_default_find_by_id (const Widget * w, unsigned long id);
|
||||||
|
|
||||||
/* get mouse pointer location within widget */
|
/* get mouse pointer location within widget */
|
||||||
Gpm_Event mouse_get_local (const Gpm_Event * global, const Widget * w);
|
Gpm_Event mouse_get_local (const Gpm_Event * global, const Widget * w);
|
||||||
gboolean mouse_global_in_widget (const Gpm_Event * event, const Widget * w);
|
gboolean mouse_global_in_widget (const Gpm_Event * event, const Widget * w);
|
||||||
@ -251,4 +259,54 @@ widget_get_state (const Widget * w, widget_state_t state)
|
|||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find widget.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param what widget to find
|
||||||
|
*
|
||||||
|
* @return result of @w->find()
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline GList *
|
||||||
|
widget_find (const Widget * w, const Widget * what)
|
||||||
|
{
|
||||||
|
return w->find (w, what);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find widget by widget type using widget callback.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param cb widget callback
|
||||||
|
*
|
||||||
|
* @return result of @w->find_by_type()
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline Widget *
|
||||||
|
widget_find_by_type (const Widget * w, widget_cb_fn cb)
|
||||||
|
{
|
||||||
|
return w->find_by_type (w, cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* Find widget by widget ID.
|
||||||
|
*
|
||||||
|
* @param w widget
|
||||||
|
* @param id widget ID
|
||||||
|
*
|
||||||
|
* @return result of @w->find_by_id()
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline Widget *
|
||||||
|
widget_find_by_id (const Widget * w, unsigned long id)
|
||||||
|
{
|
||||||
|
return w->find_by_id (w, id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
#endif /* MC__WIDGET_INTERNAL_H */
|
#endif /* MC__WIDGET_INTERNAL_H */
|
||||||
|
@ -3394,7 +3394,7 @@ dview_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
return dview_execute_cmd (NULL, parm);
|
return dview_execute_cmd (NULL, parm);
|
||||||
|
|
||||||
case MSG_VALIDATE:
|
case MSG_VALIDATE:
|
||||||
dview = (WDiff *) find_widget_type (h, dview_callback);
|
dview = (WDiff *) widget_find_by_type (CONST_WIDGET (h), dview_callback);
|
||||||
/* don't stop the dialog before final decision */
|
/* don't stop the dialog before final decision */
|
||||||
widget_set_state (w, WST_ACTIVE, TRUE);
|
widget_set_state (w, WST_ACTIVE, TRUE);
|
||||||
if (dview_ok_to_exit (dview))
|
if (dview_ok_to_exit (dview))
|
||||||
@ -3417,7 +3417,7 @@ dview_get_title (const WDialog * h, size_t len)
|
|||||||
size_t len1;
|
size_t len1;
|
||||||
GString *title;
|
GString *title;
|
||||||
|
|
||||||
dview = (const WDiff *) find_widget_type (h, dview_callback);
|
dview = (const WDiff *) widget_find_by_type (CONST_WIDGET (h), dview_callback);
|
||||||
len1 = (len - str_term_width1 (_("Diff:")) - strlen (modified) - 3) / 2;
|
len1 = (len - str_term_width1 (_("Diff:")) - strlen (modified) - 3) / 2;
|
||||||
|
|
||||||
title = g_string_sized_new (len);
|
title = g_string_sized_new (len);
|
||||||
|
@ -156,7 +156,7 @@ edit_save_mode_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm
|
|||||||
{
|
{
|
||||||
Widget *ww;
|
Widget *ww;
|
||||||
|
|
||||||
ww = dlg_find_by_id (DIALOG (w), edit_save_mode_input_id);
|
ww = widget_find_by_id (w, edit_save_mode_input_id);
|
||||||
widget_disable (ww, RADIO (sender)->sel != 2);
|
widget_disable (ww, RADIO (sender)->sel != 2);
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
}
|
}
|
||||||
|
@ -1272,7 +1272,7 @@ find_editor (const WDialog * h)
|
|||||||
|
|
||||||
if (edit_widget_is_editor (CONST_WIDGET (g->current->data)))
|
if (edit_widget_is_editor (CONST_WIDGET (g->current->data)))
|
||||||
return (WEdit *) g->current->data;
|
return (WEdit *) g->current->data;
|
||||||
return (WEdit *) find_widget_type (h, edit_callback);
|
return (WEdit *) widget_find_by_type (CONST_WIDGET (h), edit_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -136,7 +136,7 @@ configure_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, voi
|
|||||||
Widget *ww;
|
Widget *ww;
|
||||||
|
|
||||||
/* input line */
|
/* input line */
|
||||||
ww = dlg_find_by_id (DIALOG (w), configure_time_out_id);
|
ww = widget_find_by_id (w, configure_time_out_id);
|
||||||
widget_disable (ww, not_single);
|
widget_disable (ww, not_single);
|
||||||
|
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
@ -274,8 +274,6 @@ sel_skin_button (WButton * button, int action)
|
|||||||
static cb_ret_t
|
static cb_ret_t
|
||||||
panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
|
panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data)
|
||||||
{
|
{
|
||||||
WDialog *h = DIALOG (w);
|
|
||||||
|
|
||||||
switch (msg)
|
switch (msg)
|
||||||
{
|
{
|
||||||
case MSG_NOTIFY:
|
case MSG_NOTIFY:
|
||||||
@ -284,10 +282,10 @@ panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
WCheck *ch;
|
WCheck *ch;
|
||||||
WInput *in1, *in2, *in3;
|
WInput *in1, *in2, *in3;
|
||||||
|
|
||||||
in1 = INPUT (dlg_find_by_id (h, panel_user_format_id));
|
in1 = INPUT (widget_find_by_id (w, panel_user_format_id));
|
||||||
in2 = INPUT (dlg_find_by_id (h, panel_brief_cols_id));
|
in2 = INPUT (widget_find_by_id (w, panel_brief_cols_id));
|
||||||
ch = CHECK (dlg_find_by_id (h, mini_user_status_id));
|
ch = CHECK (widget_find_by_id (w, mini_user_status_id));
|
||||||
in3 = INPUT (dlg_find_by_id (h, mini_user_format_id));
|
in3 = INPUT (widget_find_by_id (w, mini_user_format_id));
|
||||||
|
|
||||||
if (!ch->state)
|
if (!ch->state)
|
||||||
input_assign_text (in3, status_format[RADIO (sender)->sel]);
|
input_assign_text (in3, status_format[RADIO (sender)->sel]);
|
||||||
@ -303,7 +301,7 @@ panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
{
|
{
|
||||||
WInput *in;
|
WInput *in;
|
||||||
|
|
||||||
in = INPUT (dlg_find_by_id (h, mini_user_format_id));
|
in = INPUT (widget_find_by_id (w, mini_user_format_id));
|
||||||
|
|
||||||
if (CHECK (sender)->state)
|
if (CHECK (sender)->state)
|
||||||
{
|
{
|
||||||
@ -314,7 +312,7 @@ panel_listing_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
{
|
{
|
||||||
WRadio *r;
|
WRadio *r;
|
||||||
|
|
||||||
r = RADIO (dlg_find_by_id (h, panel_list_formats_id));
|
r = RADIO (widget_find_by_id (w, panel_list_formats_id));
|
||||||
widget_disable (WIDGET (in), TRUE);
|
widget_disable (WIDGET (in), TRUE);
|
||||||
input_assign_text (in, status_format[r->sel]);
|
input_assign_text (in, status_format[r->sel]);
|
||||||
}
|
}
|
||||||
@ -407,7 +405,7 @@ confvfs_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void
|
|||||||
Widget *wi;
|
Widget *wi;
|
||||||
|
|
||||||
/* input */
|
/* input */
|
||||||
wi = dlg_find_by_id (DIALOG (w), ftpfs_proxy_host_id);
|
wi = widget_find_by_id (w, ftpfs_proxy_host_id);
|
||||||
widget_disable (wi, not_use);
|
widget_disable (wi, not_use);
|
||||||
return MSG_HANDLED;
|
return MSG_HANDLED;
|
||||||
}
|
}
|
||||||
|
@ -1332,9 +1332,9 @@ sync_tree (const vfs_path_t * vpath)
|
|||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
WTree *
|
WTree *
|
||||||
find_tree (WDialog * h)
|
find_tree (const WDialog * h)
|
||||||
{
|
{
|
||||||
return (WTree *) find_widget_type (h, tree_callback);
|
return (WTree *) widget_find_by_type (CONST_WIDGET (h), tree_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------------------------------- */
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
@ -29,7 +29,7 @@ const vfs_path_t *tree_selected_name (const WTree * tree);
|
|||||||
|
|
||||||
void sync_tree (const vfs_path_t * vpath);
|
void sync_tree (const vfs_path_t * vpath);
|
||||||
|
|
||||||
WTree *find_tree (WDialog * h);
|
WTree *find_tree (const WDialog * h);
|
||||||
|
|
||||||
/*** inline functions ****************************************************************************/
|
/*** inline functions ****************************************************************************/
|
||||||
#endif /* MC__TREE_H */
|
#endif /* MC__TREE_H */
|
||||||
|
@ -784,9 +784,9 @@ mcview_dialog_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm,
|
|||||||
return mcview_execute_cmd (NULL, parm);
|
return mcview_execute_cmd (NULL, parm);
|
||||||
|
|
||||||
case MSG_VALIDATE:
|
case MSG_VALIDATE:
|
||||||
view = (WView *) find_widget_type (h, mcview_callback);
|
view = (WView *) widget_find_by_type (w, mcview_callback);
|
||||||
/* don't stop the dialog before final decision */
|
/* don't stop the dialog before final decision */
|
||||||
widget_set_state (WIDGET (h), WST_ACTIVE, TRUE);
|
widget_set_state (w, WST_ACTIVE, TRUE);
|
||||||
if (mcview_ok_to_quit (view))
|
if (mcview_ok_to_quit (view))
|
||||||
dlg_stop (h);
|
dlg_stop (h);
|
||||||
else
|
else
|
||||||
|
@ -375,12 +375,14 @@ mcview_eol (WView * view, off_t current)
|
|||||||
char *
|
char *
|
||||||
mcview_get_title (const WDialog * h, size_t len)
|
mcview_get_title (const WDialog * h, size_t len)
|
||||||
{
|
{
|
||||||
const WView *view = (const WView *) find_widget_type (h, mcview_callback);
|
const WView *view;
|
||||||
const char *modified = view->hexedit_mode && (view->change_list != NULL) ? "(*) " : " ";
|
const char *modified;
|
||||||
const char *file_label;
|
const char *file_label;
|
||||||
const char *view_filename;
|
const char *view_filename;
|
||||||
char *ret_str;
|
char *ret_str;
|
||||||
|
|
||||||
|
view = (const WView *) widget_find_by_type (CONST_WIDGET (h), mcview_callback);
|
||||||
|
modified = view->hexedit_mode && (view->change_list != NULL) ? "(*) " : " ";
|
||||||
view_filename = vfs_path_as_str (view->filename_vpath);
|
view_filename = vfs_path_as_str (view->filename_vpath);
|
||||||
|
|
||||||
len -= 4;
|
len -= 4;
|
||||||
|
@ -18,7 +18,8 @@ endif
|
|||||||
TESTS = \
|
TESTS = \
|
||||||
complete_engine \
|
complete_engine \
|
||||||
hotkey_equal \
|
hotkey_equal \
|
||||||
group_init_destroy
|
group_init_destroy \
|
||||||
|
widget_find_by_id
|
||||||
|
|
||||||
check_PROGRAMS = $(TESTS)
|
check_PROGRAMS = $(TESTS)
|
||||||
|
|
||||||
@ -30,3 +31,6 @@ hotkey_equal_SOURCES = \
|
|||||||
|
|
||||||
group_init_destroy_SOURCES = \
|
group_init_destroy_SOURCES = \
|
||||||
group_init_destroy.c
|
group_init_destroy.c
|
||||||
|
|
||||||
|
widget_find_by_id_SOURCES = \
|
||||||
|
widget_find_by_id.c
|
||||||
|
117
tests/lib/widget/widget_find_by_id.c
Normal file
117
tests/lib/widget/widget_find_by_id.c
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
/*
|
||||||
|
libmc - checks for search widget with requested ID
|
||||||
|
|
||||||
|
Copyright (C) 2020
|
||||||
|
The Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by:
|
||||||
|
Andrew Borodin <aborodin@vmail.ru>, 2020
|
||||||
|
|
||||||
|
This file is part of the Midnight Commander.
|
||||||
|
|
||||||
|
The Midnight Commander is free software: you can redistribute it
|
||||||
|
and/or modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the License,
|
||||||
|
or (at your option) any later version.
|
||||||
|
|
||||||
|
The Midnight Commander is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define TEST_SUITE_NAME "lib/widget"
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <check.h>
|
||||||
|
|
||||||
|
#include "lib/widget.h"
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
START_TEST (test_widget_find_by_id)
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
{
|
||||||
|
WGroup *g, *g0;
|
||||||
|
Widget *w0;
|
||||||
|
|
||||||
|
g = g_new0 (WGroup, 1);
|
||||||
|
group_init (g, 0, 0, 20, 20, NULL, NULL); /* ID = 0 */
|
||||||
|
|
||||||
|
g0 = g_new0 (WGroup, 1);
|
||||||
|
group_init (g0, 0, 0, 10, 10, NULL, NULL); /* ID = 1 */
|
||||||
|
group_add_widget (g, g0);
|
||||||
|
|
||||||
|
w0 = g_new0 (Widget, 1);
|
||||||
|
widget_init (w0, 0, 0, 5, 5, widget_default_callback, NULL); /* ID = 2 */
|
||||||
|
group_add_widget (g0, w0);
|
||||||
|
|
||||||
|
w0 = g_new0 (Widget, 1);
|
||||||
|
widget_init (w0, 5, 5, 5, 5, widget_default_callback, NULL); /* ID = 3 */
|
||||||
|
group_add_widget (g0, w0);
|
||||||
|
|
||||||
|
g0 = g_new0 (WGroup, 1);
|
||||||
|
group_init (g0, 10, 10, 10, 10, NULL, NULL); /* ID = 4 */
|
||||||
|
group_add_widget (g, g0);
|
||||||
|
|
||||||
|
w0 = g_new0 (Widget, 1);
|
||||||
|
widget_init (w0, 10, 10, 5, 5, widget_default_callback, NULL); /* ID = 5 */
|
||||||
|
group_add_widget (g0, w0);
|
||||||
|
|
||||||
|
w0 = g_new0 (Widget, 1);
|
||||||
|
widget_init (w0, 15, 15, 5, 5, widget_default_callback, NULL); /* ID = 6 */
|
||||||
|
group_add_widget (g0, w0);
|
||||||
|
|
||||||
|
w0 = g_new0 (Widget, 1);
|
||||||
|
widget_init (w0, 5, 5, 10, 10, widget_default_callback, NULL); /* ID = 7 */
|
||||||
|
group_add_widget (g, w0);
|
||||||
|
|
||||||
|
w0 = WIDGET (g);
|
||||||
|
|
||||||
|
fail_unless (widget_find_by_id (w0, 0) != NULL, "Not found ID=0");
|
||||||
|
fail_unless (widget_find_by_id (w0, 1) != NULL, "Not found ID=1");
|
||||||
|
fail_unless (widget_find_by_id (w0, 2) != NULL, "Not found ID=2");
|
||||||
|
fail_unless (widget_find_by_id (w0, 3) != NULL, "Not found ID=3");
|
||||||
|
fail_unless (widget_find_by_id (w0, 4) != NULL, "Not found ID=4");
|
||||||
|
fail_unless (widget_find_by_id (w0, 5) != NULL, "Not found ID=5");
|
||||||
|
fail_unless (widget_find_by_id (w0, 6) != NULL, "Not found ID=6");
|
||||||
|
fail_unless (widget_find_by_id (w0, 7) != NULL, "Not found ID=7");
|
||||||
|
fail_unless (widget_find_by_id (w0, 8) == NULL, "Found ID=8");
|
||||||
|
|
||||||
|
send_message (g, NULL, MSG_INIT, 0, NULL);
|
||||||
|
widget_destroy (w0);
|
||||||
|
}
|
||||||
|
/* *INDENT-OFF* */
|
||||||
|
END_TEST
|
||||||
|
/* *INDENT-ON* */
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
int number_failed;
|
||||||
|
|
||||||
|
Suite *s = suite_create (TEST_SUITE_NAME);
|
||||||
|
TCase *tc_core = tcase_create ("Core");
|
||||||
|
SRunner *sr;
|
||||||
|
|
||||||
|
/* Add new tests here: *************** */
|
||||||
|
tcase_add_test (tc_core, test_widget_find_by_id);
|
||||||
|
/* *********************************** */
|
||||||
|
|
||||||
|
suite_add_tcase (s, tc_core);
|
||||||
|
sr = srunner_create (s);
|
||||||
|
srunner_set_log (sr, "widget_find_by_id.log");
|
||||||
|
srunner_run_all (sr, CK_NORMAL);
|
||||||
|
number_failed = srunner_ntests_failed (sr);
|
||||||
|
srunner_free (sr);
|
||||||
|
return (number_failed == 0) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --------------------------------------------------------------------------------------------- */
|
Loading…
Reference in New Issue
Block a user