|
|
1.1 ! root 1: #define NORASTEROPS ! 2: #define NOSYSCOMMANDS ! 3: #include "cardfile.h" ! 4: ! 5: /*********************************************************************/ ! 6: /* Windows/PM Cardfile Shared Code */ ! 7: /* */ ! 8: /* (c) Copyright Microsoft Corp. 1987,1988 - All Rights Reserved */ ! 9: /*********************************************************************/ ! 10: ! 11: /*********************************************************************/ ! 12: /* The following shared code was developed from the original */ ! 13: /* Cardfile application. This code can be compiled to run under */ ! 14: /* either the Windows or the PM manager environment. All */ ! 15: /* functionality associated with bitmaps or printing has been */ ! 16: /* deleted. Some comments refering to these functions may still be */ ! 17: /* present in the code and should be disregarded. jw. */ ! 18: /*********************************************************************/ ! 19: ! 20: ! 21: /*********************************************************************/ ! 22: /* CardfileInput - */ ! 23: /* This routine handles all the menu commands in Cardfile. */ ! 24: /* */ ! 25: /* Slightly different for PM and Windows */ ! 26: /*********************************************************************/ ! 27: ! 28: void CardfileInput(hWindow, event) ! 29: HWND hWindow; ! 30: int event; ! 31: { ! 32: PSTR pchBuf; ! 33: PSTR pchFile; ! 34: LPCARDHEADER lpCards; ! 35: unsigned long lTemp; ! 36: OFSTRUCT ofStruct; ! 37: ! 38: /* which menu command was it */ ! 39: switch(event) ! 40: { ! 41: case IDM_ABOUT: ! 42: /* about dialog box */ ! 43: PutUpDB(DTABOUT); ! 44: break; ! 45: case IDM_NEW: ! 46: /* create a new cardfile */ ! 47: if (fReadOnly) ! 48: break; ! 49: ! 50: /* make sure we save any changes the user made */ ! 51: if (!MaybeSaveFile()) ! 52: /* the user cancelled in the save changes dialog */ ! 53: break; ! 54: ! 55: ! 56: CurIFile[0] = 0; ! 57: CurIFind[0] = 0; ! 58: SetCaption(); ! 59: ! 60: /* get rid of the old temp file */ ! 61: Fdelete(TmpFile); ! 62: ! 63: /* create a new one */ ! 64: MakeTmpFile(); ! 65: ! 66: /* there's only one card in a new cardfile shrinking */ ! 67: /* or leaving the same size, so this should always work */ ! 68: GlobalReAlloc(hCards, (long)sizeof(CARDHEADER),GMEM_MOVEABLE); ! 69: cCards = 1; ! 70: iFirstCard = 0; ! 71: iTopCard = 0; ! 72: SetScrRangeAndPos(); ! 73: ! 74: /* Set up CurCardHead */ ! 75: MakeBlankCard(); ! 76: ! 77: /* Save blank card in data structure */ ! 78: lpCards = (LPCARDHEADER) GlobalLock(hCards); ! 79: *lpCards = CurCardHead; ! 80: GlobalUnlock(hCards); ! 81: ! 82: /* when in phone book mode, not making changes so must */ ! 83: /* save now */ ! 84: if (CardPhone == IDM_PHONEBOOK) ! 85: SaveCurrentCard(iFirstCard); ! 86: ! 87: /* make sure the window gets repainted */ ! 88: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 89: ! 90: /* clean file */ ! 91: fFileDirty = FALSE; ! 92: ! 93: /* make sure that any selection gets repainted for empty card */ ! 94: if (CardPhone == IDM_CARDFILE) ! 95: { ! 96: SetFocus(NULL); ! 97: SetFocus(hCardWnd); ! 98: } ! 99: break; ! 100: ! 101: case IDM_OPEN: ! 102: /* opening an existing file */ ! 103: /* make sure that any changes get saved */ ! 104: if(MaybeSaveFile()) ! 105: { ! 106: /* put up dialog box, and if user hits ok, open file */ ! 107: if (pchBuf = PutUpDB(DTOPEN)) ! 108: { ! 109: if (!DoOpen(pchBuf)) ! 110: SetCurCard(iFirstCard); ! 111: LocalFree((HANDLE)pchBuf); ! 112: } ! 113: else ! 114: /* user cancelled open dialog box */ ! 115: SetCurCard(iFirstCard); ! 116: } ! 117: break; ! 118: ! 119: case IDM_MERGE: ! 120: /* merge in another file */ ! 121: DoMerge(); ! 122: break; ! 123: ! 124: case IDM_SAVE: ! 125: case IDM_SAVEAS: ! 126: /* save the file */ ! 127: pchFile = NULL; ! 128: /* if doing a SAVE, and file is named, use current name */ ! 129: if (event == IDM_SAVE && CurIFile[0]) ! 130: pchFile = CurIFile; ! 131: /* else ask the user for a name */ ! 132: else if (GetNewFileName(&ofStruct)) ! 133: pchFile = ofStruct.szPathName; ! 134: /* if there is a name to save it to */ ! 135: if (pchFile) ! 136: { ! 137: /* get the current selection if in cardfile mode */ ! 138: if (CardPhone == IDM_CARDFILE) ! 139: lTemp = SendMessage(hCardWnd, EM_GETSEL, 0, 0L); ! 140: /* if in phonebook mode, or if in cardfile mode and */ ! 141: /* able to save the front card */ ! 142: if (CardPhone == IDM_PHONEBOOK || ! 143: SaveCurrentCard(iFirstCard)) ! 144: { ! 145: /* write the file out */ ! 146: if (WriteCardFile(pchFile)) ! 147: { ! 148: /* reset the caption */ ! 149: SetCaption(); ! 150: /* start a new temp file */ ! 151: Fdelete(TmpFile); ! 152: MakeTmpFile(); ! 153: } ! 154: /* if in cardfile mode */ ! 155: if (CardPhone == IDM_CARDFILE) ! 156: { ! 157: /* get contents of front card again, and set */ ! 158: /* selection*/ ! 159: SetCurCard(iFirstCard); ! 160: #ifdef IN_WINDOWS ! 161: /* Unfortunately, the parameters for the EM_SETSEL */ ! 162: /* message are reversed in PM and Windows - the */ ! 163: /* easiest way to deal with this is to have */ ! 164: /* separate SendMessage calls */ ! 165: ! 166: SendMessage(hCardWnd, EM_SETSEL, 0, lTemp); ! 167: #else ! 168: SendMessage(hCardWnd, EM_SETSEL, lTemp, 0L); ! 169: #endif ! 170: } ! 171: } ! 172: } ! 173: break; ! 174: ! 175: case IDM_CARDFILE: ! 176: case IDM_PHONEBOOK: ! 177: /* change display modes */ ! 178: if (event != CardPhone) ! 179: { ! 180: /* if changing to phonebook */ ! 181: if (event == IDM_PHONEBOOK) ! 182: { ! 183: /* save data in card */ ! 184: if (!SaveCurrentCard(iFirstCard)) ! 185: /* if it doesn't work, stop */ ! 186: break; ! 187: } ! 188: /* else changing to cardfile mode */ ! 189: else ! 190: { ! 191: /* set the text in the front card */ ! 192: SetCurCard(iFirstCard); ! 193: } ! 194: /* save new mode */ ! 195: CardPhone = event; ! 196: /* turn off old scroll bar */ ! 197: /* This define calls SetScrollRange and SetScrollPos */ ! 198: SCROLL_RANGE(hWindow, event == IDM_PHONEBOOK ? ! 199: SB_HORZ : SB_VERT, 0, 0, 0); ! 200: ! 201: /* if phonebook, get rid of edit control, otherwise reactivate */ ! 202: ShowWindow(hCardWnd, ! 203: event == IDM_PHONEBOOK ? HIDE_WINDOW : SHOW_OPENWINDOW); ! 204: ! 205: #ifdef IN_WINDOWS ! 206: /* In PM, the way in which the update is turned off is */ ! 207: /* through a function. There is no easy way to have */ ! 208: /* the SendMessage calls in Windows map into separate */ ! 209: /* functions in PM, so they are in #ifdefs */ ! 210: ! 211: SendMessage(hCardWnd, WM_SETREDRAW, ! 212: event == IDM_CARDFILE, 0L); ! 213: #else ! 214: WinEnableWindowUpdate( hCardWnd, event == IDM_CARDFILE ); ! 215: #endif ! 216: ! 217: /* if phonbook, make sure that topcard is valid */ ! 218: if (event == IDM_PHONEBOOK) ! 219: SetTopCard(); ! 220: /* set up new scroll bar */ ! 221: SetScrRangeAndPos(); ! 222: /* set focus to right place */ ! 223: SetFocus(event == IDM_PHONEBOOK ? hCardfileWnd : hCardWnd); ! 224: /* force a repaint */ ! 225: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 226: } ! 227: break; ! 228: case IDM_HEADER: ! 229: /* if in phone book mode, make sure information is in right place */ ! 230: if (CardPhone == IDM_PHONEBOOK) ! 231: { ! 232: SetCurCard(iFirstCard); ! 233: SaveCurrentCard(iFirstCard); ! 234: } ! 235: /* put up dialog box */ ! 236: if(pchBuf = PutUpDB(DTHEADER)) ! 237: { ! 238: /* save new header */ ! 239: Mylstrcpy((LPSTR)CurCardHead.line, (LPSTR)pchBuf); ! 240: ! 241: /* take it out of it's current position */ ! 242: DeleteCard(iFirstCard); ! 243: ! 244: /* and put it back in the right place */ ! 245: iFirstCard = AddCurCard(); ! 246: ! 247: SetScrRangeAndPos(); /* set position */ ! 248: fFileDirty = TRUE; ! 249: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 250: LocalFree((HANDLE)pchBuf); ! 251: } ! 252: break; ! 253: ! 254: case IDM_RESTORE: ! 255: /* get the old information */ ! 256: SetCurCard(iFirstCard); ! 257: InvalidateRect(hCardWnd, (LPRECT)NULL, TRUE); ! 258: break; ! 259: ! 260: case IDM_CUT: ! 261: case IDM_COPY: ! 262: DoCutCopy(event); ! 263: break; ! 264: ! 265: case IDM_PASTE: ! 266: DoPaste(); ! 267: break; ! 268: ! 269: case IDM_ADD: ! 270: /* get the new header for the new card */ ! 271: if(pchBuf = PutUpDB(DTADD)) ! 272: { ! 273: /* allocate space for new card */ ! 274: lTemp = (cCards+1) * sizeof(CARDHEADER); ! 275: if (!GlobalReAlloc(hCards, lTemp,GMEM_MOVEABLE)) ! 276: CardfileOkError(IDS_EINSMEMORY); ! 277: else ! 278: { ! 279: /* if in phone book mode, or can save current card */ ! 280: if (CardPhone == IDM_PHONEBOOK || ! 281: SaveCurrentCard(iFirstCard)) ! 282: { ! 283: /* make a blank card */ ! 284: MakeBlankCard(); ! 285: ! 286: /* save the header */ ! 287: Mylstrcpy((LPSTR)CurCardHead.line, (LPSTR)pchBuf); ! 288: ! 289: /* the card is dirty */ ! 290: CurCardHead.flags |= (FDIRTY + FNEW); ! 291: ! 292: /* add the card */ ! 293: iFirstCard = AddCurCard(); ! 294: ! 295: /* make sure that top card is correct */ ! 296: if (CardPhone == IDM_PHONEBOOK) ! 297: SetTopCard(); ! 298: ! 299: /* set new scroll information */ ! 300: SetScrRangeAndPos(); ! 301: ! 302: /* if in phone book mode, need to save immediately */ ! 303: if (CardPhone == IDM_PHONEBOOK) ! 304: SaveCurrentCard(iFirstCard); ! 305: ! 306: /* else, force redraw of correct highlighting */ ! 307: else ! 308: { ! 309: SetFocus(NULL); ! 310: SetFocus(hCardWnd); ! 311: } ! 312: ! 313: /* force repaint */ ! 314: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 315: } ! 316: } ! 317: LocalFree((HANDLE)pchBuf); ! 318: } ! 319: break; ! 320: ! 321: case IDM_DELETE: ! 322: /* if in phone book mode */ ! 323: if (CardPhone == IDM_PHONEBOOK) ! 324: { ! 325: /* get information */ ! 326: SetCurCard(iFirstCard); ! 327: ! 328: /* save it in case of cancel */ ! 329: SaveCurrentCard(iFirstCard); ! 330: } ! 331: ! 332: /* ask user for confirmation */ ! 333: if (MyMessageBox(IDS_DELCURCARD, ! 334: CurCardHead.line, ! 335: MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2) == IDOK) ! 336: { ! 337: ! 338: /* if not last card */ ! 339: if (cCards > 1) ! 340: { ! 341: /* get rid of it */ ! 342: DeleteCard(iFirstCard); ! 343: if (iFirstCard == cCards) ! 344: if (CardPhone == IDM_CARDFILE) ! 345: iFirstCard = 0; ! 346: else ! 347: iFirstCard = cCards-1; ! 348: ! 349: /* change scroll information */ ! 350: SetScrRangeAndPos(); ! 351: ! 352: /* if in card mode, get card's information */ ! 353: if (CardPhone == IDM_CARDFILE) ! 354: SetCurCard(iFirstCard); ! 355: ! 356: /* shrinking, so don't have to check */ ! 357: lTemp = cCards * sizeof(CARDHEADER); ! 358: GlobalReAlloc(hCards, lTemp, GMEM_MOVEABLE); ! 359: } ! 360: /* else, last card */ ! 361: else ! 362: { ! 363: /* make it blank */ ! 364: MakeBlankCard(); ! 365: ! 366: /* store the info */ ! 367: lpCards = (LPCARDHEADER) GlobalLock(hCards); ! 368: *lpCards = CurCardHead; ! 369: GlobalUnlock(hCards); ! 370: ! 371: /* save the info in phonebook mode */ ! 372: if (CardPhone == IDM_PHONEBOOK) ! 373: SaveCurrentCard(iFirstCard); ! 374: } ! 375: /* dirty file and window */ ! 376: fFileDirty = TRUE; ! 377: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 378: } ! 379: break; ! 380: ! 381: case IDM_DUPLICATE: ! 382: /* make sure there's room */ ! 383: lTemp = (cCards + 1) * sizeof(CARDHEADER); ! 384: if (!GlobalReAlloc(hCards, lTemp, GMEM_MOVEABLE)) ! 385: CardfileOkError(IDS_EINSMEMORY); ! 386: else ! 387: { ! 388: /* there is, save current card */ ! 389: if (CardPhone == IDM_PHONEBOOK || ! 390: SaveCurrentCard(iFirstCard)) ! 391: { ! 392: /* get information */ ! 393: SetCurCard(iFirstCard); ! 394: CurCardHead.flags |= (FDIRTY + FNEW); ! 395: ! 396: /* add it */ ! 397: iFirstCard = AddCurCard(); ! 398: if (CardPhone == IDM_PHONEBOOK) ! 399: { ! 400: SaveCurrentCard(iFirstCard); ! 401: SetTopCard(); ! 402: } ! 403: ! 404: /* set new scroll information */ ! 405: SetScrRangeAndPos(); ! 406: InvalidateRect(hWindow, (LPRECT)NULL, TRUE); ! 407: fFileDirty = TRUE; ! 408: } ! 409: } ! 410: break; ! 411: ! 412: case IDM_GOTO: ! 413: /* search headers */ ! 414: if (pchBuf = PutUpDB(DTGOTO)) ! 415: { ! 416: DoGoto(pchBuf); ! 417: LocalFree((HANDLE)pchBuf); ! 418: } ! 419: break; ! 420: ! 421: case IDM_FINDNEXT: ! 422: /* search body of card */ ! 423: if (CurIFind[0]) ! 424: { ! 425: FindStrCard(); ! 426: break; ! 427: } ! 428: ! 429: case IDM_FIND: ! 430: /* search for a pattern */ ! 431: if(pchBuf = PutUpDB(DTFIND)) ! 432: { ! 433: /* save the pattern */ ! 434: Mylstrcpy((LPSTR)CurIFind, (LPSTR)pchBuf); ! 435: FindStrCard(); ! 436: LocalFree((HANDLE)pchBuf); ! 437: } ! 438: break; ! 439: ! 440: default: ! 441: break; ! 442: } ! 443: } ! 444: ! 445: /*********************************************************************/ ! 446: /* SetTopCard - */ ! 447: /* This routine is called in phone mode to figure out which */ ! 448: /* header should appear at the top of the window */ ! 449: /* */ ! 450: /* Slightly different for PM and Windows */ ! 451: /*********************************************************************/ ! 452: ! 453: void SetTopCard() ! 454: { ! 455: RECT rect; ! 456: int i; ! 457: ! 458: GetClientRect(hCardfileWnd, (LPRECT)&rect); ! 459: ! 460: #ifdef IN_WINDOWS ! 461: /* In PM, the height of a window after a GetClientRect call is */ ! 462: /* stored in yTop (the origin is based on the bottom */ ! 463: ! 464: i = rect.bottom / CharFixHeight; ! 465: #else ! 466: i = rect.yTop / CharFixHeight; ! 467: #endif ! 468: ! 469: if (!i) ! 470: i = 1; ! 471: iTopCard = min(iFirstCard-(i-1)/2, (cCards - i)); ! 472: if (iTopCard < 0) ! 473: iTopCard = 0; ! 474: } ! 475: ! 476: /*********************************************************************/ ! 477: /* PutUpDB - */ ! 478: /* Calls routine to put up requested dialog box */ ! 479: /* */ ! 480: /* Same for PM and Windows */ ! 481: /*********************************************************************/ ! 482: ! 483: PSTR PutUpDB(idb) ! 484: int idb; ! 485: { ! 486: FARPROC lpdbProc; ! 487: ! 488: DBcmd = idb; ! 489: switch(idb) ! 490: { ! 491: case DTMERGE: ! 492: case DTOPEN: ! 493: lpdbProc = lpfnOpen; ! 494: break; ! 495: case DTSAVE: ! 496: lpdbProc = lpfnSave; ! 497: break; ! 498: case DTABOUT: ! 499: lpdbProc = lpfnAbout; ! 500: break; ! 501: default: ! 502: lpdbProc = lpDlgProc; ! 503: break; ! 504: } ! 505: return((PSTR)DialogBox(hCardfileInstance, ! 506: MAKEINTRESOURCE(idb), hCardfileWnd, lpdbProc)); ! 507: } ! 508: ! 509: /*********************************************************************/ ! 510: /* UpdateMenu - */ ! 511: /* This routine initializes the menu every time it is about */ ! 512: /* to be displayed for the user */ ! 513: /* */ ! 514: /* Same for PM and Windows */ ! 515: /*********************************************************************/ ! 516: ! 517: void UpdateMenu() ! 518: { ! 519: HMENU hMenu; ! 520: long lSelection; ! 521: int wFmt; ! 522: int mfPaste; ! 523: ! 524: hMenu = GetMenu(hCardfileWnd); ! 525: CheckMenuItem(hMenu, IDM_CARDFILE, ! 526: CardPhone == IDM_CARDFILE ? MF_CHECKED : MF_UNCHECKED); ! 527: CheckMenuItem(hMenu, IDM_PHONEBOOK, ! 528: CardPhone == IDM_PHONEBOOK ? MF_CHECKED : MF_UNCHECKED); ! 529: ! 530: if (CardPhone == IDM_CARDFILE) ! 531: { ! 532: mfPaste = MF_GRAYED; ! 533: if (OpenClipboard(hCardfileWnd)) ! 534: { ! 535: wFmt = 0; ! 536: ! 537: while (wFmt = EnumClipboardFormats(wFmt)) ! 538: { ! 539: if (wFmt == CF_TEXT) ! 540: { ! 541: mfPaste = MF_ENABLED; ! 542: break; ! 543: } ! 544: } ! 545: ! 546: CloseClipboard(); ! 547: } ! 548: EnableMenuItem(hMenu, IDM_PASTE, mfPaste); ! 549: ! 550: EnableMenuItem(hMenu, IDM_RESTORE, MF_ENABLED); ! 551: EnableMenuItem(hMenu, IDM_FIND, MF_ENABLED); ! 552: EnableMenuItem(hMenu, IDM_FINDNEXT, MF_ENABLED); ! 553: ! 554: lSelection = SendMessage(hCardWnd, EM_GETSEL, 0, 0L); ! 555: if (HIWORD(lSelection) == LOWORD(lSelection)) ! 556: { ! 557: EnableMenuItem(hMenu, IDM_CUT, MF_GRAYED); ! 558: EnableMenuItem(hMenu, IDM_COPY, MF_GRAYED); ! 559: } ! 560: else ! 561: { ! 562: EnableMenuItem(hMenu, IDM_CUT, MF_ENABLED); ! 563: EnableMenuItem(hMenu, IDM_COPY, MF_ENABLED); ! 564: } ! 565: } ! 566: else ! 567: { ! 568: EnableMenuItem(hMenu, IDM_RESTORE, MF_GRAYED); ! 569: EnableMenuItem(hMenu, IDM_CUT, MF_GRAYED); ! 570: EnableMenuItem(hMenu, IDM_COPY, MF_GRAYED); ! 571: EnableMenuItem(hMenu, IDM_PASTE, MF_GRAYED); ! 572: EnableMenuItem(hMenu, IDM_FIND, MF_GRAYED); ! 573: EnableMenuItem(hMenu, IDM_FINDNEXT, MF_GRAYED); ! 574: } ! 575: } ! 576: ! 577: ! 578: /*********************************************************************/ ! 579: /* SetEditText - */ ! 580: /* This routine sets the contents of the edit control */ ! 581: /* */ ! 582: /* Same for PM and Windows */ ! 583: /*********************************************************************/ ! 584: ! 585: void FAR SetEditText(lpText) ! 586: LPSTR lpText; ! 587: { ! 588: SetWindowText(hCardWnd, lpText); ! 589: #ifndef IN_WINDOWS ! 590: /* In PM, the Edit control doesn't initialize the modify flag to */ ! 591: /* False after a SetWindowText call. Read state of modify flag */ ! 592: /* to reset the flag. */ ! 593: ! 594: SendMessage(hCardWnd, EM_GETMODIFY, 0, 0L); ! 595: #endif ! 596: } ! 597: ! 598: ! 599: /*********************************************************************/ ! 600: /* CardfileMouse - */ ! 601: /* This handles all mouse input to main window. Mouse input in */ ! 602: /* the edit control will get sent to CardWndProc */ ! 603: /* */ ! 604: /* Same for PM and Windows */ ! 605: /*********************************************************************/ ! 606: ! 607: void CardfileMouse(hWindow, message, pt) ! 608: HWND hWindow; ! 609: int message; ! 610: POINT pt; ! 611: { ! 612: RECT rect; ! 613: int iCard; ! 614: HDC hDC; ! 615: int y; ! 616: MSG msg; ! 617: ! 618: if (CardPhone == IDM_CARDFILE) ! 619: { ! 620: /* see if click on a card or background */ ! 621: if ((iCard = MapPtToCard(pt)) > -1) ! 622: { ! 623: /* if on another card */ ! 624: if (iCard != iFirstCard) ! 625: { ! 626: /* bring it to front */ ! 627: CardfileScroll(hCardfileWnd, SB_THUMBTRACK, iCard); ! 628: CardfileScroll(hCardfileWnd, SB_THUMBPOSITION, iCard); ! 629: } ! 630: /* else if double click on first */ ! 631: else if (message == WM_LBUTTONDBLCLK) ! 632: { ! 633: /* bring up header box */ ! 634: SetCapture(hCardfileWnd); ! 635: while(GetKeyState(VK_LBUTTON) < 0) ! 636: { ! 637: PeekMessage((LPMSG)&msg, NULL, WM_MOUSEFIRST, ! 638: WM_MOUSELAST, TRUE); ! 639: PeekMessage((LPMSG)&msg, NULL, WM_KEYFIRST, ! 640: WM_KEYLAST, TRUE); ! 641: } ! 642: ReleaseCapture(); ! 643: CardfileInput(hWindow, IDM_HEADER); ! 644: } ! 645: } ! 646: } ! 647: else /* phone book mode */ ! 648: { ! 649: /* figure out which header the user clicked on */ ! 650: TRANSLATE_COORDS( cyMainWindow ); ! 651: ! 652: iCard = iTopCard + (TRANSLATE_Y(pt.y) / CharFixHeight); ! 653: if (message == WM_LBUTTONDOWN || iCard != iFirstCard) ! 654: { ! 655: /* single click, change selection */ ! 656: if (iCard < cCards) ! 657: { ! 658: y = (iFirstCard - iTopCard) * CharFixHeight; ! 659: hDC = GetDC(hWindow); ! 660: SetRect((LPRECT)&rect, 0, y, ! 661: (LINELENGTH+2)*CharFixWidth, y+CharFixHeight); ! 662: TRANSLATE_RECT( rect ); ! 663: ! 664: InvertRect(hDC, (LPRECT)&rect); ! 665: iFirstCard = iCard; ! 666: y = (iFirstCard - iTopCard) * CharFixHeight; ! 667: SetRect((LPRECT)&rect, 0, y, ! 668: (LINELENGTH+2)*CharFixWidth, y+CharFixHeight); ! 669: TRANSLATE_RECT( rect ); ! 670: ! 671: InvertRect(hDC, (LPRECT)&rect); ! 672: ReleaseDC(hWindow, hDC); ! 673: } ! 674: } ! 675: else /* double click on cur card */ ! 676: { ! 677: /* bring up header box */ ! 678: if (iCard < cCards) ! 679: { ! 680: while(!PeekMessage((LPMSG)&msg, NULL, WM_LBUTTONUP, ! 681: WM_LBUTTONUP, TRUE)) ! 682: ; ! 683: CardfileInput(hWindow, IDM_HEADER); ! 684: } ! 685: } ! 686: TRANSLATE_COORDS( 0 ); ! 687: } ! 688: } ! 689: ! 690: /*********************************************************************/ ! 691: /* GetNewCard - */ ! 692: /* This routine is called when a card which is brought forward */ ! 693: /* via a keystroke (i.e. ctrl-letter) */ ! 694: /* */ ! 695: /* Same for PM and Windows */ ! 696: /*********************************************************************/ ! 697: ! 698: BOOL FAR GetNewCard(iOldCard, iNewCard) ! 699: int iOldCard; ! 700: int iNewCard; ! 701: { ! 702: HDC hDC; ! 703: RECT rect; ! 704: int y; ! 705: ! 706: /* if phonebook mode */ ! 707: if (CardPhone == IDM_PHONEBOOK) ! 708: { ! 709: /* unselect old card */ ! 710: y = (iOldCard - iTopCard) * CharFixHeight; ! 711: hDC = GetDC(hCardfileWnd); ! 712: ! 713: TRANSLATE_COORDS( cyMainWindow ); ! 714: SetRect((LPRECT)&rect, 0, y, (LINELENGTH+2)*CharFixWidth, ! 715: y+CharFixHeight); ! 716: TRANSLATE_RECT( rect ); ! 717: TRANSLATE_COORDS( 0 ); ! 718: ! 719: InvertRect(hDC, (LPRECT)&rect); ! 720: ReleaseDC(hCardfileWnd, hDC); ! 721: /* get new one */ ! 722: BringCardOnScreen(iFirstCard = iNewCard); ! 723: } ! 724: else ! 725: { ! 726: /* send scroll messages */ ! 727: CardfileScroll(hCardfileWnd, SB_THUMBTRACK, iNewCard); ! 728: return(CardfileScroll(hCardfileWnd, SB_THUMBPOSITION, iNewCard)); ! 729: } ! 730: return(TRUE); ! 731: } ! 732: ! 733: /*********************************************************************/ ! 734: /* MapPtToCard - */ ! 735: /* Map mouse coordinates to a particular card. This is called in */ ! 736: /* card mode only */ ! 737: /* */ ! 738: /* Same for PM and Windows */ ! 739: /*********************************************************************/ ! 740: ! 741: int MapPtToCard(pt) ! 742: POINT pt; ! 743: { ! 744: int idCard; ! 745: int xCur; ! 746: int yCur; ! 747: int i; ! 748: RECT rect; ! 749: ! 750: yCur = yFirstCard - (cScreenCards - 1)*ySpacing; ! 751: xCur = xFirstCard + (cScreenCards - 1)* (2 * CharFixWidth); ! 752: idCard = (iFirstCard + cScreenCards-1) % cCards; ! 753: ! 754: TRANSLATE_COORDS( cyMainWindow ); ! 755: ! 756: for (i = 0; i < cScreenCards; ++i) ! 757: { ! 758: SetRect((LPRECT)&rect, xCur+1, yCur+1, xCur+CardWidth-1, ! 759: yCur+CharFixHeight+1); ! 760: TRANSLATE_RECT( rect ); ! 761: ! 762: if (PtInRect((LPRECT)&rect, pt)) ! 763: return(idCard); ! 764: ! 765: SetRect((LPRECT)&rect, rect.right - 2*CharFixWidth + 2, ! 766: yCur+1,rect.right,yCur-1+CardHeight); ! 767: TRANSLATE_RECT( rect ); ! 768: ! 769: if (PtInRect((LPRECT)&rect, pt)) ! 770: return(idCard); ! 771: xCur -= (2*CharFixWidth); ! 772: yCur += ySpacing; ! 773: idCard--; ! 774: if (idCard < 0) ! 775: idCard = cCards - 1; ! 776: } ! 777: TRANSLATE_COORDS( 0 ); ! 778: ! 779: return(-1); ! 780: } ! 781: ! 782: /*********************************************************************/ ! 783: /* CardfileOkError - */ ! 784: /* Puts up a dialog box with only an ok button */ ! 785: /* */ ! 786: /* Same for PM and Windows */ ! 787: /*********************************************************************/ ! 788: ! 789: void FAR CardfileOkError(strid) ! 790: int strid; ! 791: { ! 792: MyMessageBox(strid, NULL, MB_OK | MB_ICONEXCLAMATION); ! 793: } ! 794: ! 795: ! 796: /*********************************************************************/ ! 797: /* MyMessageBox - */ ! 798: /* Puts up error message for strid, possibly merging in a string, */ ! 799: /* and asks for the appropriate buttons and icons */ ! 800: /* */ ! 801: /* Same for PM and Windows */ ! 802: /*********************************************************************/ ! 803: ! 804: WORD FAR MyMessageBox(strid, pchMerge, style) ! 805: WORD strid; ! 806: PSTR pchMerge; ! 807: WORD style; ! 808: { ! 809: char buf1[128]; ! 810: char buf2[128]; ! 811: ! 812: if (strid == IDS_EINSMEMORY) ! 813: Mylstrcpy((LPSTR)buf1, (LPSTR)NotEnoughMem); ! 814: else ! 815: LoadString(hCardfileInstance, strid, (LPSTR)buf1, 128); ! 816: MergeStrings((LPSTR)buf1, (LPSTR)pchMerge, (LPSTR)buf2); ! 817: return(MessageBox(hCardfileWnd, (LPSTR)buf2, ! 818: (LPSTR)rgchCardfile, style)); ! 819: } ! 820: ! 821: ! 822: /*********************************************************************/ ! 823: /* MergeStrings - */ ! 824: /* Scans sz1 for merge spec. If found, insert string sz2 at that */ ! 825: /* point. Then append rest of sz1 NOTE! Merge spec guaranteed to be */ ! 826: /* two chars. Returns TRUE if it does a merge, false otherwise. */ ! 827: /* */ ! 828: /* Same for PM and Windows */ ! 829: /*********************************************************************/ ! 830: ! 831: BOOL FAR MergeStrings(lpszSrc, lpszMerge, lpszDst) ! 832: LPSTR lpszSrc; ! 833: LPSTR lpszMerge; ! 834: LPSTR lpszDst; ! 835: { ! 836: LPSTR lpchSrc; ! 837: LPSTR lpchDst; ! 838: ! 839: lpchSrc = lpszSrc; ! 840: lpchDst = lpszDst; ! 841: ! 842: /* Find merge spec if there is one. */ ! 843: while (*(unsigned far *)lpchSrc != wMerge) { ! 844: *lpchDst++ = *lpchSrc; ! 845: ! 846: /* If we reach end of string before merge spec, just return. */ ! 847: if (!*lpchSrc++) ! 848: return FALSE; ! 849: ! 850: } ! 851: /* If merge spec found, insert sz2 there. (check for null merge string */ ! 852: if (lpszMerge) { ! 853: while (*lpszMerge) ! 854: *lpchDst++ = *lpszMerge++; ! 855: ! 856: } ! 857: ! 858: /* Jump over merge spec */ ! 859: lpchSrc++,lpchSrc++; ! 860: ! 861: ! 862: /* Now append rest of Src String */ ! 863: while (*lpchDst++ = *lpchSrc++); ! 864: return TRUE; ! 865: ! 866: } ! 867: ! 868: /*********************************************************************/ ! 869: /* MakeBlankCard - */ ! 870: /* */ ! 871: /* Same for PM and Windows */ ! 872: /*********************************************************************/ ! 873: ! 874: void MakeBlankCard() ! 875: { ! 876: CurCardHead.line[0] = 0; ! 877: CurCard.hBitmap = 0; ! 878: SetEditText((LPSTR)""); ! 879: CurCardHead.flags = FNEW; ! 880: } ! 881: ! 882: ! 883: /*********************************************************************/ ! 884: /* SetCaption - */ ! 885: /* Sets cardfile's window caption */ ! 886: /* */ ! 887: /* Same for PM and Windows */ ! 888: /*********************************************************************/ ! 889: ! 890: void SetCaption() ! 891: { ! 892: char buf[40]; ! 893: BuildCaption(buf); ! 894: SetWindowText( FRAME(hCardfileWnd), (LPSTR)buf ); ! 895: } ! 896: ! 897: /*********************************************************************/ ! 898: /* BuildCaption - */ ! 899: /* Creates the string that will appear in the window, or in the */ ! 900: /* spooled file list */ ! 901: /* */ ! 902: /* Same for PM and Windows */ ! 903: /*********************************************************************/ ! 904: ! 905: void FAR BuildCaption(pchBuf) ! 906: char *pchBuf; ! 907: { ! 908: char *pch; ! 909: char *pch3; ! 910: ! 911: /* always starts off "Cardfile - " */ ! 912: Mylstrcpy((LPSTR)pchBuf, (LPSTR)rgchCardfile); ! 913: Mylstrcat((LPSTR)pchBuf, (LPSTR)" - "); ! 914: /* if named, append just filename */ ! 915: if (CurIFile[0]) ! 916: { ! 917: pch = CurIFile; ! 918: pch3 = pch; ! 919: /* scan to end */ ! 920: for ( ; *pch; ++pch) ! 921: ; ! 922: /* run backwards looking for beginning of filename */ ! 923: while (pch > pch3 && *pch != '\\') ! 924: pch = (PSTR)AnsiPrev(pch3, pch); ! 925: /* if at slash, point to filename */ ! 926: if (*pch == '\\') ! 927: pch++; ! 928: Mylstrcat((LPSTR)pchBuf, (LPSTR)pch); ! 929: } ! 930: /* if unnamed, append "Untitled" */ ! 931: else ! 932: Mylstrcat((LPSTR)pchBuf, (LPSTR)rgchUntitled); ! 933: } ! 934: ! 935:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.