3 ** This module supports general window behavior
10 #include "tuiGeneralWin.h"
14 ** local support functions
16 static void _winResize PARAMS ((void));
19 /***********************
21 ***********************/
29 TuiGenWinInfoPtr winInfo)
31 tuiRefreshWin (winInfo)
32 TuiGenWinInfoPtr winInfo;
35 if (winInfo->type == DATA_WIN && winInfo->contentSize > 0)
39 for (i = 0; (i < winInfo->contentSize); i++)
41 TuiGenWinInfoPtr dataItemWinPtr;
43 dataItemWinPtr = &((TuiWinContent)
44 winInfo->content)[i]->whichElement.dataWindow;
45 if (m_genWinPtrNotNull (dataItemWinPtr) &&
46 dataItemWinPtr->handle != (WINDOW *) NULL)
47 wrefresh (dataItemWinPtr->handle);
50 else if (winInfo->type == CMD_WIN)
56 if (winInfo->handle != (WINDOW *) NULL)
57 wrefresh (winInfo->handle);
66 ** Function to delete the curses window, checking for null
77 if (window != (WINDOW *) NULL)
90 TuiGenWinInfoPtr winInfo,
93 boxWin (winInfo, highlightFlag)
94 TuiGenWinInfoPtr winInfo;
98 if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL)
100 if (highlightFlag == HILITE)
101 box (winInfo->handle, '|', '-');
104 /* wattron(winInfo->handle, A_DIM);*/
105 box (winInfo->handle, ':', '.');
106 /* wattroff(winInfo->handle, A_DIM);*/
120 TuiWinInfoPtr winInfo)
122 unhighlightWin (winInfo)
123 TuiWinInfoPtr winInfo;
126 if (m_winPtrNotNull (winInfo) && winInfo->generic.handle != (WINDOW *) NULL)
128 boxWin ((TuiGenWinInfoPtr) winInfo, NO_HILITE);
129 wrefresh (winInfo->generic.handle);
130 m_setWinHighlightOff (winInfo);
132 } /* unhighlightWin */
141 TuiWinInfoPtr winInfo)
143 highlightWin (winInfo)
144 TuiWinInfoPtr winInfo;
147 if (m_winPtrNotNull (winInfo) &&
148 winInfo->canHighlight && winInfo->generic.handle != (WINDOW *) NULL)
150 boxWin ((TuiGenWinInfoPtr) winInfo, HILITE);
151 wrefresh (winInfo->generic.handle);
152 m_setWinHighlightOn (winInfo);
158 ** checkAndDisplayHighlightIfNecessay
162 checkAndDisplayHighlightIfNeeded (
163 TuiWinInfoPtr winInfo)
165 checkAndDisplayHighlightIfNeeded (winInfo)
166 TuiWinInfoPtr winInfo;
169 if (m_winPtrNotNull (winInfo) && winInfo->generic.type != CMD_WIN)
171 if (winInfo->isHighlighted)
172 highlightWin (winInfo);
174 unhighlightWin (winInfo);
178 } /* checkAndDisplayHighlightIfNeeded */
187 TuiGenWinInfoPtr winInfo,
190 makeWindow (winInfo, boxIt)
191 TuiGenWinInfoPtr winInfo;
197 handle = newwin (winInfo->height,
201 winInfo->handle = handle;
202 if (handle != (WINDOW *) NULL)
204 if (boxIt == BOX_WINDOW)
205 boxWin (winInfo, NO_HILITE);
206 winInfo->isVisible = TRUE;
207 scrollok (handle, TRUE);
208 tuiRefreshWin (winInfo);
211 if ( /*!m_WinIsAuxillary(winInfo->type) && */
212 (winInfo->type != CMD_WIN) &&
213 (winInfo->content == (OpaquePtr) NULL))
215 mvwaddstr (handle, 1, 1, winName (winInfo));
216 tuiRefreshWin (winInfo);
227 ** Clear the window of all contents without calling wclear.
232 TuiGenWinInfoPtr winInfo)
234 tuiClearWin (winInfo)
235 TuiGenWinInfoPtr winInfo;
238 if (m_genWinPtrNotNull (winInfo) && winInfo->handle != (WINDOW *) NULL)
242 for (curRow = 0; (curRow < winInfo->height); curRow++)
243 for (curCol = 0; (curCol < winInfo->width); curCol++)
244 mvwaddch (winInfo->handle, curRow, curCol, ' ');
246 tuiRefreshWin (winInfo);
255 ** We can't really make windows visible, or invisible. So we
256 ** have to delete the entire window when making it visible,
257 ** and create it again when making it visible.
262 TuiGenWinInfoPtr winInfo,
265 makeVisible (winInfo, visible)
266 TuiGenWinInfoPtr winInfo;
270 /* Don't tear down/recreate command window */
271 if (winInfo->type == CMD_WIN)
276 if (!winInfo->isVisible)
280 (winInfo->type != CMD_WIN && !m_winIsAuxillary (winInfo->type)));
281 winInfo->isVisible = TRUE;
283 tuiRefreshWin (winInfo);
286 winInfo->isVisible && winInfo->handle != (WINDOW *) NULL)
288 winInfo->isVisible = FALSE;
289 tuiClearWin (winInfo);
290 tuiDelwin (winInfo->handle);
291 winInfo->handle = (WINDOW *) NULL;
300 ** Makes all windows invisible (except the command and locator windows)
307 makeAllVisible (visible)
313 for (i = 0; i < MAX_MAJOR_WINDOWS; i++)
315 if (m_winPtrNotNull (winList[i]) &&
316 ((winList[i])->generic.type) != CMD_WIN)
318 if (m_winIsSourceType ((winList[i])->generic.type))
319 makeVisible ((winList[i])->detail.sourceInfo.executionInfo,
321 makeVisible ((TuiGenWinInfoPtr) winList[i], visible);
326 } /* makeAllVisible */
335 TuiGenWinInfoPtr winInfo,
338 scrollWinForward (winInfo, numLines)
339 TuiGenWinInfoPtr winInfo;
343 if (winInfo->content != (OpaquePtr) NULL &&
344 winInfo->lastVisibleLine < winInfo->contentSize - 1)
346 int i, firstLine, newLastLine;
348 firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1;
349 if (winInfo->lastVisibleLine + numLines > winInfo->contentSize)
350 newLastLine = winInfo->contentSize - 1;
352 newLastLine = winInfo->lastVisibleLine + numLines - 1;
354 for (i = (newLastLine - winInfo->viewportHeight);
355 (i <= newLastLine); i++)
357 TuiWinElementPtr line;
360 line = (TuiWinElementPtr) winInfo->content[i];
362 wstandout (winInfo->handle);
363 mvwaddstr (winInfo->handle,
364 i - (newLastLine - winInfo->viewportHeight),
366 displayableWinContentOf (winInfo, line));
368 wstandend (winInfo->handle);
369 lineHeight = winElementHeight (winInfo, line);
370 newLastLine += (lineHeight - 1);
372 winInfo->lastVisibleLine = newLastLine;
376 } /* scrollWinForward */
385 TuiGenWinInfoPtr winInfo,
388 scrollWinBackward (winInfo, numLines)
389 TuiGenWinInfoPtr winInfo;
393 if (winInfo->content != (OpaquePtr) NULL &&
394 (winInfo->lastVisibleLine - winInfo->viewportHeight) > 0)
396 int i, newLastLine, firstLine;
398 firstLine = winInfo->lastVisibleLine - winInfo->viewportHeight + 1;
399 if ((firstLine - numLines) < 0)
400 newLastLine = winInfo->viewportHeight - 1;
402 newLastLine = winInfo->lastVisibleLine - numLines + 1;
404 for (i = newLastLine - winInfo->viewportHeight; (i <= newLastLine); i++)
406 TuiWinElementPtr line;
409 line = (TuiWinElementPtr) winInfo->content[i];
411 wstandout (winInfo->handle);
412 mvwaddstr (winInfo->handle,
413 i - (newLastLine - winInfo->viewportHeight),
415 displayableWinContentOf (winInfo, line));
417 wstandend (winInfo->handle);
418 lineHeight = winElementHeight (winInfo, line);
419 newLastLine += (lineHeight - 1);
421 winInfo->lastVisibleLine = newLastLine;
425 } /* scrollWinBackward */
430 ** Function to refresh all the windows currently displayed
435 TuiWinInfoPtr * list)
442 TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
444 for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
446 if (list[type]->generic.isVisible)
448 if (type == SRC_WIN || type == DISASSEM_WIN)
450 touchwin (list[type]->detail.sourceInfo.executionInfo->handle);
451 tuiRefreshWin (list[type]->detail.sourceInfo.executionInfo);
453 touchwin (list[type]->generic.handle);
454 tuiRefreshWin (&list[type]->generic);
457 if (locator->isVisible)
459 touchwin (locator->handle);
460 tuiRefreshWin (locator);
467 /*********************************
468 ** Local Static Functions
469 *********************************/