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 *********************************/