Annotation of pmsdk/samples/newcard/cfinput.c, revision 1.1

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: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.