/* ** TuiGeneralWin.c ** This module supports general window behavior */ #include <curses.h> #include "defs.h" #include "tui.h" #include "tuiData.h" #include "tuiGeneralWin.h" /* ** local support functions */ static void _winResize PARAMS ((void)); /*********************** ** PUBLIC FUNCTIONS ***********************/ /* ** tuiRefreshWin() ** Refresh the window */ void #ifdef __STDC__ tuiRefreshWin ( TuiGenWinInfoPtr winInfo) #else tuiRefreshWin (winInfo) TuiGenWinInfoPtr winInfo; #endif { if (winInfo->type == DATA_WIN && winInfo->contentSize > 0) { int i; for (i = 0; (i < winInfo->contentSize); i++) { TuiGenWinInfoPtr dataItemWinPtr; dataItemWinPtr = &((TuiWinContent) winInfo->content)[i]->whichElement.dataWindow; if (m_genWinPtrNotNull (dataItemWinPtr) && dataItemWinPtr->handle != (WINDOW *) NULL) wrefresh (dataItemWinPtr->handle); } } else if (winInfo->type == CMD_WIN) { /* Do nothing */ } else { if (winInfo->handle != (WINDOW *) NULL) wrefresh (winInfo->handle); } return; } /* tuiRefreshWin */ /* ** tuiDelwin() ** Function to delete the curses window, checking for null */ void #ifdef __STDC__ tuiDelwin ( WINDOW * window) #else tuiDelwin (window) WINDOW *window; #endif { if (window != (WINDOW *) NULL) delwin (window); return; } /* tuiDelwin */ /* ** boxWin(). */ void #ifdef __STDC__ boxWin ( TuiGenWinInfoPtr winInfo, int highlightFlag) #else boxWin (winInfo, highlightFlag) TuiGenWinInfoPtr winInfo; int highlightFlag; #endif { if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL) { if (highlightFlag == HILITE) box (winInfo->handle, '|', '-'); else { /* wattron(winInfo->handle, A_DIM);*/ box (winInfo->handle, ':', '.'); /* wattroff(winInfo->handle, A_DIM);*/ } } return; } /* boxWin */ /* ** unhighlightWin(). */ void #ifdef __STDC__ unhighlightWin ( TuiWinInfoPtr winInfo) #else unhighlightWin (winInfo) TuiWinInfoPtr winInfo; #endif { if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL) { boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE); wrefresh (winInfo->generic.handle); m_setWinHighlightOff (winInfo); } } /* unhighlightWin */ /* ** highlightWin(). */ void #ifdef __STDC__ highlightWin ( TuiWinInfoPtr winInfo) #else highlightWin (winInfo) TuiWinInfoPtr winInfo; #endif { if (m_winPtrNotNull (winInfo) && winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL) { boxWin ((TuiGenWinInfoPtr) winInfo, HILITE); wrefresh (winInfo->generic.handle); m_setWinHighlightOn (winInfo); } } /* highlightWin */ /* ** checkAndDisplayHighlightIfNecessay */ void #ifdef __STDC__ checkAndDisplayHighlightIfNeeded ( TuiWinInfoPtr winInfo) #else checkAndDisplayHighlightIfNeeded (winInfo) TuiWinInfoPtr winInfo; #endif { if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN) { if (winInfo->isHighlighted) highlightWin (winInfo); else unhighlightWin (winInfo); } return; } /* checkAndDisplayHighlightIfNeeded */ /* ** makeWindow(). */ void #ifdef __STDC__ makeWindow ( TuiGenWinInfoPtr winInfo, int boxIt) #else makeWindow (winInfo, boxIt) TuiGenWinInfoPtr winInfo; int boxIt; #endif { WINDOW *handle; handle = newwin (winInfo->height, winInfo->width, winInfo->origin.y, winInfo->origin.x); winInfo->handle = handle; if (handle != (WINDOW *) NULL) { if (boxIt == BOX_WINDOW) boxWin (winInfo, NO_HILITE); winInfo->isVisible = TRUE; scrollok (handle, TRUE); tuiRefreshWin (winInfo); #ifndef FOR_TEST if ( /*!m_WinIsAuxillary(winInfo->type) && */ (winInfo->type != CMD_WIN) && (winInfo->content == (OpaquePtr) NULL)) { mvwaddstr (handle, 1, 1, winName (winInfo)); tuiRefreshWin (winInfo); } #endif /*FOR_TEST*/ } return; } /* makeWindow */ /* ** tuiClearWin(). ** Clear the window of all contents without calling wclear. */ void #ifdef __STDC__ tuiClearWin ( TuiGenWinInfoPtr winInfo) #else tuiClearWin (winInfo) TuiGenWinInfoPtr winInfo; #endif { if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL) { int curRow, curCol; for (curRow = 0; (curRow < winInfo->height); curRow++) for (curCol = 0; (curCol < winInfo->width); curCol++) mvwaddch (winInfo->handle, curRow, curCol, ' '); tuiRefreshWin (winInfo); } return; } /* tuiClearWin */ /* ** makeVisible(). ** We can't really make windows visible, or invisible. So we ** have to delete the entire window when making it visible, ** and create it again when making it visible. */ void #ifdef __STDC__ makeVisible ( TuiGenWinInfoPtr winInfo, int visible) #else makeVisible (winInfo, visible) TuiGenWinInfoPtr winInfo; int visible; #endif { /* Don't tear down/recreate command window */ if (winInfo->type == CMD_WIN) return; if (visible) { if (!winInfo->isVisible) { makeWindow ( winInfo, (winInfo->type != CMD_WIN && !m_winIsAuxillary (winInfo->type))); winInfo->isVisible = TRUE; } tuiRefreshWin (winInfo); } else if (!visible && winInfo->isVisible && winInfo->handle != (WINDOW *) NULL) { winInfo->isVisible = FALSE; tuiClearWin (winInfo); tuiDelwin (winInfo->handle); winInfo->handle = (WINDOW *) NULL; } return; } /* makeVisible */ /* ** makeAllVisible(). ** Makes all windows invisible (except the command and locator windows) */ void #ifdef __STDC__ makeAllVisible ( int visible) #else makeAllVisible (visible) int visible; #endif { int i; for (i = 0; i < MAX_MAJOR_WINDOWS; i++) { if (m_winPtrNotNull (winList[i]) && ((winList[i])->generic.type) != CMD_WIN) { if (m_winIsSourceType ((winList[i])->generic.type)) makeVisible ((winList[i])->detail.sourceInfo.executionInfo, visible); makeVisible ((TuiGenWinInfoPtr) winList[i], visible); } } return; } /* makeAllVisible */ /* ** scrollWinForward */ void #ifdef __STDC__ scrollWinForward ( TuiGenWinInfoPtr winInfo, int numLines) #else scrollWinForward (winInfo, numLines) TuiGenWinInfoPtr winInfo; int numLines; #endif { if (winInfo->content != (OpaquePtr) NULL && winInfo->lastVisibleLine < winInfo->contentSize - 1) { int i, firstLine, newLastLine; firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1; if (winInfo->lastVisibleLine + numLines > winInfo->contentSize) newLastLine = winInfo->contentSize - 1; else newLastLine = winInfo->lastVisibleLine + numLines - 1; for (i = (newLastLine - winInfo->viewportHeight); (i <= newLastLine); i++) { TuiWinElementPtr line; int lineHeight; line = (TuiWinElementPtr) winInfo->content[i]; if (line->highlight) wstandout (winInfo->handle); mvwaddstr (winInfo->handle, i - (newLastLine - winInfo->viewportHeight), 1, displayableWinContentOf (winInfo, line)); if (line->highlight) wstandend (winInfo->handle); lineHeight = winElementHeight (winInfo, line); newLastLine += (lineHeight - 1); } winInfo->lastVisibleLine = newLastLine; } return; } /* scrollWinForward */ /* ** scrollWinBackward */ void #ifdef __STDC__ scrollWinBackward ( TuiGenWinInfoPtr winInfo, int numLines) #else scrollWinBackward (winInfo, numLines) TuiGenWinInfoPtr winInfo; int numLines; #endif { if (winInfo->content != (OpaquePtr) NULL && (winInfo->lastVisibleLine - winInfo->viewportHeight) > 0) { int i, newLastLine, firstLine; firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1; if ((firstLine - numLines) < 0) newLastLine = winInfo->viewportHeight - 1; else newLastLine = winInfo->lastVisibleLine - numLines + 1; for (i = newLastLine - winInfo->viewportHeight; (i <= newLastLine); i++) { TuiWinElementPtr line; int lineHeight; line = (TuiWinElementPtr) winInfo->content[i]; if (line->highlight) wstandout (winInfo->handle); mvwaddstr (winInfo->handle, i - (newLastLine - winInfo->viewportHeight), 1, displayableWinContentOf (winInfo, line)); if (line->highlight) wstandend (winInfo->handle); lineHeight = winElementHeight (winInfo, line); newLastLine += (lineHeight - 1); } winInfo->lastVisibleLine = newLastLine; } return; } /* scrollWinBackward */ /* ** refreshAll(). ** Function to refresh all the windows currently displayed */ void #ifdef __STDC__ refreshAll ( TuiWinInfoPtr * list) #else refreshAll (list) TuiWinInfoPtr *list; #endif { TuiWinType type; TuiGenWinInfoPtr locator = locatorWinInfoPtr (); for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++) { if (list[type]->generic.isVisible) { if (type == SRC_WIN || type == DISASSEM_WIN) { touchwin (list[type]->detail.sourceInfo.executionInfo->handle); tuiRefreshWin (list[type]->detail.sourceInfo.executionInfo); } touchwin (list[type]->generic.handle); tuiRefreshWin (&list[type]->generic); } } if (locator->isVisible) { touchwin (locator->handle); tuiRefreshWin (locator); } return; } /* refreshAll */ /********************************* ** Local Static Functions *********************************/