diff options
Diffstat (limited to 'private/mvdm/wow16/write/diasubs.c')
-rw-r--r-- | private/mvdm/wow16/write/diasubs.c | 606 |
1 files changed, 606 insertions, 0 deletions
diff --git a/private/mvdm/wow16/write/diasubs.c b/private/mvdm/wow16/write/diasubs.c new file mode 100644 index 000000000..f6ed2c43c --- /dev/null +++ b/private/mvdm/wow16/write/diasubs.c @@ -0,0 +1,606 @@ +/************************************************************/ +/* Windows Write, Copyright 1985-1992 Microsoft Corporation */ +/************************************************************/ + +#define NOGDICAPMASKS +#define NORASTEROPS +#define NOVIRTUALKEYCODES +#define NOWINSTYLES +#define NOCLIPBOARD +#define NOGDI +#define NOSCROLL +#define NOOPENFILE +#define NOWNDCLASS +#define NOSYSMETRICS +#define NOTEXTMETRIC +#define NOICON +#define NOSHOWWINDOW +#define NOATOM +#define NOBITMAP +#define NOPEN +#define NOBRUSH +#define NODRAWTEXT +#define NOFONT +#define NOMETAFILE +#define NOSOUND +#define NOCOLOR +#define NOCOMM + +#include <windows.h> +#include "mw.h" +#include "cmddefs.h" +#include "str.h" +#include "editdefs.h" +#define NOKCCODES +#include "ch.h" +#include "dlgdefs.h" + +/*extern int idstrUndoBase;*/ +extern struct UAB vuab; +extern int vfCursorVisible; +extern HCURSOR vhcArrow; + + +#ifdef BOGUS /* use WPwFromItW3Id */ +BOOL FValidIntFromDlg(hDlg, idi, fSigned, wMin, wMax, pw, idpmt) +HANDLE hDlg; /* handle to dialog box */ +int idi; /* id of control in dialog box */ +BOOL fSigned; /* check for sign if true */ +int wMin, wMax; /* range of valid integer value */ +int * pw; /* location to put the int */ +int idpmt; /* error message number */ +{ + REG1 int wVal; + BOOL fValOk; + + *pw = wVal = GetDlgItemInt(hDlg, idi, (BOOL far *)&fValOk, fSigned); + if (fValOk) + { /* check range */ + if ((wVal < wMin) || (wVal > wMax)) + fValOk = false; + } + if (!fValOk) + { + Error(idpmt); + SelectIdiText(hDlg, idi); + SetFocus(GetDlgItem(hDlg, idi)); + } + return fValOk; +} /* FValidIntFromDlg */ +#endif + + +FPwPosIt(pw, hDlg, it) +HWND hDlg; /* handle to desired dialog box */ +int *pw; +int it; +{ + /*------------------------------------------------------------------- + Purpose: Positive integer dialog item. + --------------------------------------------------------------mck--*/ + return(WPwFromItW3IdFUt(pw, hDlg, it, 0, 32767, wNormal, IDPMTNPI, fFalse, 0)); +} + + +WPwFromItW3Id(pw, hDlg, it, wMin, wMax, wMask, id) +HWND hDlg; /* handle to desired dialog box */ +int *pw; /* Return value */ +int it; /* Item number */ +int wMin; /* Smallest and largest allowed values */ +int wMax; +int wMask; /* Bit mask for allowed variations */ +int id; /* Id of error string if bad */ +{ + /*------------------------------------------------------------------- + Purpose: General integer dialog item. + --------------------------------------------------------------mck--*/ + return(WPwFromItW3IdFUt(pw, hDlg, it, wMin, wMax, wMask, id, fFalse, 0)); +} + +FPdxaPosIt(pdxa, hDlg, it) +HWND hDlg; /* handle to desired dialog box */ +int *pdxa; +int it; +{ + /*------------------------------------------------------------------- + Purpose: Positive dxa dialog item. + --------------------------------------------------------------mck--*/ + extern int utCur; + + return(WPwFromItW3IdFUt(pdxa, hDlg, it, 0, 32767, wNormal, IDPMTNPDXA, fTrue, utCur)); +} + +FPdxaPosBIt(pdxa, hDlg, it) +HWND hDlg; /* handle to desired dialog box */ +int *pdxa; +int it; +{ + /*------------------------------------------------------------------- + Purpose: Positive dxa dialog item (blank allowed). + --------------------------------------------------------------mck--*/ + extern int utCur; + + return(WPwFromItW3IdFUt(pdxa, hDlg, it, 0, 32767, wBlank | wSpaces, IDPMTNPDXA, fTrue, utCur)); +} + +WPdxaFromItDxa2WId(pdxa, hDlg, it, dxaMin, dxaMax, wMask, id) +HWND hDlg; /* handle to desired dialog box */ +int *pdxa; /* Return value */ +int it; /* Dialog item number */ +int dxaMin; /* Range of allowable measurements */ +int dxaMax; +int wMask; /* Bit mask for allowed variations */ +int id; /* Error id */ +{ + /*------------------------------------------------------------------- + Purpose: General dxa dialog item. + --------------------------------------------------------------mck--*/ + extern int utCur; + + return(WPwFromItW3IdFUt(pdxa, hDlg, it, dxaMin, dxaMax, wMask, id, fTrue, utCur)); +} + +WPwFromItW3IdFUt(pw, hDlg, it, wMin, wMax, wMask, id, fDxa, ut) +int *pw; /* Return value */ +HWND hDlg; /* handle to desired dialog box */ +int it; /* Item number */ +int wMin; /* Smallest and largest allowed values */ +int wMax; +int wMask; /* Bit mask for allowed variations */ +int id; /* Id of error string if out of range */ +int fDxa; /* Parse as dxa (otherwise int) */ +int ut; /* Units to use as default if fDxa */ +{ + /*------------------------------------------------------------------- + Purpose: Parse the item in the current dialog. Must be a valid + integer or dxa in the given range. + Method: - Get the text string. + - Try parse as "". + - Try parse as string of all spaces + - Parse as a int/dxa (generic error if can't). + - Test for ".5". + - Compare with min and max. + - Try parse as "Auto". + - If out of bounds, use id to put up specific error + (with strings of min and max as parameters). + Returns: The return value may be used as a boolean or as a word. + fFalse (0) -> not parsed + wNormal (1) -> parsed normally + wBlank (2) -> parsed a null line + (*pw is valNil) + wAuto (4) -> parsed as "Auto" (*pw is 0) + wSpaces (16) -> parsed a line of all + spaces (*pw is valNil) + + !fDxa only: + wDouble (8) -> parsed with ".5" trailing + + Note: The interval [wMin..wMax] is closed. + Note: Return value is doubld the parsed value when wDouble. + Note: When wDouble, 2*wMin and 2*wMax must be valid ints. + Note: Numbers ending in .5 may have no trailing spaces. + History: + 6/18/86: Adapted for trailing kanji spaces --- yxy + 07/03/85: Added wSpaces return + 10/23/84: Fixed wAuto to return with *pw == 0. + 10/ 5/84: Added ut parameter. + 10/ 5/84: Added wMask and combined dxa and w parsing. + 9/26/84: Created. + --------------------------------------------------------------mck--*/ + + CHAR *pch; /* Parse pointer */ + CHAR *pchEnd; /* End of buffer */ + CHAR *pchError; /* Position of parse error */ + int fParsed; /* Parses as number/dxa */ + int fOverflow = fFalse; /* True if the number is parsed but it overflow */ + int wGood = wNormal;/* return after good range check */ + CHAR stItem[32]; +#ifdef AUTO_SPACING + CHAR szAuto[32]; /* Hold "Auto" string */ +#endif + + /* Get the dialog text */ + stItem[0] = GetDlgItemText(hDlg, it, (LPSTR)&stItem[1], sizeof(stItem)-1); + + /* See if blank (null line) */ + if (wMask & wBlank && stItem[0] == 0) + { + *pw = valNil; + return(wBlank); + } + + pch = &stItem[1]; + + /* See if all spaces */ + if (wMask & wBlank && wMask & wSpaces) + { + int fAllSpaces = fTrue; + + while (*pch != 0) + if (*pch++ != ' ') + { + fAllSpaces = fFalse; + break; + } + if (fAllSpaces == fTrue) + { + *pw = valNil; + return(wSpaces); + } + } + + pch = &stItem[1]; + pchEnd = pch + stItem[0]; + + /* It parses as a number ... */ + fParsed = fDxa ? FZaFromSs(pw, stItem+1, *stItem, ut) + : FPwParsePpchPch(pw, &pch, pchEnd, &fOverflow); + + if (!fDxa && wMask & wDouble) + { + (*pw) *= 2; + wMin *= 2; + wMax *= 2; + if (!fParsed) + { + /* Check if ".5" was reason for bad parse. */ + if (pch != pchEnd && *pch == '.') + { + pch++; + /* Allow "ddddd.0*" */ + pchError = pch; + if (FAllZeroPpchPch(&pchError, pchEnd)) + fParsed = fTrue; + /* Allow "ddddd.50*" */ + else if (pch != pchEnd && *pch == '5' && + (pch++, FAllZeroPpchPch(&pch, pchEnd))) + { + (*pw)++; + fParsed = fTrue; + wGood = wDouble; + } + /* Mark furthest error condition */ + else if (pchError > pch) + pch = pchError; + } + } + } + + if (fParsed && !fOverflow) + { + /* ... and in range */ + if (*pw >= wMin && *pw <= wMax) + return(wGood); +#ifdef ENABLE + /* ... but out of range - no matter what, we will use the supplied + id for the error message to be consistant */ + else + { + SelectIdiText(hDlg, it); + SetFocus(GetDlgItem(hDlg, it)); + Error(id); + return(fFalse); + } +#endif /* ENABLE */ + } + +#ifdef AUTO_SPACING + /* Invariant: Field does not parse as a number */ + + /* Try "Auto" */ + if (wMask & wAuto) + { + pch = PchFillPchId(szAuto, IDSTRVaries, sizeof(szAuto)); + *pch = '\0'; + stItem[stItem[0]+1] = '\0'; + if (WCompSz(szAuto, &stItem[1]) == 0) + { + *pw = 0; + return(wAuto); + } + } +#endif /* AUTO_SPACING */ + + /* All attempts failed - show user where he went wrong vis the attempted + number parse. */ + { + unsigned cchStart = fParsed ? 0 : pch - &stItem[1]; + unsigned cchEnd = 32767; + int idError = fDxa ? IDPMTNOTDXA : IDPMTNOTNUM; + + if (fParsed) + idError = id; /* reset idError if we just overflow or fail the range test */ + SendDlgItemMessage(hDlg, it, EM_SETSEL, (WORD)NULL, MAKELONG(cchStart, cchEnd)); + SetFocus(GetDlgItem(hDlg, it)); + Error(idError); + return(fFalse); + } +} + +FAllZeroPpchPch(ppch, pchMax) +CHAR **ppch; /* Bound of character buffer */ +CHAR *pchMax; +{ + /*------------------------------------------------------------------- + Purpose: Make sure all characters in buffer are spaces or 0's. + Returns: *ppch contains first bad character if fFalse returned. + History: + 6/18/86: Adapted for Kanji chars --- yxy + 10/ 9/84: Created. + --------------------------------------------------------------mck--*/ + CHAR *pch = *ppch; + + while (pch < pchMax) { + if (*pch == '0' || *pch == ' ') + pch++; + else { + *ppch = pch; + return(fFalse); + } + } + return(fTrue); +} + +FPwParsePpchPch(pw, ppch, pchMax, pfOverflow) +int *pw; +CHAR **ppch; +CHAR *pchMax; +int *pfOverflow; +{ + /*------------------------------------------------------------------- + Purpose: Parse a number in the given buffer. + Method: Scan for digits and ignore white space. + Returns: Character pointer past last one read in *ppch. + Number parsed is returned. Note that if only a prefix is + a valid number we return false, with *ppch set to the + first offending character. + Modification History: + 06/18/86 ---- Adapted for a kanji space char. --- yxy + --------------------------------------------------------------mck--*/ +#define smInit 0 +#define smDig 1 +#define smBody 2 + + CHAR *pch = *ppch; /* Local buffer pointer */ + unsigned int ch; /* Character being examined */ + int fNeg = fFalse; + DWORD dwNum = 0L; + int fError = fFalse; + int sm = smInit; + + *pfOverflow = fFalse; + while (!fError && !(*pfOverflow) && pch < pchMax) { + ch = *pch; + if (ch == chSpace) + pch++; + else + switch (sm) { + case smInit: + if (ch == '-') { + fNeg = fTrue; + pch++; + } + sm = smDig; + break; + case smDig: + if (isdigit(ch)) + sm = smBody; + else + fError = fTrue; + break; + case smBody: + if (isdigit(ch)) { + /* Overflow? */ + if ((dwNum = 10*dwNum + WFromCh(ch)) > 0x7FFF) + *pfOverflow = fTrue; + else + pch++; + } + else + fError = fTrue; + break; + } + } + + *ppch = pch; + *pw = (int)(fNeg ? -dwNum : dwNum); + return(!fError); +} + + +EnableOtherModeless(fEnable) +BOOL fEnable; +{ +extern HWND vhDlgChange; +extern HWND vhDlgFind; +extern HWND vhDlgRunningHead; + +/* Disable or enable other modeless dialog boxes according to fEnable */ + +if (IsWindow(vhDlgFind)) + { + EnableWindow(vhDlgFind, fEnable); + } +if (IsWindow(vhDlgChange)) + { + EnableWindow(vhDlgChange, fEnable); + } +if (IsWindow(vhDlgRunningHead)) + { + EnableWindow(vhDlgRunningHead, fEnable); + } +} + + +SelectIdiText(hDlg, idi) +HWND hDlg; +int idi; +{ /* For the dialog box with handle hDlg, highlight the text of the control + with ID idi */ + unsigned cchStart = 0; + unsigned cchEnd = 0x7fff; + SendDlgItemMessage(hDlg, idi, EM_SETSEL, (WORD)NULL, MAKELONG(cchStart, cchEnd)); +} /* end of SelectIdiText */ + + +#ifdef ENABLE +SetRgvalAgain(rgvalLocal, uac) +VAL rgvalLocal[]; +int uac; + { + extern VAL rgvalAgain[]; + + blt(rgvalLocal, rgvalAgain, ivalMax * cwVal); + switch (vuab.uac = uac) + { + case uacFormatPara: + case uacFormatChar: + case uacFormatSection: +/* idstrUndoBase = IDSTRUndoBase;*/ +/* SetUndoMenuStr(IDSTRUndoCom);*/ + SetUndoMenuStr(IDSTRUndoBase); + break; + } + } +#endif + + +#ifdef CASHMERE +PushRadioButton(hDlg, idiFirst, idiLast, idiPushed) +HWND hDlg; +int idiFirst, idiLast, idiPushed; +{ + /* + Push radio button idiPushed and unpush all others in the radio group + bounded by idiFirst and idiLast. + */ + int idi; + + for (idi = idiFirst; idi <= idiLast; idi++) + CheckDlgButton(hDlg, idi, idi == idiPushed); +} + + +SetRadValue(hDlg, idiFirst, idiLast, idiRad) +HWND hDlg; +int idiFirst, idiLast, idiRad; +{ + /* + Set the (zero-based) idiRad'th item in the radio group + bounded by idiFirst and idiLast. + */ + PushRadioButton(hDlg, idiFirst, idiLast, idiFirst + idiRad); +} + +#endif /* CASHMERE */ + + +#ifdef ENABLE +BOOL far PASCAL DialogConfirm(hDlg, message, wParam, lParam) +HWND hDlg; +unsigned message; +WORD wParam; +LONG lParam; + { + /* This is the Dialog function for all dialog boxes with only "Yes", "No", + and "Cancel" boxes; this includes: Save Large Scrap */ + + extern HWND vhWndMsgBoxParent; + + switch (message) + { + case WM_INITDIALOG: + EnableOtherModeless(FALSE); + break; + + case WM_SETVISIBLE: + if (wParam) + EndLongOp(vhcArrow); + return(FALSE); + + case WM_ACTIVATE: + if (wParam) + { + vhWndMsgBoxParent = hDlg; + } + if (vfCursorVisible) + ShowCursor(wParam); + return(FALSE); /* so that we leave the activate message to + the dialog manager to take care of setting the focus correctly */ + + case WM_COMMAND: + switch (wParam) + { + /* The default button is NO, make sure the call routine realized + that idiOk should be treated as idiNo. */ + case idiOk: + case idiCancel: + case idiYes: + case idiNo: + OurEndDialog(hDlg, wParam); + break; + default: + Assert(FALSE); + break; + } + break; + + default: + return(FALSE); + } + return(TRUE); + } /* end of DialogConfirm */ +#endif /* ENABLE */ + + +#ifndef WIN30 +/* DialogBox has been fixed so it automatically brings up the hourglass! */ + +OurDialogBox(hInst, lpstr, hWndParent, lpProc) +HANDLE hInst; +LPSTR lpstr; +HWND hWndParent; +FARPROC lpProc; +{ +StartLongOp(); +return(DialogBox(hInst, lpstr, hWndParent, lpProc)); +} +#endif + + +OurEndDialog(hDlg, wParam) + { + /* This routine does the same standard things Write does everytime it closes + a dialog box. */ + + extern HWND hParentWw; + extern long ropErase; + extern HWND vhWndMsgBoxParent; + extern HCURSOR vhcIBeam; + + RECT rc; + POINT pt; + +#ifdef NO_NEW_CALL + /* Close down the dialog box and erase it from the screen. We tried to let + Windows do the erasing, but... Its a long story. */ + GetWindowRect(hDlg, (LPRECT)&rc); + pt.x = pt.y = 0; + ClientToScreen(hParentWw, (LPPOINT)&pt); +#endif + + EndDialog(hDlg, wParam); + +#ifdef NO_NEW_CALL + PatBlt(GetDC(hParentWw), rc.left - pt.x, rc.top - pt.y, rc.right - rc.left, + rc.bottom - rc.top, ropErase); +#endif + + /* Enable any existing dialog boxes and indicate that any error messages + belong to the document window. */ + EnableOtherModeless(TRUE); + vhWndMsgBoxParent = (HWND)NULL; +#ifndef WIN30 + EndLongOp(vhcIBeam); /* See StartLongOp() above */ +#endif + } |