/* --------------- lists.c -------------- */ #include "dflat32/dflat.h" /* ----- set focus to the next sibling ----- */ void SetNextFocus (void) { if (inFocus != NULL) { DFWINDOW wnd1 = inFocus, pwnd; while (TRUE) { pwnd = GetParent(wnd1); if (NextWindow(wnd1) != NULL) wnd1 = NextWindow(wnd1); else if (pwnd != NULL) wnd1 = FirstWindow(pwnd); if (wnd1 == NULL || wnd1 == inFocus) { wnd1 = pwnd; break; } if (GetClass(wnd1) == STATUSBAR || GetClass(wnd1) == MENUBAR) continue; if (isVisible(wnd1)) break; } if (wnd1 != NULL) { while (wnd1->childfocus != NULL) wnd1 = wnd1->childfocus; if (wnd1->condition != ISCLOSING) DfSendMessage(wnd1, SETFOCUS, TRUE, 0); } } } /* ----- set focus to the previous sibling ----- */ void SetPrevFocus(void) { if (inFocus != NULL) { DFWINDOW wnd1 = inFocus, pwnd; while (TRUE) { pwnd = GetParent(wnd1); if (PrevWindow(wnd1) != NULL) wnd1 = PrevWindow(wnd1); else if (pwnd != NULL) wnd1 = LastWindow(pwnd); if (wnd1 == NULL || wnd1 == inFocus) { wnd1 = pwnd; break; } if (GetClass(wnd1) == STATUSBAR) continue; if (isVisible(wnd1)) break; } if (wnd1 != NULL) { while (wnd1->childfocus != NULL) wnd1 = wnd1->childfocus; if (wnd1->condition != ISCLOSING) DfSendMessage(wnd1, SETFOCUS, TRUE, 0); } } } /* ------- move a window to the end of its parents list ----- */ void ReFocus(DFWINDOW wnd) { if (GetParent(wnd) != NULL) { RemoveWindow(wnd); AppendWindow(wnd); ReFocus(GetParent(wnd)); } } /* ---- remove a window from the linked list ---- */ void RemoveWindow(DFWINDOW wnd) { if (wnd != NULL) { DFWINDOW pwnd = GetParent(wnd); if (PrevWindow(wnd) != NULL) NextWindow(PrevWindow(wnd)) = NextWindow(wnd); if (NextWindow(wnd) != NULL) PrevWindow(NextWindow(wnd)) = PrevWindow(wnd); if (pwnd != NULL) { if (wnd == FirstWindow(pwnd)) FirstWindow(pwnd) = NextWindow(wnd); if (wnd == LastWindow(pwnd)) LastWindow(pwnd) = PrevWindow(wnd); } } } /* ---- append a window to the linked list ---- */ void AppendWindow(DFWINDOW wnd) { if (wnd != NULL) { DFWINDOW pwnd = GetParent(wnd); if (pwnd != NULL) { if (FirstWindow(pwnd) == NULL) { FirstWindow(pwnd) = wnd; LastWindow(pwnd) = wnd; PrevWindow(wnd) = NULL; } else { NextWindow(LastWindow(pwnd)) = wnd; PrevWindow(wnd) = LastWindow(pwnd); LastWindow(pwnd) = wnd; } } NextWindow(wnd) = NULL; } } /* * if document windows and statusbar or menubar get the focus, * pass it on */ void SkipApplicationControls(void) { BOOL EmptyAppl = FALSE; int ct = 0; while (!EmptyAppl && inFocus != NULL) { DFCLASS cl = GetClass(inFocus); if (cl == MENUBAR || cl == STATUSBAR) { SetPrevFocus(); EmptyAppl = (cl == MENUBAR && ct++); } else break; } } /* EOF */