summaryrefslogtreecommitdiffstats
path: root/private/mvdm/wow16/write/diasubs.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/wow16/write/diasubs.c')
-rw-r--r--private/mvdm/wow16/write/diasubs.c606
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
+ }