reactos/rosapps/dflat32/lists.c
2003-06-19 02:48:13 +00:00

150 lines
3 KiB
C

/* --------------- lists.c -------------- */
#include "dflat.h"
/* ----- set focus to the next sibling ----- */
void DfSetNextFocus (void)
{
if (DfInFocus != NULL)
{
DFWINDOW wnd1 = DfInFocus, pwnd;
while (TRUE)
{
pwnd = DfGetParent(wnd1);
if (DfNextWindow(wnd1) != NULL)
wnd1 = DfNextWindow(wnd1);
else if (pwnd != NULL)
wnd1 = DfFirstWindow(pwnd);
if (wnd1 == NULL || wnd1 == DfInFocus)
{
wnd1 = pwnd;
break;
}
if (DfGetClass(wnd1) == DF_STATUSBAR || DfGetClass(wnd1) == DF_MENUBAR)
continue;
if (DfIsVisible(wnd1))
break;
}
if (wnd1 != NULL)
{
while (wnd1->childfocus != NULL)
wnd1 = wnd1->childfocus;
if (wnd1->condition != DF_ISCLOSING)
DfSendMessage(wnd1, DFM_SETFOCUS, TRUE, 0);
}
}
}
/* ----- set focus to the previous sibling ----- */
void DfSetPrevFocus(void)
{
if (DfInFocus != NULL)
{
DFWINDOW wnd1 = DfInFocus, pwnd;
while (TRUE)
{
pwnd = DfGetParent(wnd1);
if (DfPrevWindow(wnd1) != NULL)
wnd1 = DfPrevWindow(wnd1);
else if (pwnd != NULL)
wnd1 = DfLastWindow(pwnd);
if (wnd1 == NULL || wnd1 == DfInFocus)
{
wnd1 = pwnd;
break;
}
if (DfGetClass(wnd1) == DF_STATUSBAR)
continue;
if (DfIsVisible(wnd1))
break;
}
if (wnd1 != NULL)
{
while (wnd1->childfocus != NULL)
wnd1 = wnd1->childfocus;
if (wnd1->condition != DF_ISCLOSING)
DfSendMessage(wnd1, DFM_SETFOCUS, TRUE, 0);
}
}
}
/* ------- move a window to the end of its parents list ----- */
void DfReFocus(DFWINDOW wnd)
{
if (DfGetParent(wnd) != NULL)
{
DfRemoveWindow(wnd);
DfAppendWindow(wnd);
DfReFocus(DfGetParent(wnd));
}
}
/* ---- remove a window from the linked list ---- */
void DfRemoveWindow(DFWINDOW wnd)
{
if (wnd != NULL)
{
DFWINDOW pwnd = DfGetParent(wnd);
if (DfPrevWindow(wnd) != NULL)
DfNextWindow(DfPrevWindow(wnd)) = DfNextWindow(wnd);
if (DfNextWindow(wnd) != NULL)
DfPrevWindow(DfNextWindow(wnd)) = DfPrevWindow(wnd);
if (pwnd != NULL)
{
if (wnd == DfFirstWindow(pwnd))
DfFirstWindow(pwnd) = DfNextWindow(wnd);
if (wnd == DfLastWindow(pwnd))
DfLastWindow(pwnd) = DfPrevWindow(wnd);
}
}
}
/* ---- append a window to the linked list ---- */
void DfAppendWindow(DFWINDOW wnd)
{
if (wnd != NULL)
{
DFWINDOW pwnd = DfGetParent(wnd);
if (pwnd != NULL)
{
if (DfFirstWindow(pwnd) == NULL)
{
DfFirstWindow(pwnd) = wnd;
DfLastWindow(pwnd) = wnd;
DfPrevWindow(wnd) = NULL;
}
else
{
DfNextWindow(DfLastWindow(pwnd)) = wnd;
DfPrevWindow(wnd) = DfLastWindow(pwnd);
DfLastWindow(pwnd) = wnd;
}
}
DfNextWindow(wnd) = NULL;
}
}
/*
* if document windows and statusbar or menubar get the focus,
* pass it on
*/
void DfSkipApplicationControls(void)
{
BOOL EmptyAppl = FALSE;
int ct = 0;
while (!EmptyAppl && DfInFocus != NULL)
{
DFCLASS cl = DfGetClass(DfInFocus);
if (cl == DF_MENUBAR || cl == DF_STATUSBAR)
{
DfSetPrevFocus();
EmptyAppl = (cl == DF_MENUBAR && ct++);
}
else
break;
}
}
/* EOF */