mirror of
https://github.com/reactos/reactos.git
synced 2024-10-31 20:02:55 +00:00
ec3b369d83
svn path=/trunk/; revision=4921
150 lines
3 KiB
C
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 */
|