Annotation of pmsdk/samples/newcard/cfcard.c, revision 1.1.1.1

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: /* CardWndProc -                                                     */
                     20: /*    in card mode, cardfile uses an edit control for the body       */
                     21: /* of the frontmost card.  When the user presses Ctrl-letter, the    */
                     22: /* application needs to intercept this message and search for a      */
                     23: /* a matching card.                                                  */
                     24: /*                                                                   */
                     25: /* Different in PM and Windows                                       */
                     26: /*********************************************************************/
                     27: 
                     28: 
                     29: long far PASCAL CardWndProc(hwnd, message, wParam, lParam)
                     30: HWND     hwnd;
                     31: unsigned message;
                     32: WINWORD  wParam;
                     33: DWORD    lParam;
                     34: {
                     35:     switch (message)
                     36:         {
                     37:         case WM_CHAR:
                     38:             /* In Windows, Ctrl-chars are sent in the WM_CHAR message */
                     39:             /*  and virtual keys are sent in the WM_SYSKEYDOWN message. */
                     40:             /* In PM, all keystrokes are sent in the WM_CHAR message. */
                     41:             /* The simplest way to handle this difference is to */
                     42:             /* have different code for both cases.  */            
                     43: 
                     44: #ifdef  IN_WINDOWS
                     45:             /* could be a ctrl-letter combination, which means */
                     46:             /* move to the next card starting with that letter. */
                     47:             /* check, and if not pass it on   */
                     48:            if (!GetKeyState(VK_CTRL) || !CardChar(wParam))
                     49:                 goto PassMessageOn;
                     50: #else
                     51:             /* PM Only! */
                     52:             /* If key up or dead key, pass to system */
                     53:             if (wParam & (KC_KEYUP | KC_DEADKEY | KC_ALT))
                     54:                 goto PassMessageOn;
                     55: 
                     56:             /* If virtual key is valid, see if can process */
                     57:             if (wParam & KC_VIRTUALKEY)
                     58:                if (CardKey(HIUSHORT(lParam)))
                     59:                   return( TRUE );
                     60: 
                     61:             /* Otherwise, if valid char, try to process */
                     62:             if ((wParam & KC_CHAR) && (wParam & KC_CTRL))
                     63:                if (CardChar(LOUSHORT(lParam)))
                     64:                   return( TRUE );
                     65: 
                     66:             goto PassMessageOn;
                     67: #endif
                     68:             break;
                     69: 
                     70: #ifdef   IN_WINDOWS
                     71:         /* Try to process virtual keystroke */ 
                     72:    
                     73:         case WM_KEYDOWN:
                     74:             /* could be page up-down, home, end */
                     75:             if (!CardKey(wParam))
                     76:                 goto PassMessageOn;
                     77:             break;
                     78: #endif
                     79: 
                     80:         default:
                     81: PassMessageOn:
                     82:             return(CallWindowProc(lpEditWndProc, hCardWnd, message, wParam, 
                     83:                                   lParam));
                     84:             break;
                     85:         }
                     86:     return(0L);
                     87: }
                     88: 
                     89: /*********************************************************************/
                     90: /* DeleteCard -                                                      */
                     91: /*    get rid of a card, and remove it from the data structure       */
                     92: /*                                                                   */
                     93: /* Same for PM and Windows                                           */
                     94: /*********************************************************************/
                     95: 
                     96: void DeleteCard(iCard)
                     97: int iCard;
                     98: {
                     99:     LPCARDHEADER lpCards;
                    100: 
                    101:     cCards--;
                    102:     lpCards = (LPCARDHEADER) GlobalLock(hCards);
                    103:     RepMov( (LPSTR) (lpCards+iCard), (LPSTR) (lpCards+iCard+1), 
                    104:             (cCards-iCard) * sizeof(CARDHEADER) );
                    105:     GlobalUnlock(hCards);
                    106: }
                    107: 
                    108: /*********************************************************************/
                    109: /* AddCurCard -                                                      */
                    110: /*    adding a new card, insert it in the linked list in alphabetical*/
                    111: /* order based on the header                                         */
                    112: /*                                                                   */
                    113: /*    Same for PM and Windows                                        */
                    114: /*********************************************************************/
                    115: 
                    116: int FAR AddCurCard()
                    117: {
                    118:     LPCARDHEADER lpCards;
                    119:     LPCARDHEADER lpTCards;
                    120:     char *pch1;
                    121:     unsigned char c1, c2;
                    122:     LPSTR lpch2;
                    123:     int i, fKj1, fKj2;
                    124: 
                    125:     lpCards = (LPCARDHEADER) GlobalLock(hCards);
                    126:     lpTCards = lpCards;
                    127:     /* scan for right place to insert the card */
                    128:     for (i = 0; i < cCards; i++) {
                    129:         fKj1 = fKj2 = 0;
                    130:         /* compare new header and current one */
                    131:         for(pch1 = CurCardHead.line, lpch2 = lpTCards->line; 
                    132:             *pch1; ++pch1, ++lpch2)
                    133:             {
                    134:             /* do not call ansi upper if it is the second byte */
                    135:             /* of the kanji stream */
                    136:             
                    137:             /* The original Windows call AnsiUpper was replace by  */
                    138:             /*  ANSICHARUP in those cases that it was called with a */
                    139:             /*  single char */
                    140:             c1 = KanjiXlat((fKj1 ? *pch1 : ANSICHARUP(CHAR_STR(pch1))), 
                    141:                            (short *)&fKj1);
                    142:             c2 = KanjiXlat((fKj2 ? *lpch2 : ANSICHARUP(CHAR_STR(lpch2))), 
                    143:                            (short *)&fKj2);
                    144:             if (c1 != c2)
                    145:                 break;
                    146:         }
                    147:         /* if less than or equal, found the spot */
                    148:         if (c1 <= c2)
                    149:             break;
                    150:         lpTCards++;
                    151:     }
                    152:     if (i != cCards)
                    153:         RepMovUp( (LPSTR) (lpTCards + 1), (LPSTR) lpTCards, 
                    154:                   (cCards - i) * sizeof(CARDHEADER) );
                    155: 
                    156:     *lpTCards = CurCardHead;
                    157:     GlobalUnlock(hCards);
                    158:     cCards++;
                    159:     return(i);
                    160: }
                    161: 
                    162: /*********************************************************************/
                    163: /* KanjiXlat -
                    164: /*    Same for PM and Windows                                        */
                    165: /*********************************************************************/
                    166: 
                    167: KanjiXlat(c, fKj)
                    168: unsigned char c;
                    169: short *fKj;
                    170: {
                    171:     /* if (fKj) ==> this is the second byte of a kanji char,
                    172:        no translation */
                    173:     if (*fKj)
                    174:             {
                    175:             *fKj = 0;
                    176:             return c;
                    177:             }
                    178: 
                    179:     if (c < 0x80)
                    180:         return c;
                    181:     if (c <= 0x9f)
                    182:         {
                    183:         *fKj = 1;
                    184:         return c + 0x40;
                    185:         }
                    186:     if (c <= 0xdf)
                    187:         return c - 0x20;
                    188:     *fKj = 1;
                    189:     return c;
                    190: }
                    191: 
                    192: /*********************************************************************/
                    193: /* SaveCurrentCard -                                                 */
                    194: /*    Saves the data on the current card                             */
                    195: /*                                                                   */
                    196: /* Slightly different in PM and Windows                              */
                    197: /*********************************************************************/
                    198: 
                    199: BOOL SaveCurrentCard(iCard)
                    200: int iCard;
                    201:     {
                    202:     LPCARDHEADER lpCards;
                    203:     HANDLE hText;
                    204:     LPSTR lpText;
                    205: 
                    206:     /* save the card if it's dirty */
                    207:     /* dirty if edittext has changed */
                    208:     if (CurCardHead.flags & (FDIRTY+FNEW) || 
                    209:         SendMessage(hCardWnd, EM_GETMODIFY, 0, 0L))
                    210:         {
                    211:         /* get a buffer for text on card */
                    212:         hText = GlobalAlloc(GHND, (long)CARDTEXTSIZE);
                    213:         if (!hText)
                    214:             {
                    215:             CardfileOkError(IDS_EINSMEMSAVE);
                    216:             return(FALSE);
                    217:             }
                    218:         lpText = GlobalLock(hText);
                    219: 
                    220:         /* get the text in the edit control */
                    221:         GetWindowText(hCardWnd, lpText, CARDTEXTSIZE);
                    222: 
                    223:         /* save the card */
                    224:         if (WriteCurCard(&CurCardHead, &CurCard, lpText))
                    225:             {
                    226:             if (CurCardHead.flags & FDIRTY || 
                    227:                 SendMessage(hCardWnd, EM_GETMODIFY, 0, 0L))
                    228:                 fFileDirty = TRUE;
                    229:          
                    230: #ifdef   IN_WINDOWS
                    231:             /* In Windows, the edit modify flag must be manually reset. */
                    232:             /* In PM, it's reset when the EM_GETMODIFY occurs */
                    233:             SendMessage(hCardWnd, EM_SETMODIFY, FALSE, 0L);
                    234: #endif
                    235:             CurCardHead.flags &= (!FNEW);
                    236:             CurCardHead.flags &= (!FDIRTY);
                    237:             CurCardHead.flags |= FTMPFILE;
                    238:             /* save the card in the linked list.  information about */
                    239:             /* location of card's data has changed, which is why the */
                    240:             /* header needs to be saved */
                    241:             lpCards = (LPCARDHEADER) GlobalLock(hCards);
                    242:             lpCards += iCard;
                    243:             *lpCards = CurCardHead;
                    244:             GlobalUnlock(hCards);
                    245:             }
                    246:         else
                    247:             return(FALSE);
                    248:         GlobalUnlock(hText);
                    249:         GlobalFree(hText);
                    250:         }
                    251:     return(TRUE);
                    252:     }
                    253: 
                    254: /*********************************************************************/
                    255: /* SetCurCard -                                                      */
                    256: /*    get the data for the current front card                        */
                    257: /*                                                                   */
                    258: /*    Same for PM and Windows                                        */
                    259: /*********************************************************************/
                    260: 
                    261: void SetCurCard(iCard)
                    262: int iCard;
                    263:     {
                    264:     LPCARDHEADER lpCards;
                    265:     LPSTR lpText;
                    266:     HANDLE hText;
                    267: 
                    268:     /* allocate a buffer to read the text into */
                    269:     hText = GlobalAlloc(GHND, (long)CARDTEXTSIZE);
                    270:     if (!hText)
                    271:         {
                    272:         CardfileOkError(IDS_EINSMEMREAD);
                    273:         return;
                    274:         }
                    275: 
                    276:     lpCards = (LPCARDHEADER) GlobalLock(hCards);
                    277:     lpCards += iCard;
                    278: 
                    279:     /* get the current header */
                    280:     CurCardHead = *lpCards;
                    281:     GlobalUnlock(hCards);
                    282:     lpText = GlobalLock(hText);
                    283: 
                    284:     /* read the data */
                    285:     if (!ReadCurCardData(&CurCardHead, &CurCard, lpText))
                    286:         CardfileOkError(IDS_ECANTREADPICT);
                    287: 
                    288:     /* set the contents of the edit control */
                    289:     SetEditText(lpText);
                    290:     GlobalUnlock(hText);
                    291:     GlobalFree(hText);
                    292:     }
                    293: 

unix.superglobalmegacorp.com

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