Annotation of mstools/samples/mcitest/edit.c, revision 1.1.1.1

1.1       root        1: /*----------------------------------------------------------------------------*\
                      2: |   edit.c - routines for dealing with multi-line edit controls                |
                      3: |                                                                              |
                      4: |                                                                              |
                      5: |   History:                                                                   |
                      6: |       01/01/88 toddla     Created                                            |
                      7: |       11/04/90 w-dougb    Commented & formatted the code to look pretty      |
                      8: |                                                                              |
                      9: \*----------------------------------------------------------------------------*/
                     10: 
                     11: /*----------------------------------------------------------------------------*\
                     12: |                                                                              |
                     13: |   i n c l u d e   f i l e s                                                  |
                     14: |                                                                              |
                     15: \*----------------------------------------------------------------------------*/
                     16: 
                     17: #include <windows.h>
                     18: #include "gmem.h"
                     19: #include "edit.h"
                     20: #include "mcitest.h"
                     21: 
                     22: /*----------------------------------------------------------------------------*\
                     23: |                                                                              |
                     24: |   c o n s t a n t   a n d   m a c r o   d e f i n i t i o n s                |
                     25: |                                                                              |
                     26: \*----------------------------------------------------------------------------*/
                     27: 
                     28: #define ISSPACE(c) ((c) == ' ' || (c) == '\t')
                     29: #define ISEOL(c)   ((c) == '\n'|| (c) == '\r')
                     30: #define ISWHITE(c) (ISSPACE(c) || ISEOL(c))
                     31: 
                     32: 
                     33: /*----------------------------------------------------------------------------*\
                     34: |   EditOpenFile(hwndEdit, lszFile)                                            |
                     35: |                                                                              |
                     36: |   Description:                                                               |
                     37: |       This function opens the file <lszFile>, copies the contents of the     |
                     38: |       file into the edit control with the handle <hwndEdit>, and then closes |
                     39: |       the file.                                                              |
                     40: |                                                                              |
                     41: |   Arguments:                                                                 |
                     42: |       hwndEdit        window handle of the edit box control                  |
                     43: |       lszFile         filename of the file to be opened                      |
                     44: |                                                                              |
                     45: |   Returns:                                                                   |
                     46: |       TRUE if the operation was successful, else FALSE                       |
                     47: |                                                                              |
                     48: \*----------------------------------------------------------------------------*/
                     49: 
                     50: BOOL               EditOpenFile(
                     51:     HWND    hwndEdit,
                     52:     LPSTR   lszFile)
                     53: {
                     54:     OFSTRUCT    of;                 /* structure used by the OpenFile routine */
                     55:     HFILE       fh;                 /* DOS file handle returned by OpenFile   */
                     56:     LPSTR       lszText;            /* pointer to the opened file's text      */
                     57:     UINT        nFileLen;           /* length, in bytes, of the opened file   */
                     58:     HCURSOR     hcur;               /* handle to the pre-hourglass cursor     */
                     59: 
                     60:     /* If a valid window handle or a filename was not specified, then exit.
                     61:      */
                     62:     if (!hwndEdit || !lszFile) {
                     63:         dprintf1("EditOpenFile: Invalid window or filename");
                     64:         return FALSE;
                     65:     }
                     66: 
                     67:     /* Open the file for reading */
                     68: 
                     69:     fh = OpenFile(lszFile, &of, OF_READ);
                     70:     if (fh == HFILE_ERROR) {
                     71:         dprintf1("Failed to open: %s", lszFile);
                     72:         return FALSE;
                     73:     }
                     74: 
                     75:        nFileLen = (UINT)GetFileSize((HANDLE)fh, NULL);
                     76:        if (HFILE_ERROR == nFileLen) {
                     77:         dprintf1("Failed to find file size: %s", lszFile);
                     78:         return FALSE;
                     79:        }
                     80: 
                     81:     /*
                     82:      * Create a pointer to a region of memory large enough to hold the entire
                     83:      * contents of the file. If this was successful, then read the file into
                     84:      * this region, and use this region as the text for the edit control.
                     85:      * Finally, free up the region and its pointer, and close the file.
                     86:      *
                     87:      */
                     88: 
                     89:     lszText = (LPTSTR)GAllocPtr(nFileLen+1);
                     90:     if (NULL != lszText) {
                     91: 
                     92:                BOOL fReturn;
                     93:         /* This could take a while - show the hourglass cursor */
                     94: 
                     95:         hcur = SetCursor(LoadCursor(NULL, IDC_WAIT));
                     96: 
                     97:         /* Read the file and copy the contents into the edit control */
                     98: 
                     99:         dprintf3("reading file...");
                    100: 
                    101:         if ((_lread(fh, lszText, nFileLen)) == nFileLen) {
                    102:                        lszText[nFileLen]=0;
                    103:                        dprintf2("File loaded ok");
                    104:                        SetWindowText(hwndEdit, lszText);
                    105:                        fReturn = TRUE;
                    106:                } else {
                    107:                        dprintf2("Error loading file");
                    108:                        fReturn = FALSE;
                    109:                }
                    110: 
                    111:         /* Free up the memory, close the file, and restore the cursor */
                    112: 
                    113:         GFreePtr(lszText);
                    114:         _lclose(fh);
                    115:         SetCursor(hcur);
                    116: 
                    117:         return fReturn;
                    118:     }
                    119: 
                    120:     /*
                    121:      * We couldn't allocate the required memory, so close the file and
                    122:      * return FALSE.
                    123:      *
                    124:      */
                    125: 
                    126:     dprintf1("Failed memory allocation for file");
                    127:     _lclose(fh);
                    128:     return FALSE;
                    129: }
                    130: 
                    131: 
                    132: /*----------------------------------------------------------------------------*\
                    133: |   EditSaveFile(hwndEdit, lszFile)                                            |
                    134: |                                                                              |
                    135: |   Description:                                                               |
                    136: |       This function saves the contents of the edit control with the handle   |
                    137: |       <hwndEdit> into the file  <lszFile>, creating the file if required.    |
                    138: |                                                                              |
                    139: |   Arguments:                                                                 |
                    140: |       hwndEdit        window handle of the edit box control                  |
                    141: |       lszFile         filename of the file to be saved                       |
                    142: |                                                                              |
                    143: |   Returns:                                                                   |
                    144: |       TRUE if the operation was successful, else FALSE                       |
                    145: |                                                                              |
                    146: \*----------------------------------------------------------------------------*/
                    147: 
                    148: BOOL               EditSaveFile(
                    149:     HWND    hwndEdit,
                    150:     LPSTR   lszFile)
                    151: {
                    152:     OFSTRUCT    of;                 /* structure used by the OpenFile routine */
                    153:     HFILE       fh;                 /* DOS file handle returned by OpenFile   */
                    154:     LPSTR       lszText;            /* pointer to the saved file's text       */
                    155:     int         nFileLen;           /* length, in bytes, of the saved file    */
                    156:     HCURSOR     hcur;               /* handle to the pre-hourglass cursor     */
                    157: 
                    158:     /* If a valid window handle or a filename was not specified, then exit */
                    159: 
                    160:     if (!hwndEdit || !lszFile) {
                    161:         dprintf1("EditSaveFile: Invalid window or filename");
                    162:         return FALSE;
                    163:     }
                    164: 
                    165:     /* Create (or overwrite) the save file */
                    166: 
                    167:     fh = OpenFile(lszFile, &of, OF_CREATE);
                    168:     if (fh == HFILE_ERROR) {
                    169:         dprintf1("EditSaveFile: Error opening file");
                    170:         return FALSE;
                    171:     }
                    172: 
                    173:     /* Find out how big the contents of the edit box are */
                    174: 
                    175:     nFileLen = GetWindowTextLength(hwndEdit) + 1;
                    176: 
                    177:     /*
                    178:      * Create a pointer to a region of memory large enough to hold the entire
                    179:      * contents of the edit box. If this was successful, then read the contents
                    180:      * of the edit box into this region, and write the contents of this region
                    181:      * into the save file. Finally, free up the region and its pointer, and
                    182:      * close the file.
                    183:      *
                    184:      */
                    185: 
                    186:     lszText = GAllocPtr(nFileLen);
                    187:     if (NULL != lszText) {
                    188: 
                    189:         /* This could take a while - show the hourglass cursor */
                    190: 
                    191:         hcur = SetCursor(LoadCursor(NULL, IDC_WAIT));
                    192: 
                    193:         /* Read the contents of the edit box, and write it to the save file */
                    194: 
                    195:         GetWindowText(hwndEdit, lszText, nFileLen);
                    196:         _lwrite(fh, lszText, nFileLen);
                    197: 
                    198:         /* Free up the memory, close the file, and restore the cursor */
                    199: 
                    200:         GFreePtr(lszText);
                    201:         _lclose(fh);
                    202:         SetCursor(hcur);
                    203: 
                    204:         return TRUE;
                    205:     }
                    206: 
                    207:     /*
                    208:      * We couldn't allocate the required memory, so close the file and
                    209:      * return FALSE.
                    210:      */
                    211: 
                    212:     _lclose(fh);
                    213:     return FALSE;
                    214: }
                    215: 
                    216: 
                    217: /*----------------------------------------------------------------------------*\
                    218: |   EditGetLineCount(hwndEdit)                                                    |
                    219: |                                                                              |
                    220: |   Description:                                                               |
                    221: |       This function finds out how many lines of text are in the edit box and |
                    222: |       returns this value.                                                    |
                    223: |                                                                              |
                    224: |   Arguments:                                                                 |
                    225: |       hwndEdit           window handle of the edit box control                  |
                    226: |                                                                              |
                    227: |   Returns:                                                                   |
                    228: |       The number of lines of text in the edit control.                       |
                    229: |                                                                              |
                    230: \*----------------------------------------------------------------------------*/
                    231: 
                    232: DWORD EditGetLineCount(
                    233:     HWND   hwndEdit)
                    234: {
                    235:     return SendMessage(hwndEdit, EM_GETLINECOUNT, 0, 0L);
                    236: }
                    237: 
                    238: 
                    239: /*----------------------------------------------------------------------------*\
                    240: |   EditGetLine(hwndEdit, iLine, lszLineBuffer, cch)                           |
                    241: |                                                                              |
                    242: |   Description:                                                               |
                    243: |       This function retrieves the contents of line # <iLine> from the edit   |
                    244: |       box control with handle <hwndEdit>.  If <iLine> is out of range (that  |
                    245: |       number line does not exist in the multi line edit field) then FALSE is |
                    246: |       returned.  Otherwise the line is copied into the buffer pointed to by  |
                    247: |       <lszLineBuffer> with white space removed.                              |
                    248: |       The string is also null terminated even if it means truncation.        |
                    249: |                                                                              |
                    250: |   Arguments:                                                                 |
                    251: |       hwndEdit        window handle of the edit box control                  |
                    252: |       iLine           line # to get the contents of                          |
                    253: |       lszLineBuffer   pointer to the buffer to copy the line to              |
                    254: |       cch             max # of characters to copy (MIN value on entry==2)    |
                    255: |                                                                              |
                    256: |   Returns:                                                                   |
                    257: |       TRUE.                                                                  |
                    258: |                                                                              |
                    259: \*----------------------------------------------------------------------------*/
                    260: 
                    261: BOOL EditGetLine(
                    262:     HWND    hwndEdit,
                    263:     int     iLine,
                    264:     LPSTR   lszLineBuffer,
                    265:     int     cch)
                    266: {
                    267:     int     nLines;             /* total number of lines in the edit box */
                    268: 
                    269:     /*
                    270:      * Find out how many lines are in the edit control. If the requested line
                    271:      * is out of range, then return.
                    272:      */
                    273: 
                    274:     nLines = (int)EditGetLineCount(hwndEdit);
                    275:     if (iLine < 0 || iLine >= nLines) {
                    276:                dprintf1("Requested line count %d is out of range (%d)", iLine, nLines);
                    277:         return *lszLineBuffer = 0;
                    278:                /* This sets the buffer to null and returns FALSE */
                    279:        }
                    280: 
                    281:     /* Read the requested line into the string pointed to by <lszLineBuffer> */
                    282:        /* NOTE:  This routine is always called with cch at least TWO */
                    283: 
                    284:     *((LPWORD)lszLineBuffer) = (WORD)cch;
                    285:     cch = (int)SendMessage(hwndEdit, EM_GETLINE, iLine, (LONG)(LPSTR)lszLineBuffer);
                    286:        /* The returned string is NOT null terminated */
                    287: 
                    288:     /* Strip trailing white spaces from the string, and null-terminate it */
                    289: 
                    290:     while(cch > 0 && ISWHITE(lszLineBuffer[cch-1])) {
                    291:         cch--;
                    292:        }
                    293:     lszLineBuffer[cch] = 0;
                    294: 
                    295:     return TRUE;
                    296: }
                    297: 
                    298: 
                    299: /*----------------------------------------------------------------------------*\
                    300: |   EditGetCurLine(hwndEdit)                                                      |
                    301: |                                                                              |
                    302: |   Description:                                                               |
                    303: |       This function retrieves the line number of the current line in the     |
                    304: |       edit box control with handle <hwndEdit>. It returns this line number.     |
                    305: |                                                                              |
                    306: |   Arguments:                                                                 |
                    307: |       hwndEdit           window handle of the edit box control                  |
                    308: |                                                                              |
                    309: |   Returns:                                                                   |
                    310: |       The line number of the current line.                                   |
                    311: |                                                                              |
                    312: \*----------------------------------------------------------------------------*/
                    313: 
                    314: int EditGetCurLine(
                    315:     HWND    hwndEdit)
                    316: {
                    317:     int iLine;                  /* Line number of the currently active line   */
                    318: 
                    319:     iLine = (int)SendMessage(hwndEdit, EM_LINEFROMCHAR, (WPARAM)-1, 0L);
                    320: 
                    321:     if (iLine < 0) {
                    322:         iLine = 0;
                    323:        }
                    324: 
                    325:     return iLine;
                    326: }
                    327: 
                    328: 
                    329: /*----------------------------------------------------------------------------*\
                    330: |   EditSetCurLine(hwndEdit, iLine)                                               |
                    331: |                                                                              |
                    332: |   Description:                                                               |
                    333: |       This function sets the current line in the edit box control with       |
                    334: |       handle <hwndEdit> to the number given in <iLine>.                         |
                    335: |                                                                              |
                    336: |   Arguments:                                                                 |
                    337: |       hwndEdit           window handle of the edit box control                  |
                    338: |       iLine           the line number to be made the current line            |
                    339: |                                                                              |
                    340: |   Returns:                                                                   |
                    341: |       void                                                                   |
                    342: |                                                                              |
                    343: \*----------------------------------------------------------------------------*/
                    344: 
                    345: void EditSetCurLine(
                    346:     HWND    hwndEdit,
                    347:     int     iLine)
                    348: {
                    349:     int off;
                    350: 
                    351:     off = (int)SendMessage(hwndEdit, EM_LINEINDEX, iLine, 0L);
                    352:     SendMessage(hwndEdit, EM_SETSEL, off, off);
                    353: 
                    354: }
                    355: 
                    356: /*----------------------------------------------------------------------------*\
                    357: |   EditSelectLine(hwndEdit, iLine)                                               |
                    358: |                                                                              |
                    359: |   Description:                                                               |
                    360: |       This function selects line # <iLine> in the edit box control with      |
                    361: |       handle <hwndEdit>.                                                        |
                    362: |                                                                              |
                    363: |   Arguments:                                                                 |
                    364: |       hwndEdit           window handle of the edit box control                  |
                    365: |       iLine           the line number to be selected                         |
                    366: |                                                                              |
                    367: |   Returns:                                                                   |
                    368: |       void                                                                   |
                    369: |                                                                              |
                    370: \*----------------------------------------------------------------------------*/
                    371: 
                    372: void EditSelectLine(
                    373:     HWND    hwndEdit,
                    374:     int     iLine)
                    375: {
                    376:     int offS;
                    377:     int offE;
                    378: 
                    379:     offS = (int)SendMessage(hwndEdit, EM_LINEINDEX, iLine, 0L);
                    380:     offE = (int)SendMessage(hwndEdit, EM_LINEINDEX, iLine+1, 0L);
                    381: 
                    382: 
                    383:     if (offE < offS) {   /* Select to the end */
                    384:         offE = -1;
                    385:        }
                    386: 
                    387:     SendMessage(hwndEdit, EM_SETSEL, offS, offE);
                    388: }

unix.superglobalmegacorp.com

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