Annotation of mstools/samples/mcitest/edit.c, revision 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.