|
|
1.1 ! root 1: #include "cardfile.h" ! 2: ! 3: /*********************************************************************/ ! 4: /* Windows/PM Cardfile Shared Code */ ! 5: /* */ ! 6: /* (c) Copyright Microsoft Corp. 1987,1988 - All Rights Reserved */ ! 7: /*********************************************************************/ ! 8: ! 9: /*********************************************************************/ ! 10: /* The following shared code was developed from the original */ ! 11: /* Cardfile application. This code can be compiled to run under */ ! 12: /* either the Windows or the PM manager environment. All */ ! 13: /* functionality associated with bitmaps or printing has been */ ! 14: /* deleted. Some comments refering to these functions may still be */ ! 15: /* present in the code and should be disregarded. jw. */ ! 16: /*********************************************************************/ ! 17: ! 18: ! 19: /*********************************************************************/ ! 20: /* Dialog Conventions: */ ! 21: /* */ ! 22: /* WINWORD - Word in Windows; Long in PM */ ! 23: /* LOUSHORT - NULL in Windows; Standard meaning in PM */ ! 24: /* DLGRET - BOOL in Windows; Long in PM */ ! 25: /* DIALOGDEFAULT - return( FALSE ) in Windows; */ ! 26: /* WinDefDlgProc in PM */ ! 27: /*********************************************************************/ ! 28: ! 29: ! 30: /*********************************************************************/ ! 31: /* fnOpen - */ ! 32: /* The standard open dialog box. Although this code is */ ! 33: /* complicated and messy, it illustrates that through the use of the */ ! 34: /* dialog conventions defined in the shared code schema, dialog */ ! 35: /* procedures can be converted from Windows to PM with almost no */ ! 36: /* effort. */ ! 37: /* */ ! 38: /* Slightly different for PM and Windows */ ! 39: /*********************************************************************/ ! 40: ! 41: DLGRET far PASCAL fnOpen(hwnd, msg, wParam, lParam) ! 42: HWND hwnd; ! 43: unsigned msg; ! 44: WINWORD wParam; ! 45: DWORD lParam; ! 46: { ! 47: int item; ! 48: int cchFile, cchDir; ! 49: char *pchFile; ! 50: BOOL fWild; ! 51: char *pResultBuf = NULL; ! 52: char szNewName[PATHMAX]; ! 53: int len; ! 54: ! 55: switch (msg) ! 56: { ! 57: case WM_INITDIALOG: ! 58: SetDlgItemText(hwnd, IDD_EDIT, (LPSTR)"*.CRD"); ! 59: SendDlgItemMessage(hwnd, IDD_EDIT, EM_LIMITTEXT, 128, 0L); ! 60: ! 61: /* For PM, this function is simulated in pmbind.c */ ! 62: DlgDirList(hwnd, (LPSTR)"*.CRD", IDD_LISTBOX, IDD_PATH, ! 63: ATTRDIRLIST); ! 64: break; ! 65: ! 66: case WM_COMMAND: ! 67: #ifndef IN_WINDOWS ! 68: /* The only place in this dialog procedure which is #ifdef'ed! */ ! 69: ! 70: /* In PM, treat WM_CONTROL message the same as WM_COMMAND */ ! 71: /* message after moving Code from wParam to lParam */ ! 72: ! 73: case WM_CONTROL: ! 74: lParam = wParam; ! 75: #endif ! 76: switch (LOUSHORT(wParam)) ! 77: { ! 78: case IDOK: ! 79: LoadIt: ! 80: if (IsWindowEnabled(GetDlgItem(hwnd,IDOK))) ! 81: { ! 82: len = 7 + GetWindowTextLength( ! 83: GetDlgItem(hwnd, IDD_EDIT)); ! 84: if(pResultBuf = (char *)LocalAlloc(LPTR, len)) ! 85: { ! 86: GetDlgItemText(hwnd, IDD_EDIT, ! 87: (LPSTR)pResultBuf, len); ! 88: Mylstrcpy((LPSTR)szNewName, (LPSTR)pResultBuf); ! 89: ! 90: /* Append appropriate extension to */ ! 91: /* user's entry */ ! 92: DlgAddCorrectExtension(szNewName, TRUE); ! 93: ! 94: /* Try to open directory. If successful, fill */ ! 95: /* listbox with contents of new directory. */ ! 96: /* Otherwise, open datafile. */ ! 97: if (FSearchSpec(szNewName)) ! 98: { ! 99: if (DlgDirList(hwnd, (LPSTR)szNewName, ! 100: IDD_LISTBOX, IDD_PATH, ATTRDIRLIST)) ! 101: { ! 102: SetDlgItemText(hwnd, IDD_EDIT, ! 103: (LPSTR)szNewName); ! 104: break; ! 105: } ! 106: } ! 107: ! 108: DlgAddCorrectExtension(pResultBuf, FALSE); ! 109: /* If no directory list and filename contained */ ! 110: /* search spec, honk and don't try to open. */ ! 111: if (FSearchSpec(pResultBuf)) ! 112: { ! 113: MessageBeep(0); ! 114: break; ! 115: } ! 116: AnsiUpper((LPSTR)pResultBuf); ! 117: } ! 118: } ! 119: EndDialog(hwnd, (WORD)pResultBuf); ! 120: break; ! 121: ! 122: case IDCANCEL: ! 123: EndDialog(hwnd, NULL); ! 124: break; ! 125: ! 126: case IDD_LISTBOX: ! 127: switch (HIWORD(lParam)) ! 128: { ! 129: case LBN_SELCHANGE: ! 130: len = GetWindowTextLength( ! 131: GetDlgItem(hwnd, IDD_EDIT)); ! 132: if(pResultBuf = (char *)LocalAlloc(LPTR, ++len)) ! 133: { ! 134: GetDlgItemText(hwnd, IDD_EDIT, ! 135: (LPSTR)pResultBuf, len); ! 136: if (DlgDirSelect(hwnd, (LPSTR)szNewName, ! 137: IDD_LISTBOX)) ! 138: { ! 139: cchDir = Mylstrlen((LPSTR)szNewName); ! 140: cchFile = Mylstrlen((LPSTR)pResultBuf); ! 141: pchFile = pResultBuf+cchFile; ! 142: fWild = (*pchFile == '*' || ! 143: *pchFile == ':'); ! 144: while (pchFile > pResultBuf) ! 145: { ! 146: pchFile = FAR_TO_NEAR( AnsiPrev( ! 147: (LPSTR)(pResultBuf), (LPSTR)pchFile)); ! 148: if (*pchFile == '*' || *pchFile == '?') ! 149: fWild = TRUE; ! 150: if (*pchFile == '\\' || *pchFile == ':') ! 151: { ! 152: pchFile = FAR_TO_NEAR( AnsiNext( ! 153: (LPSTR)pchFile) ); ! 154: break; ! 155: } ! 156: } ! 157: if (fWild) ! 158: Mylstrcpy((LPSTR)szNewName + cchDir, ! 159: (LPSTR)pchFile); ! 160: else ! 161: Mylstrcpy((LPSTR)szNewName + cchDir, ! 162: (LPSTR)"*.CRD"); ! 163: } ! 164: SetDlgItemText(hwnd, IDD_EDIT, (LPSTR)szNewName); ! 165: LocalFree((HANDLE)pResultBuf); ! 166: } ! 167: break; ! 168: case LBN_DBLCLK: ! 169: goto LoadIt; /* go load it up */ ! 170: } ! 171: break; ! 172: case IDD_EDIT: ! 173: CheckOkEnable(hwnd, HIWORD(lParam)); ! 174: break; ! 175: default: ! 176: return(FALSE); ! 177: } ! 178: break; ! 179: default: ! 180: DIALOGDEFAULT( hwnd, msg, wParam, lParam ); ! 181: } ! 182: return(0L); ! 183: } ! 184: ! 185: ! 186: /*********************************************************************/ ! 187: /* DlgAddCorrectExtension - */ ! 188: /* Given filename or partial filename or search spec or partial */ ! 189: /* search spec, add appropriate extension. */ ! 190: /* */ ! 191: /* Same for PM and Windows */ ! 192: /*********************************************************************/ ! 193: ! 194: void DlgAddCorrectExtension(szEdit, fSearching) ! 195: PSTR szEdit; ! 196: BOOL fSearching; ! 197: { ! 198: register char *pchLast; ! 199: register char *pchT; ! 200: int ichExt; ! 201: BOOL fDone = FALSE; ! 202: int cchEdit; ! 203: ! 204: pchT = FAR_TO_NEAR( AnsiPrev((LPSTR)szEdit, ! 205: (LPSTR)(szEdit + (cchEdit = Mylstrlen((LPSTR)szEdit)))) ); ! 206: pchLast = pchT; ! 207: ! 208: if ((*pchLast == '.' && ! 209: *(AnsiPrev((LPSTR)szEdit, (LPSTR)pchLast)) == '.') && cchEdit == 2) ! 210: ichExt = 0; ! 211: else if (*pchLast == '\\' || *pchLast == ':') ! 212: ichExt = 1; ! 213: else { ! 214: ichExt = fSearching ? 0 : 2; ! 215: for (; pchT > szEdit; ! 216: pchT = FAR_TO_NEAR( AnsiPrev((LPSTR)szEdit, (LPSTR)pchT)) ) { ! 217: /* If we're not searching and we encounter a period, don't add ! 218: any extension. If we are searching, period is assumed to be ! 219: part of directory name, so go ahead and add extension. However, ! 220: if we are searching and find a search spec, do not add any ! 221: extension. */ ! 222: if (fSearching) { ! 223: if (*pchT == '*' || *pchT == '?') ! 224: return; ! 225: } else if (*pchT == '.'){ ! 226: return; ! 227: } ! 228: /* Quit when we get to beginning of last node. */ ! 229: if (*pchT == '\\') ! 230: break; ! 231: } ! 232: /* Special case hack fix since AnsiPrev can not return value */ ! 233: /* less than szEdit. If first char is wild card, return without */ ! 234: /* appending. */ ! 235: if (fSearching && (*pchT == '*' || *pchT == '?')) ! 236: return; ! 237: } ! 238: Mylstrcpy((LPSTR)(pchLast+1), (LPSTR)(szExtSave+ichExt)); ! 239: } ! 240: ! 241: /*********************************************************************/ ! 242: /* FSearchSpec - */ ! 243: /* Return TRUE iff 0 terminated string contains a '*' or '\' */ ! 244: /* */ ! 245: /* Same for PM and Windows */ ! 246: /*********************************************************************/ ! 247: ! 248: BOOL FSearchSpec(sz) ! 249: register PSTR sz; ! 250: { ! 251: for (; *sz;sz++) { ! 252: if (*sz == '*' || *sz == '?') ! 253: return TRUE; ! 254: } ! 255: return FALSE; ! 256: } ! 257: ! 258: /*********************************************************************/ ! 259: /* fnSave - */ ! 260: /* Dialog function for "Save as" . User must specify new name */ ! 261: /* of file. */ ! 262: /* */ ! 263: /* Slightly different for PM and Windows */ ! 264: /*********************************************************************/ ! 265: ! 266: DLGRET far PASCAL fnSave(hwnd, msg, wParam, lParam) ! 267: HWND hwnd; ! 268: unsigned msg; ! 269: WINWORD wParam; ! 270: DWORD lParam; ! 271: { ! 272: char *pResultBuf; ! 273: int len; ! 274: char rgch[128]; ! 275: char *pchFileName; ! 276: char *pchCmp; ! 277: char *pchTest; ! 278: char *PFileInPath(); ! 279: ! 280: switch (msg) ! 281: { ! 282: case WM_INITDIALOG: ! 283: /* Initialize Path field with current directory */ ! 284: DlgDirList(hwnd, (LPSTR)NULL, 0, IDD_PATH, 0); ! 285: ! 286: if (CurIFile[0]) ! 287: { ! 288: /* rgch gets current directory string, terminated */ ! 289: /* with "\\\0" */ ! 290: len = GetDlgItemText(hwnd, IDD_PATH, (LPSTR)rgch, 128); ! 291: if (rgch[len-1] != '\\') ! 292: { ! 293: rgch[len] = '\\'; ! 294: rgch[++len] = 0; ! 295: } ! 296: ! 297: /* Now see if path in reopen buffer matches current */ ! 298: /* directory. */ ! 299: pchFileName = CurIFile; ! 300: pchTest = PFileInPath(CurIFile); ! 301: pchCmp = rgch; ! 302: ! 303: while (pchFileName < pchTest) ! 304: { ! 305: if (*pchFileName != *pchCmp) ! 306: break; ! 307: pchCmp = (PSTR) AnsiNext(pchCmp); ! 308: pchFileName = (PSTR)AnsiNext(pchFileName); ! 309: } ! 310: ! 311: /* If paths don't match, reset pchFileName to point to */ ! 312: /* fully qualified path. (Otherwise, pchFileName already */ ! 313: /* points to filename. */ ! 314: if (*pchCmp || pchFileName < pchTest) ! 315: pchFileName = CurIFile; ! 316: ! 317: SetDlgItemText(hwnd, IDD_EDIT, (LPSTR)pchFileName); ! 318: } ! 319: else ! 320: EnableWindow(GetDlgItem(hwnd, IDOK), FALSE); ! 321: break; ! 322: ! 323: case WM_COMMAND: ! 324: #ifndef IN_WINDOWS ! 325: /* In PM, treat WM_CONTROL message the same as WM_COMMAND */ ! 326: /* message after moving Code from wParam to lParam */ ! 327: ! 328: case WM_CONTROL: ! 329: lParam = wParam; ! 330: #endif ! 331: switch (LOUSHORT(wParam)) ! 332: { ! 333: case IDOK: ! 334: if (IsWindowEnabled(GetDlgItem(hwnd, IDOK))) ! 335: { ! 336: len = 4+GetWindowTextLength( ! 337: GetDlgItem(hwnd, IDD_EDIT)); ! 338: if(pResultBuf = (char *)LocalAlloc(LPTR, ++len)) ! 339: { ! 340: GetDlgItemText(hwnd, IDD_EDIT, ! 341: (LPSTR)pResultBuf, len); ! 342: AppendExtension(pResultBuf, pResultBuf); ! 343: } ! 344: EndDialog(hwnd, (WORD)pResultBuf); ! 345: } ! 346: break; ! 347: ! 348: case IDCANCEL: ! 349: EndDialog(hwnd, NULL); ! 350: break; ! 351: case IDD_EDIT: ! 352: CheckOkEnable(hwnd, HIWORD(lParam)); ! 353: break; ! 354: default: ! 355: return(FALSE); ! 356: } ! 357: break; ! 358: default: ! 359: DIALOGDEFAULT( hwnd, msg, wParam, lParam ); ! 360: } ! 361: return(0L); ! 362: } ! 363: ! 364: /*********************************************************************/ ! 365: /* PFileInPath - */ ! 366: /* Given filename which may or maynot include path, return */ ! 367: /* pointer to filename (not including path part.) */ ! 368: /* */ ! 369: /* Same for PM and Windows */ ! 370: /*********************************************************************/ ! 371: ! 372: PSTR PFileInPath(sz) ! 373: PSTR sz; ! 374: { ! 375: PSTR pch; ! 376: ! 377: /* Strip path/drive specification from name if there is one */ ! 378: pch = FAR_TO_NEAR( AnsiPrev((LPSTR)sz, ! 379: (LPSTR)(sz + Mylstrlen((LPSTR)sz))) ); ! 380: while (pch > sz) { ! 381: pch = FAR_TO_NEAR( AnsiPrev((LPSTR)sz, (LPSTR)pch) ); ! 382: if (*pch == '\\' || *pch == ':') { ! 383: pch = FAR_TO_NEAR( AnsiNext((LPSTR)pch) ); ! 384: break; ! 385: } ! 386: } ! 387: return(pch); ! 388: } ! 389: ! 390: ! 391: /*********************************************************************/ ! 392: /* CheckOkEnable - */ ! 393: /* Either enables or disables OK button depending on whether edit */ ! 394: /* line is empty. */ ! 395: /* */ ! 396: /* Same for PM and Windows */ ! 397: /*********************************************************************/ ! 398: ! 399: void CheckOkEnable(hwnd, message) ! 400: HWND hwnd; ! 401: unsigned message; ! 402: { ! 403: if (message == EN_CHANGE) ! 404: EnableWindow(GetDlgItem(hwnd, IDOK), ! 405: GetWindowTextLength(GetDlgItem(hwnd, IDD_EDIT)) != 0); ! 406: } ! 407: ! 408: /*********************************************************************/ ! 409: /* fnAbout - */ ! 410: /* The about dialog box: very simple, only shows the number of */ ! 411: /* cards in the file. */ ! 412: /* */ ! 413: /* Same for PM and Windows */ ! 414: /*********************************************************************/ ! 415: ! 416: DLGRET far PASCAL fnAbout(hwnd, msg, wParam, lParam) ! 417: HWND hwnd; ! 418: unsigned msg; ! 419: WINWORD wParam; ! 420: DWORD lParam; ! 421: { ! 422: char buf[40]; ! 423: int len; ! 424: int id; ! 425: ! 426: switch (msg) ! 427: if (msg == WM_INITDIALOG) ! 428: { ! 429: case WM_INITDIALOG: ! 430: len = IntegerToAscii(cCards, buf); ! 431: if (cCards == 1) ! 432: id = IDS_CARD; ! 433: else ! 434: id = IDS_CARDS; ! 435: LoadString(hCardfileInstance, id, (LPSTR)(buf+len), 40-len); ! 436: SetDlgItemText(hwnd, IDD_EDIT, (LPSTR)buf); ! 437: return(TRUE); ! 438: ! 439: case WM_COMMAND: ! 440: #ifndef IN_WINDOWS ! 441: /* In PM, treat WM_CONTROL message the same as WM_COMMAND */ ! 442: /* after moving Code from wParam to lParam */ ! 443: ! 444: case WM_CONTROL: ! 445: lParam = wParam; ! 446: #endif ! 447: if (LOUSHORT(wParam) == IDOK) ! 448: { ! 449: EndDialog(hwnd, NULL); ! 450: DIALOGDEFAULT( hwnd, msg, wParam, lParam ); ! 451: } ! 452: break; ! 453: default: ! 454: DIALOGDEFAULT( hwnd, msg, wParam, lParam ); ! 455: } ! 456: return(0L); ! 457: } ! 458: ! 459: /*********************************************************************/ ! 460: /* IntegerToAscii - */ ! 461: /* Convert an int to ascii */ ! 462: /* */ ! 463: /* Same for PM and Windows */ ! 464: /*********************************************************************/ ! 465: ! 466: int IntegerToAscii(n, psz) ! 467: unsigned n; ! 468: char *psz; ! 469: { ! 470: char *pch = psz; ! 471: char ch; ! 472: int len; ! 473: ! 474: do ! 475: { ! 476: *pch++ = (char) (n % 10 + '0'); ! 477: n /= 10; ! 478: } ! 479: while (n > 0); ! 480: ! 481: len = pch - psz; ! 482: *pch-- = '\0'; ! 483: /* reverse the digits */ ! 484: ! 485: while (psz < pch) ! 486: { ! 487: ch = *psz; ! 488: *psz++ = *pch; ! 489: *pch-- = ch; ! 490: } ! 491: return(len); ! 492: } ! 493: ! 494: /*********************************************************************/ ! 495: /* DlgProc - */ ! 496: /* Generic dialog proc */ ! 497: /* */ ! 498: /* Slightly different for PM and Windows */ ! 499: /*********************************************************************/ ! 500: ! 501: DLGRET far PASCAL DlgProc(hDB, message, wParam, lParam) ! 502: HWND hDB; ! 503: unsigned message; ! 504: WINWORD wParam; ! 505: DWORD lParam; ! 506: { ! 507: char *pResultBuf; ! 508: char *pchInit; ! 509: int len; ! 510: ! 511: switch (message) ! 512: { ! 513: case WM_INITDIALOG: ! 514: /* initialize edit item based on which dialog it is */ ! 515: switch(DBcmd) ! 516: { ! 517: case DTHEADER: ! 518: pchInit = CurCardHead.line; ! 519: break; ! 520: case DTFIND: ! 521: pchInit = CurIFind; ! 522: break; ! 523: default: ! 524: pchInit = ""; ! 525: } ! 526: SetDlgItemText(hDB, IDD_EDIT, (LPSTR)pchInit); ! 527: SetFocus(GetDlgItem(hDB, IDD_EDIT)); ! 528: return(TRUE); ! 529: break; ! 530: ! 531: case WM_COMMAND: ! 532: #ifndef IN_WINDOWS ! 533: /* In PM, treat WM_CONTROL message the same as WM_COMMAND */ ! 534: /* message after moving Code from wParam to lParam */ ! 535: ! 536: case WM_CONTROL: ! 537: lParam = wParam; ! 538: #endif ! 539: /* all these get a single string */ ! 540: pResultBuf = NULL; ! 541: switch (LOUSHORT(wParam)) ! 542: { ! 543: case IDOK: ! 544: /* allocate buffer, read text and pass it back */ ! 545: len = GetWindowTextLength(GetDlgItem(hDB, IDD_EDIT)); ! 546: if (len || DBcmd == DTHEADER || DBcmd == DTADD) ! 547: if(pResultBuf = (char *)LocalAlloc(LPTR, ++len)) ! 548: GetDlgItemText(hDB, IDD_EDIT, ! 549: (LPSTR)pResultBuf, len); ! 550: break; ! 551: case IDCANCEL: ! 552: break; ! 553: default: ! 554: return(FALSE); ! 555: } ! 556: /* return pointer to buffer */ ! 557: EndDialog(hDB, (int)pResultBuf); ! 558: return(0L); ! 559: break; ! 560: default: ! 561: DIALOGDEFAULT( hDB, message, wParam, lParam ); ! 562: } ! 563: } ! 564: ! 565:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.