windows-nt/Source/XPSP1/NT/sdktools/mep/extens/mhelp/mhwin.c
2020-09-26 16:20:57 +08:00

141 lines
4 KiB
C

/*** mhwin - Help Windowing Code
*
* Copyright <C> 1988, Microsoft Corporation
*
* This module contains routines dealing with opening and closing the help
* display window.
*
* Revision History (most recent first):
*
* [] 12-Mar-1989 LN Split off of mhdisp.c
*
*************************************************************************/
#include <string.h> /* string functions */
#include "mh.h" /* help extension include file */
/*** OpenWin - Open a window on the help file, empty & make current.
*
* Entry:
* cLines = Desired size of window.
*
* Exit:
* Returns help file PWND
*
*************************************************************************/
PWND pascal near OpenWin (
ushort cLines
) {
PWND pWinCur; /* win handle for current win */
winContents wc; /* description of win contents */
int winSize; /* size of current window */
fInOpen = TRUE;
/*
** Get a handle to the current window, and a handle to the help window if up.
** If they are NOT the same, then save the "current" handle as the one the
** user had active prior to asking for help.
*/
GetEditorObject (RQ_WIN_HANDLE, 0, &pWinCur);
pWinHelp = FindHelpWin (FALSE);
if (pWinHelp != pWinCur)
pWinUser = pWinCur;
/*
** If no help window was found. Attempt to split the current window, if
** it's big enough, and that's requested
*/
if (!pWinHelp) {
GetEditorObject (RQ_WIN_CONTENTS | 0xff, pWinUser, &wc);
#if defined(PWB)
/*
** In PWB we just ask the editor to split the current window in half.
*/
fSplit = FALSE;
if ((wc.arcWin.ayBottom - wc.arcWin.ayTop >= 12) && fCreateWindow) {
fSplit = SplitWnd (pWinUser, FALSE, (wc.arcWin.ayBottom - wc.arcWin.ayTop)/2);
GetEditorObject (RQ_WIN_HANDLE, 0, &pWinHelp);
}
}
/*
** We have a window, of some sort, attempt to resize the window to the
** requested size.
*/
if (cLines) {
cLines += 2;
GetEditorObject (RQ_WIN_CONTENTS | 0xff, pWinHelp, &wc);
wc.arcWin.ayBottom = wc.arcWin.ayTop + cLines;
Resize (pWinHelp, wc.arcWin);
}
#else
/*
** Non PWB: Attempt to split the resulting current window to the desired size.
** by moving the cursor there, and executing arg window. Note that if the
** window had already existed, we won't even try to resize.
*/
winSize = wc.arcWin.ayBottom - wc.arcWin.ayTop;
if ( (cLines < 6)
|| (cLines > (ushort)(winSize - 6)))
cLines = (ushort)(winSize / 2);
if ((cLines > 6) && fCreateWindow) {
fSplit = SplitWnd(pWinUser, FALSE, (LINE)cLines);
//fSplit = SplitWnd(pWinUser, FALSE, wc.flPos.lin + (long)cLines);
// rjsa MoveCur (wc.flPos.col, wc.flPos.lin + (long)cLines);
// rjsa fSplit = fExecute ("arg window");
GetEditorObject (RQ_WIN_HANDLE, 0, &pWinHelp);
}
else
pWinHelp = pWinUser;
}
#endif
/*
** Set the window to be the current window, and move the help file to the
** top of that window's file list.
*/
SetEditorObject (RQ_WIN_CUR | 0xff, pWinHelp, 0);
DelFile (pHelp);
asserte (pFileToTop (pHelp));
fInOpen = FALSE;
return pWinHelp;
/* end OpenWin */}
/*** FindHelpWin - Locate window containing help & make current
*
* For all windows in the system, look for a window that has the help file
* in it. If found, set focus there.
*
* Entry:
* fSetCur = TRUE=> set help window current when found
*
* Globals:
* cWinSystem = returned number of windows in system
*
* Returns:
* pWin of help file
*
*************************************************************************/
PWND pascal near FindHelpWin (
flagType fSetCur
) {
int cWinSystem; /* number of windows in system */
winContents wc; /* description of win contents */
pWinHelp = 0;
for (cWinSystem=1; cWinSystem<=8; cWinSystem++) {
if (GetEditorObject (RQ_WIN_CONTENTS | cWinSystem, 0, &wc)) {
if (wc.pFile == pHelp) {
if (fSetCur) {
SetEditorObject (RQ_WIN_CUR | cWinSystem, 0, 0);
GetEditorObject (RQ_WIN_HANDLE, 0, &pWinHelp);
}
else
GetEditorObject (RQ_WIN_HANDLE | cWinSystem, 0, &pWinHelp);
break;
}
}
else
break;
}
return pWinHelp;
/* end FindHelpWin */}