OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [rtos/] [ecos-2.0/] [packages/] [services/] [gfx/] [mw/] [v2_0/] [src/] [mwin/] [winlib/] [medit.c] - Diff between revs 27 and 174

Only display areas with differences | Details | Blame | View Log

Rev 27 Rev 174
/*
/*
 * Copyright (C) 1999, 2000, Wei Yongming.
 * Copyright (C) 1999, 2000, Wei Yongming.
 * Portions Copyright (c) 2000 Greg Haerr <greg@censoft.com>
 * Portions Copyright (c) 2000 Greg Haerr <greg@censoft.com>
 *
 *
 * Multi Line Edit Control for Microwindows win32 api.
 * Multi Line Edit Control for Microwindows win32 api.
 */
 */
 
 
/*
/*
**  This library is free software; you can redistribute it and/or
**  This library is free software; you can redistribute it and/or
**  modify it under the terms of the GNU Library General Public
**  modify it under the terms of the GNU Library General Public
**  License as published by the Free Software Foundation; either
**  License as published by the Free Software Foundation; either
**  version 2 of the License, or (at your option) any later version.
**  version 2 of the License, or (at your option) any later version.
**
**
**  This library is distributed in the hope that it will be useful,
**  This library is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
**  Library General Public License for more details.
**  Library General Public License for more details.
**
**
**  You should have received a copy of the GNU Library General Public
**  You should have received a copy of the GNU Library General Public
**  License along with this library; if not, write to the Free
**  License along with this library; if not, write to the Free
**  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
**  Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
**  MA 02111-1307, USA
**  MA 02111-1307, USA
*/
*/
 
 
/*
/*
**  Alternatively, the contents of this file may be used under the terms
**  Alternatively, the contents of this file may be used under the terms
**  of the Mozilla Public License (the "MPL License") in which case the
**  of the Mozilla Public License (the "MPL License") in which case the
**  provisions of the MPL License are applicable instead of those above.
**  provisions of the MPL License are applicable instead of those above.
*/
*/
 
 
/* Note:
/* Note:
**  Although there was a version by Zhao Jianghua, this version of
**  Although there was a version by Zhao Jianghua, this version of
**  EDIT control is written by Wei Yongming from scratch.
**  EDIT control is written by Wei Yongming from scratch.
**
**
** Create date: 1999/8/26
** Create date: 1999/8/26
**
**
** Modify records:
** Modify records:
**
**
**  Who             When        Where       For What                Status
**  Who             When        Where       For What                Status
**-----------------------------------------------------------------------------
**-----------------------------------------------------------------------------
**  WEI Yongming    2000/02/24  Tsinghua    Add MPL License         Finished
**  WEI Yongming    2000/02/24  Tsinghua    Add MPL License         Finished
**  Kevin Tseng     2000/08/30  gv          port to microwin        ported
**  Kevin Tseng     2000/08/30  gv          port to microwin        ported
**
**
**
**
** TODO:
** TODO:
**    * Selection.
**    * Selection.
**    * Undo.
**    * Undo.
*/
*/
 
 
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <sys/time.h>
#include <sys/time.h>
#define MWINCLUDECOLORS
#define MWINCLUDECOLORS
#include "windows.h"    /* windef.h, winuser.h */
#include "windows.h"    /* windef.h, winuser.h */
#include "wintools.h"
#include "wintools.h"
#include "device.h"     /* GdGetTextSize */
#include "device.h"     /* GdGetTextSize */
 
 
#define USE_BIG5
#define USE_BIG5
 
 
#define WIDTH_MEDIT_BORDER       2
#define WIDTH_MEDIT_BORDER       2
#define MARGIN_MEDIT_LEFT        1
#define MARGIN_MEDIT_LEFT        1
#define MARGIN_MEDIT_TOP         1
#define MARGIN_MEDIT_TOP         1
#define MARGIN_MEDIT_RIGHT       2
#define MARGIN_MEDIT_RIGHT       2
#define MARGIN_MEDIT_BOTTOM      1
#define MARGIN_MEDIT_BOTTOM      1
 
 
#define LEN_MLEDIT_BUFFER       3000
#define LEN_MLEDIT_BUFFER       3000
#define LEN_MLEDIT_UNDOBUFFER   1024
#define LEN_MLEDIT_UNDOBUFFER   1024
 
 
#define EST_FOCUSED     0x00000001L
#define EST_FOCUSED     0x00000001L
#define EST_MODIFY      0x00000002L
#define EST_MODIFY      0x00000002L
#define EST_READONLY    0x00000004L
#define EST_READONLY    0x00000004L
#define EST_REPLACE     0x00000008L
#define EST_REPLACE     0x00000008L
 
 
#define MEDIT_OP_NONE    0x00
#define MEDIT_OP_NONE    0x00
#define MEDIT_OP_DELETE  0x01
#define MEDIT_OP_DELETE  0x01
#define MEDIT_OP_INSERT  0x02
#define MEDIT_OP_INSERT  0x02
#define MEDIT_OP_REPLACE 0x03
#define MEDIT_OP_REPLACE 0x03
 
 
typedef struct tagLINEDATA {
typedef struct tagLINEDATA {
        int     lineNO;                   /* ÐкŠ*/
        int     lineNO;                   /* ÐкŠ*/
        int     dataEnd;
        int     dataEnd;
        struct  tagLINEDATA *previous;    /* Ç°Ò»ÐÐ */
        struct  tagLINEDATA *previous;    /* Ç°Ò»ÐÐ */
        struct  tagLINEDATA *next;        /* ºóÒ»ÐÐ */
        struct  tagLINEDATA *next;        /* ºóÒ»ÐÐ */
        char    buffer[LEN_MLEDIT_BUFFER+1];
        char    buffer[LEN_MLEDIT_BUFFER+1];
}LINEDATA;
}LINEDATA;
typedef    LINEDATA*     PLINEDATA;
typedef    LINEDATA*     PLINEDATA;
 
 
#define ATTENG 0        /* english */
#define ATTENG 0        /* english */
#define ATTCHL 1        /* chinese left(1st) byte */
#define ATTCHL 1        /* chinese left(1st) byte */
#define ATTCHR 2        /* chinese right(2nd) byte */
#define ATTCHR 2        /* chinese right(2nd) byte */
static char attr[LEN_MLEDIT_BUFFER];
static char attr[LEN_MLEDIT_BUFFER];
 
 
typedef struct tagMLEDITDATA {
typedef struct tagMLEDITDATA {
    int     totalLen;      /* length of buffer,¿ÉÄÜûÓÐÓà */
    int     totalLen;      /* length of buffer,¿ÉÄÜûÓÐÓà */
 
 
    int     editPos;        /* current edit position */
    int     editPos;        /* current edit position */
    int     caretPos;       /* caret offset in box */
    int     caretPos;       /* caret offset in box */
    int     editLine;           /* current eidt line */
    int     editLine;           /* current eidt line */
    int     dispPos;        /* ¿ªÊ¼ÏÔʾµÄλÖà */
    int     dispPos;        /* ¿ªÊ¼ÏÔʾµÄλÖà */
    int     StartlineDisp;  /* start line displayed */
    int     StartlineDisp;  /* start line displayed */
    int     EndlineDisp;    /* end line displayed */
    int     EndlineDisp;    /* end line displayed */
    int     linesDisp;      /* ÐèÒªÏÔʾµÄÐÐÊý */
    int     linesDisp;      /* ÐèÒªÏÔʾµÄÐÐÊý */
    int     lines;                  /* ×ܵÄÐÐÊý` */
    int     lines;                  /* ×ܵÄÐÐÊý` */
    int     MaxlinesDisp;    /* ×î´óÏÔʾµÄÐÐÊý. */
    int     MaxlinesDisp;    /* ×î´óÏÔʾµÄÐÐÊý. */
 
 
    int     selStartPos;    /* selection start position */
    int     selStartPos;    /* selection start position */
    int     selStartLine;   /* selection start line */
    int     selStartLine;   /* selection start line */
    int     selEndPos;      /* selection end position */
    int     selEndPos;      /* selection end position */
    int     selEndLine;     /* selection end line */
    int     selEndLine;     /* selection end line */
 
 
    int     passwdChar;     /* password character */
    int     passwdChar;     /* password character */
 
 
    int     leftMargin;     /* left margin */
    int     leftMargin;     /* left margin */
    int     topMargin;      /* top margin */
    int     topMargin;      /* top margin */
    int     rightMargin;    /* right margin */
    int     rightMargin;    /* right margin */
    int     bottomMargin;   /* bottom margin */
    int     bottomMargin;   /* bottom margin */
 
 
    int     hardLimit;      /* hard limit */
    int     hardLimit;      /* hard limit */
 
 
    int     lastOp;         /* last operation */
    int     lastOp;         /* last operation */
    int     lastPos;        /* last operation position */
    int     lastPos;        /* last operation position */
    int     lastLine;       /* last operation line */
    int     lastLine;       /* last operation line */
    int     affectedLen;    /* affected len of last operation */
    int     affectedLen;    /* affected len of last operation */
    int     undoBufferLen;  /* undo buffer len */
    int     undoBufferLen;  /* undo buffer len */
    char    undoBuffer [LEN_MLEDIT_UNDOBUFFER];
    char    undoBuffer [LEN_MLEDIT_UNDOBUFFER];
                            /* Undo buffer; */
                            /* Undo buffer; */
    PLINEDATA   head;       /* buffer */
    PLINEDATA   head;       /* buffer */
    PLINEDATA   tail;       /* ¿ÉÄܲ»ÐèÒª */
    PLINEDATA   tail;       /* ¿ÉÄܲ»ÐèÒª */
}MLEDITDATA;
}MLEDITDATA;
typedef MLEDITDATA* PMLEDITDATA;
typedef MLEDITDATA* PMLEDITDATA;
 
 
BOOL RegisterMLEditControl (void);
BOOL RegisterMLEditControl (void);
 
 
int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);
int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam);
 
 
#define PIXEL_invalid (-1)
#define PIXEL_invalid (-1)
extern HWND sg_hCaretWnd;
extern HWND sg_hCaretWnd;
extern HWND rootwp;
extern HWND rootwp;
 
 
static int GetSysCharHeight (HWND hwnd)
static int GetSysCharHeight (HWND hwnd)
{
{
#ifndef USE_BIG5            
#ifndef USE_BIG5            
        HDC             hdc;
        HDC             hdc;
        int xw, xh, xb;
        int xw, xh, xb;
 
 
        hdc = GetDC(hwnd);
        hdc = GetDC(hwnd);
        SelectObject(hdc, GetStockObject(DEFAULT_FONT));
        SelectObject(hdc, GetStockObject(DEFAULT_FONT));
        GdSetFont(hdc->font->pfont);
        GdSetFont(hdc->font->pfont);
        GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
        GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
        ReleaseDC(hwnd,hdc);
        ReleaseDC(hwnd,hdc);
 
 
        return xh;
        return xh;
#else
#else
        return 12;
        return 12;
#endif
#endif
}
}
 
 
static int GetSysCharWidth (HWND hwnd)
static int GetSysCharWidth (HWND hwnd)
{
{
#ifndef USE_BIG5            
#ifndef USE_BIG5            
        HDC             hdc;
        HDC             hdc;
        int xw, xh, xb;
        int xw, xh, xb;
 
 
        hdc = GetDC(hwnd);
        hdc = GetDC(hwnd);
        SelectObject(hdc, GetStockObject(DEFAULT_FONT));
        SelectObject(hdc, GetStockObject(DEFAULT_FONT));
        GdSetFont(hdc->font->pfont);
        GdSetFont(hdc->font->pfont);
        GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
        GdGetTextSize(hdc->font->pfont,"X",1, &xw,&xh,&xb,MWTF_ASCII);
        ReleaseDC(hwnd,hdc);
        ReleaseDC(hwnd,hdc);
 
 
        return xw;
        return xw;
#else
#else
        return 6;
        return 6;
#endif
#endif
}
}
 
 
static int GetSysCCharWidth (HWND hwnd)
static int GetSysCCharWidth (HWND hwnd)
{
{
        return (2*GetSysCharWidth(hwnd));
        return (2*GetSysCharWidth(hwnd));
}
}
char* GetWindowCaption (HWND hWnd)
char* GetWindowCaption (HWND hWnd)
{
{
    return hWnd->szTitle;
    return hWnd->szTitle;
}
}
 
 
DWORD GetWindowAdditionalData (HWND hWnd)
DWORD GetWindowAdditionalData (HWND hWnd)
{
{
        return hWnd->userdata;
        return hWnd->userdata;
}
}
 
 
DWORD SetWindowAdditionalData (HWND hWnd, DWORD newData)
DWORD SetWindowAdditionalData (HWND hWnd, DWORD newData)
{
{
    DWORD    oldOne = 0L;
    DWORD    oldOne = 0L;
 
 
    oldOne = hWnd->userdata;
    oldOne = hWnd->userdata;
    hWnd->userdata = newData;
    hWnd->userdata = newData;
 
 
    return oldOne;
    return oldOne;
}
}
 
 
DWORD GetWindowAdditionalData2 (HWND hWnd)
DWORD GetWindowAdditionalData2 (HWND hWnd)
{
{
        return hWnd->userdata2;
        return hWnd->userdata2;
}
}
 
 
DWORD SetWindowAdditionalData2 (HWND hWnd, DWORD newData)
DWORD SetWindowAdditionalData2 (HWND hWnd, DWORD newData)
{
{
    DWORD    oldOne = 0L;
    DWORD    oldOne = 0L;
 
 
    oldOne = hWnd->userdata2;
    oldOne = hWnd->userdata2;
    hWnd->userdata2 = newData;
    hWnd->userdata2 = newData;
 
 
    return oldOne;
    return oldOne;
}
}
 
 
DWORD GetWindowStyle (HWND hWnd)
DWORD GetWindowStyle (HWND hWnd)
{
{
        return hWnd->style;
        return hWnd->style;
}
}
 
 
BOOL ExcludeWindowStyle (HWND hWnd, DWORD dwStyle)
BOOL ExcludeWindowStyle (HWND hWnd, DWORD dwStyle)
{
{
        if (hWnd == rootwp/*HWND_DESKTOP*/)
        if (hWnd == rootwp/*HWND_DESKTOP*/)
                return FALSE;
                return FALSE;
 
 
        hWnd->style &= ~dwStyle;
        hWnd->style &= ~dwStyle;
        return TRUE;
        return TRUE;
}
}
 
 
BOOL IncludeWindowStyle (HWND hWnd, DWORD dwStyle)
BOOL IncludeWindowStyle (HWND hWnd, DWORD dwStyle)
{
{
 
 
        if (hWnd == rootwp/*HWND_DESKTOP*/)
        if (hWnd == rootwp/*HWND_DESKTOP*/)
                return FALSE;
                return FALSE;
 
 
        hWnd->style |= dwStyle;
        hWnd->style |= dwStyle;
        return TRUE;
        return TRUE;
}
}
 
 
int WINAPI MwRegisterMEditControl(HINSTANCE hInstance)
int WINAPI MwRegisterMEditControl(HINSTANCE hInstance)
{
{
        WNDCLASS        wc;
        WNDCLASS        wc;
 
 
        wc.style        = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;
        wc.style        = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_GLOBALCLASS;
        wc.lpfnWndProc  = (WNDPROC)MLEditCtrlProc;
        wc.lpfnWndProc  = (WNDPROC)MLEditCtrlProc;
        wc.cbClsExtra   = 0;
        wc.cbClsExtra   = 0;
        wc.cbWndExtra   = 0;
        wc.cbWndExtra   = 0;
        wc.hInstance    = hInstance;
        wc.hInstance    = hInstance;
        wc.hIcon        = NULL;
        wc.hIcon        = NULL;
        wc.hCursor      = 0;
        wc.hCursor      = 0;
        wc.hbrBackground= GetStockObject(WHITE_BRUSH);
        wc.hbrBackground= GetStockObject(WHITE_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszMenuName = NULL;
        wc.lpszClassName= "MEDIT";
        wc.lpszClassName= "MEDIT";
 
 
        return RegisterClass(&wc);
        return RegisterClass(&wc);
}
}
 
 
static inline int edtGetOutWidth (HWND hWnd)
static inline int edtGetOutWidth (HWND hWnd)
{
{
        PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
        PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
        RECT rc;
        RECT rc;
        GetClientRect(hWnd,&rc);
        GetClientRect(hWnd,&rc);
    return rc.right - rc.left
    return rc.right - rc.left
            - pMLEditData->leftMargin
            - pMLEditData->leftMargin
            - pMLEditData->rightMargin;
            - pMLEditData->rightMargin;
}
}
 
 
static int edtGetStartDispPosAtEnd (HWND hWnd,
static int edtGetStartDispPosAtEnd (HWND hWnd,
            PLINEDATA pLineData)
            PLINEDATA pLineData)
{
{
    int         nOutWidth = edtGetOutWidth (hWnd);
    int         nOutWidth = edtGetOutWidth (hWnd);
    int         endPos  = pLineData->dataEnd;
    int         endPos  = pLineData->dataEnd;
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    int         newStartPos = pMLEditData->dispPos;
    int         newStartPos = pMLEditData->dispPos;
    const char* buffer = pLineData->buffer;
    const char* buffer = pLineData->buffer;
 
 
    if(endPos < newStartPos)
    if(endPos < newStartPos)
                return 0;
                return 0;
    while (TRUE)
    while (TRUE)
    {
    {
        if ((endPos - newStartPos) * GetSysCharWidth (hWnd) < nOutWidth)
        if ((endPos - newStartPos) * GetSysCharWidth (hWnd) < nOutWidth)
            break;
            break;
 
 
        /* 1st:gb:a1-f7,big5:a1-f9 */
        /* 1st:gb:a1-f7,big5:a1-f9 */
        if ((BYTE)buffer [newStartPos] > 0xA0)
        if ((BYTE)buffer [newStartPos] > 0xA0)
        {
        {
            newStartPos ++;
            newStartPos ++;
            if (newStartPos < pLineData->dataEnd)
            if (newStartPos < pLineData->dataEnd)
            {
            {
#ifndef USE_BIG5
#ifndef USE_BIG5
                if ((BYTE)buffer [newStartPos] > 0xA0)
                if ((BYTE)buffer [newStartPos] > 0xA0)
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
                if ( ((BYTE)buffer [newStartPos] >= 0x40 && (BYTE)buffer[newStartPos] <= 0x7e) ||
                if ( ((BYTE)buffer [newStartPos] >= 0x40 && (BYTE)buffer[newStartPos] <= 0x7e) ||
                     ((BYTE)buffer [newStartPos] >= 0xa1 && (BYTE)buffer[newStartPos] <= 0xfe))
                     ((BYTE)buffer [newStartPos] >= 0xa1 && (BYTE)buffer[newStartPos] <= 0xfe))
#endif
#endif
                    newStartPos ++;
                    newStartPos ++;
            }
            }
        }
        }
        else
        else
            newStartPos ++;
            newStartPos ++;
    }
    }
    return newStartPos;
    return newStartPos;
}
}
 
 
static int edtGetDispLen (HWND hWnd,PLINEDATA pLineData)
static int edtGetDispLen (HWND hWnd,PLINEDATA pLineData)
{
{
    int i, n = 0;
    int i, n = 0;
    int nOutWidth = edtGetOutWidth (hWnd);
    int nOutWidth = edtGetOutWidth (hWnd);
    int nTextWidth = 0;
    int nTextWidth = 0;
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    PMLEDITDATA pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
    const char* buffer = pLineData->buffer;
    const char* buffer = pLineData->buffer;
 
 
    if(buffer[0]==0||pLineData->dataEnd<pMLEditData->dispPos)
    if(buffer[0]==0||pLineData->dataEnd<pMLEditData->dispPos)
                return 0;
                return 0;
 
 
    for (i = pMLEditData->dispPos; i < pLineData->dataEnd; i++)
    for (i = pMLEditData->dispPos; i < pLineData->dataEnd; i++)
    {
    {
        /* 1st:gb:a1-f7,big5:a1-f9 */
        /* 1st:gb:a1-f7,big5:a1-f9 */
        if ((BYTE)buffer [i] > 0xA0)
        if ((BYTE)buffer [i] > 0xA0)
        {
        {
            i++;
            i++;
            if (i < pLineData->dataEnd)
            if (i < pLineData->dataEnd)
            {
            {
#ifndef USE_BIG5
#ifndef USE_BIG5
                if ((BYTE)buffer [i] > 0xA0)    /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
                if ((BYTE)buffer [i] > 0xA0)    /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
                if ( ((BYTE)buffer [i] >= 0x40 && (BYTE)buffer[i] <= 0x7e) ||
                if ( ((BYTE)buffer [i] >= 0x40 && (BYTE)buffer[i] <= 0x7e) ||
                     ((BYTE)buffer [i] >= 0xa1 && (BYTE)buffer[i] <= 0xfe))
                     ((BYTE)buffer [i] >= 0xa1 && (BYTE)buffer[i] <= 0xfe))
#endif
#endif
                {
                {
                    nTextWidth += GetSysCCharWidth (hWnd);
                    nTextWidth += GetSysCCharWidth (hWnd);
                    n += 2;
                    n += 2;
                }
                }
                else
                else
                    i--;
                    i--;
            }
            }
            else
            else
            {
            {
                nTextWidth += GetSysCharWidth (hWnd);
                nTextWidth += GetSysCharWidth (hWnd);
                n++;
                n++;
            }
            }
        }
        }
        else
        else
        {
        {
            nTextWidth += GetSysCharWidth (hWnd);
            nTextWidth += GetSysCharWidth (hWnd);
            n++;
            n++;
        }
        }
 
 
        if (nTextWidth > nOutWidth)
        if (nTextWidth > nOutWidth)
            break;
            break;
    }
    }
 
 
    return n;
    return n;
}
}
 
 
static int edtGetOffset (HWND hwnd,const MLEDITDATA* pMLEditData, PLINEDATA pLineData, int x)
static int edtGetOffset (HWND hwnd,const MLEDITDATA* pMLEditData, PLINEDATA pLineData, int x)
{
{
    int i;
    int i;
    int newOff = 0;
    int newOff = 0;
    int nTextWidth = 0;
    int nTextWidth = 0;
    const char* buffer = pLineData->buffer;
    const char* buffer = pLineData->buffer;
 
 
    if(pLineData->dataEnd<pMLEditData->dispPos)
    if(pLineData->dataEnd<pMLEditData->dispPos)
                return pLineData->dataEnd;
                return pLineData->dataEnd;
 
 
    x -= pMLEditData->leftMargin;
    x -= pMLEditData->leftMargin;
    for (i = pMLEditData->dispPos; i < pLineData->dataEnd; i++) {
    for (i = pMLEditData->dispPos; i < pLineData->dataEnd; i++) {
        if ((nTextWidth + (GetSysCharWidth(hwnd) >> 1)) >= x)
        if ((nTextWidth + (GetSysCharWidth(hwnd) >> 1)) >= x)
            break;
            break;
 
 
        /* 1st:gb:a1-f7,big5:a1-f9 */
        /* 1st:gb:a1-f7,big5:a1-f9 */
        if ((BYTE)buffer [i] > 0xA0)
        if ((BYTE)buffer [i] > 0xA0)
        {
        {
            i++;
            i++;
 
 
            if (nTextWidth + GetSysCCharWidth(hwnd)/2 >= x)
            if (nTextWidth + GetSysCCharWidth(hwnd)/2 >= x)
                break;
                break;
 
 
            if (i < pLineData->dataEnd)
            if (i < pLineData->dataEnd)
            {
            {
#ifndef USE_BIG5
#ifndef USE_BIG5
                if ((BYTE)buffer [i] > 0xA0)    /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
                if ((BYTE)buffer [i] > 0xA0)    /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
#else   /* 2nd:gb:a1-fe,big5:40-7e,a1-fe */
                if ( ((BYTE)buffer [i] >= 0x40 && (BYTE)buffer[i] <= 0x7e) ||
                if ( ((BYTE)buffer [i] >= 0x40 && (BYTE)buffer[i] <= 0x7e) ||
                     ((BYTE)buffer [i] >= 0xa1 && (BYTE)buffer[i] <= 0xfe))
                     ((BYTE)buffer [i] >= 0xa1 && (BYTE)buffer[i] <= 0xfe))
#endif
#endif
                {
                {
                    nTextWidth += GetSysCCharWidth (hwnd);
                    nTextWidth += GetSysCCharWidth (hwnd);
                    newOff += 2;
                    newOff += 2;
                }
                }
                else
                else
                    i --;
                    i --;
            }
            }
            else
            else
            {
            {
                nTextWidth += GetSysCharWidth (hwnd);
                nTextWidth += GetSysCharWidth (hwnd);
                newOff ++;
                newOff ++;
            }
            }
        }
        }
        else
        else
        {
        {
            nTextWidth += GetSysCharWidth (hwnd);
            nTextWidth += GetSysCharWidth (hwnd);
            newOff ++;
            newOff ++;
        }
        }
    }
    }
    return newOff;
    return newOff;
}
}
 
 
static int edtGetLineNO (HWND hwnd,const MLEDITDATA* pMLEditData, int x)
static int edtGetLineNO (HWND hwnd,const MLEDITDATA* pMLEditData, int x)
{
{
    int nline = 0;
    int nline = 0;
        if(x>=0)
        if(x>=0)
        {
        {
            nline = x / GetSysCharHeight(hwnd);
            nline = x / GetSysCharHeight(hwnd);
                if (nline <= pMLEditData->linesDisp)
                if (nline <= pMLEditData->linesDisp)
                        return nline;
                        return nline;
        }
        }
        return -1;
        return -1;
}
}
 
 
static BOOL edtIsACCharAtPosition (const char* string, int len, int pos)
static BOOL edtIsACCharAtPosition (const char* string, int len, int pos)
{
{
    if (pos > (len - 2))
    if (pos > (len - 2))
        return FALSE;
        return FALSE;
 
 
/* 1st:gb:a1-f7,big5:a1-f9  2nd:gb:a1-fe,big5:40-7e,a1-fe */
/* 1st:gb:a1-f7,big5:a1-f9  2nd:gb:a1-fe,big5:40-7e,a1-fe */
#ifndef USE_BIG5
#ifndef USE_BIG5
    if ((BYTE)string [pos] > 0xA0 && (BYTE)string [pos + 1] > 0xA0)
    if ((BYTE)string [pos] > 0xA0 && (BYTE)string [pos + 1] > 0xA0)
        return TRUE;
        return TRUE;
#else
#else
    if ((BYTE)string [pos] > 0xA0)
    if ((BYTE)string [pos] > 0xA0)
    {
    {
        if ( ((BYTE)string [pos + 1] >= 0x40 && (BYTE)string [pos + 1] <= 0x7e) ||
        if ( ((BYTE)string [pos + 1] >= 0x40 && (BYTE)string [pos + 1] <= 0x7e) ||
             ((BYTE)string [pos + 1] >= 0xa1 && (BYTE)string [pos + 1] <= 0xfe)) {
             ((BYTE)string [pos + 1] >= 0xa1 && (BYTE)string [pos + 1] <= 0xfe)) {
            /*fprintf(stderr,"true\n");
            /*fprintf(stderr,"true\n");
            fflush(stderr);*/
            fflush(stderr);*/
            return TRUE;
            return TRUE;
        }
        }
    }
    }
#endif
#endif
 
 
    return FALSE;
    return FALSE;
}
}
 
 
static void str2attr(const char* str,int len)
static void str2attr(const char* str,int len)
{
{
    int i=0;
    int i=0;
    do
    do
    {
    {
        if (edtIsACCharAtPosition(str,len,i))
        if (edtIsACCharAtPosition(str,len,i))
        {
        {
                attr[i]=ATTCHL;
                attr[i]=ATTCHL;
                attr[i+1]=ATTCHR;
                attr[i+1]=ATTCHR;
                i+=2;
                i+=2;
        }
        }
        else
        else
        {
        {
                attr[i]=ATTENG;
                attr[i]=ATTENG;
                i++;
                i++;
        }
        }
    }while(i<len);
    }while(i<len);
}
}
 
 
static BOOL edtIsACCharBeforePosition (const char* string,int len, int pos)
static BOOL edtIsACCharBeforePosition (const char* string,int len, int pos)
{
{
    if (pos < 2)
    if (pos < 2)
        return FALSE;
        return FALSE;
 
 
/* 1st:gb:a1-f7,big5:a1-f9  2nd:gb:a1-fe,big5:40-7e,a1-fe */
/* 1st:gb:a1-f7,big5:a1-f9  2nd:gb:a1-fe,big5:40-7e,a1-fe */
#ifndef USE_BIG5
#ifndef USE_BIG5
    /* FIXME #ifdef GB2312?*/
    /* FIXME #ifdef GB2312?*/
    if ((BYTE)string [pos - 2] > 0xA0 && (BYTE)string [pos - 1] > 0xA0)
    if ((BYTE)string [pos - 2] > 0xA0 && (BYTE)string [pos - 1] > 0xA0)
        return TRUE;
        return TRUE;
#else
#else
#if 0
#if 0
    if ((BYTE)string [pos - 2] > 0xA0)
    if ((BYTE)string [pos - 2] > 0xA0)
    {
    {
        if ( ((BYTE)string [pos - 1] >= 0x40 && (BYTE)string[pos - 1] <= 0x7e) ||
        if ( ((BYTE)string [pos - 1] >= 0x40 && (BYTE)string[pos - 1] <= 0x7e) ||
             ((BYTE)string [pos - 1] >= 0xa1 && (BYTE)string[pos - 1] <= 0xfe))
             ((BYTE)string [pos - 1] >= 0xa1 && (BYTE)string[pos - 1] <= 0xfe))
            return TRUE;
            return TRUE;
    }
    }
#else
#else
    str2attr(string,len);
    str2attr(string,len);
    if (attr[pos-1]==ATTENG) return FALSE;
    if (attr[pos-1]==ATTENG) return FALSE;
    else return TRUE;
    else return TRUE;
#endif
#endif
#endif
#endif
 
 
    return FALSE;
    return FALSE;
}
}
 
 
 
 
static BOOL edtIsACCharFromBegin(const char* string,int len,int pos)
static BOOL edtIsACCharFromBegin(const char* string,int len,int pos)
{
{
        int i;
        int i;
        if(pos == 0)
        if(pos == 0)
                return TRUE;
                return TRUE;
        if(len == 0)
        if(len == 0)
                return FALSE;
                return FALSE;
        for(i=0;i<len;)
        for(i=0;i<len;)
        {
        {
                if( edtIsACCharAtPosition(string,len,i) )
                if( edtIsACCharAtPosition(string,len,i) )
                        i += 2;
                        i += 2;
                else
                else
                        i++;
                        i++;
                if(i==pos)
                if(i==pos)
                        return TRUE;
                        return TRUE;
        }
        }
        return FALSE;
        return FALSE;
}
}
 
 
int GetRETURNPos(char *str)
int GetRETURNPos(char *str)
{
{
        int i;
        int i;
        for(i=0;i<strlen(str);i++)
        for(i=0;i<strlen(str);i++)
        {
        {
                if(str[i]==10)
                if(str[i]==10)
                        return i;
                        return i;
        }
        }
        return -1;
        return -1;
}
}
 
 
void MLEditInitBuffer (PMLEDITDATA pMLEditData,char *spcaption)
void MLEditInitBuffer (PMLEDITDATA pMLEditData,char *spcaption)
{
{
        char *caption=spcaption;
        char *caption=spcaption;
    int off1;
    int off1;
        int lineNO=0;
        int lineNO=0;
        PLINEDATA  pLineData;
        PLINEDATA  pLineData;
        if (!(pMLEditData->head = malloc (sizeof (LINEDATA)))) {
        if (!(pMLEditData->head = malloc (sizeof (LINEDATA)))) {
                fprintf (stderr, "EDITLINE: malloc error!\n");
                fprintf (stderr, "EDITLINE: malloc error!\n");
                return ;
                return ;
        }
        }
        pMLEditData->head->previous = NULL;
        pMLEditData->head->previous = NULL;
        pLineData=pMLEditData->head;
        pLineData=pMLEditData->head;
        while ( (off1 = GetRETURNPos(caption)) != -1)
        while ( (off1 = GetRETURNPos(caption)) != -1)
        {
        {
                off1 = min(off1, LEN_MLEDIT_BUFFER);
                off1 = min(off1, LEN_MLEDIT_BUFFER);
                memcpy(pLineData->buffer,caption,off1);
                memcpy(pLineData->buffer,caption,off1);
                pLineData->buffer[off1] = '\0';
                pLineData->buffer[off1] = '\0';
                caption+=min(off1,LEN_MLEDIT_BUFFER)+1;
                caption+=min(off1,LEN_MLEDIT_BUFFER)+1;
                pLineData->lineNO  = lineNO;
                pLineData->lineNO  = lineNO;
                pMLEditData->dispPos = 0;
                pMLEditData->dispPos = 0;
                pLineData->dataEnd = strlen(pLineData->buffer);
                pLineData->dataEnd = strlen(pLineData->buffer);
                pLineData->next    = malloc (sizeof (LINEDATA));
                pLineData->next    = malloc (sizeof (LINEDATA));
                pLineData->next->previous = pLineData;
                pLineData->next->previous = pLineData;
                pLineData = pLineData->next;
                pLineData = pLineData->next;
                lineNO++;
                lineNO++;
        }
        }
        off1 = min(strlen(caption),LEN_MLEDIT_BUFFER);
        off1 = min(strlen(caption),LEN_MLEDIT_BUFFER);
        memcpy(pLineData->buffer,caption,off1);
        memcpy(pLineData->buffer,caption,off1);
        pLineData->buffer[off1] = '\0';
        pLineData->buffer[off1] = '\0';
        pLineData->lineNO  = lineNO++;
        pLineData->lineNO  = lineNO++;
        pMLEditData->dispPos = 0;
        pMLEditData->dispPos = 0;
        pLineData->dataEnd = strlen(pLineData->buffer);
        pLineData->dataEnd = strlen(pLineData->buffer);
        pLineData->next    = NULL;
        pLineData->next    = NULL;
        pMLEditData->lines      = lineNO ;
        pMLEditData->lines      = lineNO ;
}
}
 
 
PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO)
PLINEDATA GetLineData(PMLEDITDATA pMLEditData,int lineNO)
{
{
        PLINEDATA pLineData=pMLEditData->head;
        PLINEDATA pLineData=pMLEditData->head;
        while(pLineData)
        while(pLineData)
        {
        {
                if(pLineData->lineNO==lineNO)
                if(pLineData->lineNO==lineNO)
                        return pLineData;
                        return pLineData;
                pLineData = pLineData->next;
                pLineData = pLineData->next;
        }
        }
        return NULL;
        return NULL;
}
}
 
 
int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
int MLEditCtrlProc (HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
{
    DWORD       dwStyle;
    DWORD       dwStyle;
        DWORD           dw;
        DWORD           dw;
    HDC         hdc;
    HDC         hdc;
        PLINEDATA  pLineData;
        PLINEDATA  pLineData;
        RECT            clientRect;
        RECT            clientRect;
    PMLEDITDATA pMLEditData;
    PMLEDITDATA pMLEditData;
    dwStyle     = GetWindowStyle(hWnd);
    dwStyle     = GetWindowStyle(hWnd);
 
 
    switch (message)
    switch (message)
    {
    {
        case WM_CREATE:
        case WM_CREATE:
        {
        {
            if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) {
            if (!(pMLEditData = malloc (sizeof (MLEDITDATA)))) {
                fprintf (stderr, "EDIT: malloc error!\n");
                fprintf (stderr, "EDIT: malloc error!\n");
                return -1;
                return -1;
            }
            }
 
 
            pMLEditData->totalLen      = LEN_MLEDIT_BUFFER;
            pMLEditData->totalLen      = LEN_MLEDIT_BUFFER;
            pMLEditData->editPos        = 0;
            pMLEditData->editPos        = 0;
            pMLEditData->editLine       = 0;
            pMLEditData->editLine       = 0;
            pMLEditData->caretPos       = 0;
            pMLEditData->caretPos       = 0;
 
 
            MLEditInitBuffer(pMLEditData,GetWindowCaption(hWnd));
            MLEditInitBuffer(pMLEditData,GetWindowCaption(hWnd));
 
 
            GetClientRect(hWnd,&clientRect);
            GetClientRect(hWnd,&clientRect);
            pMLEditData->MaxlinesDisp   = (clientRect.bottom-clientRect.top)/GetSysCharHeight(hWnd);
            pMLEditData->MaxlinesDisp   = (clientRect.bottom-clientRect.top)/GetSysCharHeight(hWnd);
            pMLEditData->linesDisp              = min(pMLEditData->MaxlinesDisp,pMLEditData->lines);
            pMLEditData->linesDisp              = min(pMLEditData->MaxlinesDisp,pMLEditData->lines);
            pMLEditData->StartlineDisp  = 0;
            pMLEditData->StartlineDisp  = 0;
            pMLEditData->EndlineDisp    = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;
            pMLEditData->EndlineDisp    = pMLEditData->StartlineDisp + pMLEditData->linesDisp - 1;
 
 
            pMLEditData->selStartPos       = 0;
            pMLEditData->selStartPos       = 0;
            pMLEditData->selEndPos         = 0;
            pMLEditData->selEndPos         = 0;
            pMLEditData->passwdChar     = '*';
            pMLEditData->passwdChar     = '*';
            pMLEditData->leftMargin     = MARGIN_MEDIT_LEFT;
            pMLEditData->leftMargin     = MARGIN_MEDIT_LEFT;
            pMLEditData->topMargin      = MARGIN_MEDIT_TOP;
            pMLEditData->topMargin      = MARGIN_MEDIT_TOP;
            pMLEditData->rightMargin    = MARGIN_MEDIT_RIGHT;
            pMLEditData->rightMargin    = MARGIN_MEDIT_RIGHT;
            pMLEditData->bottomMargin   = MARGIN_MEDIT_BOTTOM;
            pMLEditData->bottomMargin   = MARGIN_MEDIT_BOTTOM;
 
 
            pMLEditData->hardLimit      = -1;
            pMLEditData->hardLimit      = -1;
 
 
            /* undo information */
            /* undo information */
            pMLEditData->lastOp         = MEDIT_OP_NONE;
            pMLEditData->lastOp         = MEDIT_OP_NONE;
            pMLEditData->lastPos        = 0;
            pMLEditData->lastPos        = 0;
            pMLEditData->affectedLen    = 0;
            pMLEditData->affectedLen    = 0;
            pMLEditData->undoBufferLen  = LEN_MLEDIT_UNDOBUFFER;
            pMLEditData->undoBufferLen  = LEN_MLEDIT_UNDOBUFFER;
            pMLEditData->undoBuffer [0] = '\0';
            pMLEditData->undoBuffer [0] = '\0';
                        SetWindowAdditionalData2(hWnd,(DWORD)pMLEditData);
                        SetWindowAdditionalData2(hWnd,(DWORD)pMLEditData);
                        SetWindowAdditionalData(hWnd,(DWORD)0);
                        SetWindowAdditionalData(hWnd,(DWORD)0);
            break;
            break;
        }
        }
        case WM_DESTROY:
        case WM_DESTROY:
        {
        {
                PLINEDATA temp;
                PLINEDATA temp;
                pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
                pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
                DestroyCaret ();
                DestroyCaret ();
                pLineData = pMLEditData->head;
                pLineData = pMLEditData->head;
                while(pLineData)
                while(pLineData)
                {
                {
                        /*printf("delete lineNO = %d,buffer=%s\n",pLineData->lineNO,pLineData->buffer);*/
                        /*printf("delete lineNO = %d,buffer=%s\n",pLineData->lineNO,pLineData->buffer);*/
                        temp = pLineData->next;
                        temp = pLineData->next;
                        free(pLineData);
                        free(pLineData);
                        pLineData = temp;
                        pLineData = temp;
                }
                }
                free(pMLEditData);
                free(pMLEditData);
        }
        }
        break;
        break;
 
 
        case WM_SETFONT:
        case WM_SETFONT:
        break;
        break;
 
 
        case WM_GETFONT:
        case WM_GETFONT:
        break;
        break;
 
 
#if 0   /* fix: no WM_SETCURSOR */
#if 0   /* fix: no WM_SETCURSOR */
        case WM_SETCURSOR:
        case WM_SETCURSOR:
            if (dwStyle & WS_DISABLED) {
            if (dwStyle & WS_DISABLED) {
                SetCursor (GetSystemCursor (IDC_ARROW));
                SetCursor (GetSystemCursor (IDC_ARROW));
                return 0;
                return 0;
            }
            }
        break;
        break;
 
 
        case WM_SIZECHANGED:
        case WM_SIZECHANGED:
        {
        {
        }
        }
        return 0;
        return 0;
#endif
#endif
        case WM_KILLFOCUS:
        case WM_KILLFOCUS:
        {
        {
            dw= GetWindowAdditionalData(hWnd);
            dw= GetWindowAdditionalData(hWnd);
            dw&= ~EST_FOCUSED;
            dw&= ~EST_FOCUSED;
            SetWindowAdditionalData(hWnd,dw);
            SetWindowAdditionalData(hWnd,dw);
 
 
            HideCaret (hWnd);
            HideCaret (hWnd);
            DestroyCaret ();
            DestroyCaret ();
 
 
            SendMessage (GetParent (hWnd),
            SendMessage (GetParent (hWnd),
                         WM_COMMAND,
                         WM_COMMAND,
                         (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_KILLFOCUS),
                         (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_KILLFOCUS),
                         (LPARAM)hWnd);
                         (LPARAM)hWnd);
        }
        }
        break;
        break;
 
 
        case WM_SETFOCUS:
        case WM_SETFOCUS:
                {
                {
                        dw= GetWindowAdditionalData(hWnd);
                        dw= GetWindowAdditionalData(hWnd);
            if (dw & EST_FOCUSED)
            if (dw & EST_FOCUSED)
                return 0;
                return 0;
 
 
            dw |= EST_FOCUSED;
            dw |= EST_FOCUSED;
                        SetWindowAdditionalData(hWnd,dw);
                        SetWindowAdditionalData(hWnd,dw);
 
 
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
 
 
            /* only implemented for ES_LEFT align format. */
            /* only implemented for ES_LEFT align format. */
 
 
            CreateCaret (hWnd, NULL, 1, /*GetSysCharWidth(hWnd)+1,*/
            CreateCaret (hWnd, NULL, 1, /*GetSysCharWidth(hWnd)+1,*/
                    hWnd->clirect.bottom-hWnd->clirect.top-2);
                    hWnd->clirect.bottom-hWnd->clirect.top-2);
            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    + pMLEditData->leftMargin, pMLEditData->topMargin);
                    + pMLEditData->leftMargin, pMLEditData->topMargin);
            ShowCaret(hWnd);
            ShowCaret(hWnd);
 
 
            SendMessage (GetParent (hWnd),
            SendMessage (GetParent (hWnd),
                         WM_COMMAND,
                         WM_COMMAND,
                         (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_SETFOCUS),
                         (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_SETFOCUS),
                         (LPARAM) hWnd);
                         (LPARAM) hWnd);
                }
                }
        break;
        break;
 
 
        case WM_ENABLE:
        case WM_ENABLE:
            if ( (!(dwStyle & WS_DISABLED) && !wParam)
            if ( (!(dwStyle & WS_DISABLED) && !wParam)
                    || ((dwStyle & WS_DISABLED) && wParam) ) {
                    || ((dwStyle & WS_DISABLED) && wParam) ) {
                if (wParam)
                if (wParam)
                        ExcludeWindowStyle(hWnd,WS_DISABLED);
                        ExcludeWindowStyle(hWnd,WS_DISABLED);
                else
                else
                        IncludeWindowStyle(hWnd,WS_DISABLED);
                        IncludeWindowStyle(hWnd,WS_DISABLED);
 
 
                InvalidateRect (hWnd, NULL, FALSE);
                InvalidateRect (hWnd, NULL, FALSE);
            }
            }
        return 0;
        return 0;
 
 
        case WM_NCPAINT:
        case WM_NCPAINT:
        {
        {
            RECT rc;
            RECT rc;
#if 0
#if 0
            if (wParam)
            if (wParam)
                hdc = (HDC)wParam;
                hdc = (HDC)wParam;
            else
            else
                hdc = GetDC (hWnd);
                hdc = GetDC (hWnd);
#if 0   /* fix: no ClipRectIntersect() */
#if 0   /* fix: no ClipRectIntersect() */
            if (lParam)
            if (lParam)
            ClipRectIntersect (hdc, (RECT*)lParam);
            ClipRectIntersect (hdc, (RECT*)lParam);
#endif
#endif
#else
#else
            hdc = wParam? (HDC)wParam: GetWindowDC (hWnd);
            hdc = wParam? (HDC)wParam: GetWindowDC (hWnd);
            GetWindowRect(hWnd, &rc);
            GetWindowRect(hWnd, &rc);
#endif
#endif
            if (dwStyle & WS_BORDER)
            if (dwStyle & WS_BORDER)
            {
            {
#if 0
#if 0
                RECT rc;
                RECT rc;
                GetWindowRect(hWnd,&rc);
                GetWindowRect(hWnd,&rc);
                Draw3DDownFrame (hdc, 0, 0,
                Draw3DDownFrame (hdc, 0, 0,
                                      rc.right - rc.left - 1,
                                      rc.right - rc.left - 1,
                                      rc.bottom - rc.top - 1,
                                      rc.bottom - rc.top - 1,
                                      PIXEL_invalid);
                                      PIXEL_invalid);
#else
#else
                Draw3dInset(hdc, rc.left, rc.top,
                Draw3dInset(hdc, rc.left, rc.top,
                        rc.right-rc.left, rc.bottom-rc.top);
                        rc.right-rc.left, rc.bottom-rc.top);
#endif
#endif
            }
            }
            if (!wParam) {
            if (!wParam) {
                ReleaseDC(hWnd,hdc);
                ReleaseDC(hWnd,hdc);
                }
                }
        }
        }
        return 0;
        return 0;
 
 
        case WM_PAINT:
        case WM_PAINT:
        {
        {
            int     dispLen,i;
            int     dispLen,i;
            char*   dispBuffer;
            char*   dispBuffer;
            RECT    rect,rc;
            RECT    rect,rc;
            PAINTSTRUCT ps;
            PAINTSTRUCT ps;
            HGDIOBJ oldfont=NULL;
            HGDIOBJ oldfont=NULL;
 
 
            hdc = BeginPaint (hWnd,&ps);
            hdc = BeginPaint (hWnd,&ps);
            GetClientRect (hWnd, &rect);
            GetClientRect (hWnd, &rect);
 
 
            if (dwStyle & WS_DISABLED)
            if (dwStyle & WS_DISABLED)
            {
            {
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));
                FillRect(hdc,&rc,GetStockObject(LTGRAY_BRUSH));
                SetBkColor (hdc, LTGRAY/*PIXEL_lightgray*/);
                SetBkColor (hdc, LTGRAY/*PIXEL_lightgray*/);
            }
            }
            else {
            else {
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                rc.left=0; rc.top=0; rc.bottom=rect.bottom; rc.right=rect.right;
                FillRect(hdc,&rc,GetStockObject(WHITE_BRUSH));
                FillRect(hdc,&rc,GetStockObject(WHITE_BRUSH));
                SetBkColor (hdc, WHITE/*PIXEL_lightwhite*/);
                SetBkColor (hdc, WHITE/*PIXEL_lightwhite*/);
            }
            }
 
 
            SetTextColor (hdc, BLACK/*PIXEL_black*/);
            SetTextColor (hdc, BLACK/*PIXEL_black*/);
 
 
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
                        for(i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++)
                        for(i = pMLEditData->StartlineDisp; i <= pMLEditData->EndlineDisp; i++)
                        {
                        {
                                pLineData= GetLineData(pMLEditData,i);
                                pLineData= GetLineData(pMLEditData,i);
                dispLen = edtGetDispLen (hWnd,pLineData);
                dispLen = edtGetDispLen (hWnd,pLineData);
                    if (dispLen == 0 && pMLEditData->EndlineDisp >= pMLEditData->lines) {
                    if (dispLen == 0 && pMLEditData->EndlineDisp >= pMLEditData->lines) {
                        continue;
                        continue;
                         }
                         }
 
 
#ifdef _DEBUG
#ifdef _DEBUG
                if (pMLEditData->dispPos > pLineData->dataEnd)
                if (pMLEditData->dispPos > pLineData->dataEnd)
                        fprintf (stderr, "ASSERT failure: %s.\n", "Edit Paint");
                        fprintf (stderr, "ASSERT failure: %s.\n", "Edit Paint");
#endif
#endif
 
 
                dispBuffer = alloca (LEN_MLEDIT_BUFFER+1);
                dispBuffer = alloca (LEN_MLEDIT_BUFFER+1);
 
 
                if (dwStyle & ES_PASSWORD)
                if (dwStyle & ES_PASSWORD)
                    memset (dispBuffer, '*', pLineData->dataEnd);
                    memset (dispBuffer, '*', pLineData->dataEnd);
                                    memcpy (dispBuffer,
                                    memcpy (dispBuffer,
                            pLineData->buffer,  /* +pMLEditData->dispPos, */
                            pLineData->buffer,  /* +pMLEditData->dispPos, */
                                                pLineData->dataEnd);    /* - pMLEditData->dispPos); */
                                                pLineData->dataEnd);    /* - pMLEditData->dispPos); */
                        dispBuffer[pLineData->dataEnd] = '\0';
                        dispBuffer[pLineData->dataEnd] = '\0';
 
 
            /* only implemented ES_LEFT align format for single line edit. */
            /* only implemented ES_LEFT align format for single line edit. */
                rect.left = pMLEditData->leftMargin;
                rect.left = pMLEditData->leftMargin;
                rect.top = pMLEditData->topMargin ;
                rect.top = pMLEditData->topMargin ;
                rect.right = pMLEditData->rightMargin;
                rect.right = pMLEditData->rightMargin;
                rect.bottom = pMLEditData->bottomMargin;
                rect.bottom = pMLEditData->bottomMargin;
#if 0
#if 0
                printf("lineNO=%d,lines=%d,editLine=%d\n",pLineData->lineNO,pMLEditData->lines,
                printf("lineNO=%d,lines=%d,editLine=%d\n",pLineData->lineNO,pMLEditData->lines,
                        pMLEditData->editLine);
                        pMLEditData->editLine);
                printf("--dispBuffer=%s--\n",dispBuffer);
                printf("--dispBuffer=%s--\n",dispBuffer);
                ClipRectIntersect (hdc, &rect); /* fix: no ClipRectIntersect() */
                ClipRectIntersect (hdc, &rect); /* fix: no ClipRectIntersect() */
#endif
#endif
 
 
#ifdef USE_BIG5     
#ifdef USE_BIG5     
            oldfont=SelectObject(hdc,CreateFont(12,
            oldfont=SelectObject(hdc,CreateFont(12,
                        0,0,0,0,0,0,0,0,0,0,0,
                        0,0,0,0,0,0,0,0,0,0,0,
                        FF_DONTCARE|DEFAULT_PITCH,
                        FF_DONTCARE|DEFAULT_PITCH,
                        "HZXFONT"));
                        "HZXFONT"));
#endif
#endif
                TextOut (hdc,
                TextOut (hdc,
                                pMLEditData->leftMargin - pMLEditData->dispPos * GetSysCharWidth(hWnd) ,
                                pMLEditData->leftMargin - pMLEditData->dispPos * GetSysCharWidth(hWnd) ,
                                GetSysCharHeight(hWnd)*(pLineData->lineNO - pMLEditData->StartlineDisp)
                                GetSysCharHeight(hWnd)*(pLineData->lineNO - pMLEditData->StartlineDisp)
                                        + pMLEditData->topMargin,
                                        + pMLEditData->topMargin,
                                dispBuffer,-1);
                                dispBuffer,-1);
                        }
                        }
#ifdef USE_BIG5     
#ifdef USE_BIG5     
            DeleteObject(SelectObject(hdc,oldfont));
            DeleteObject(SelectObject(hdc,oldfont));
#endif
#endif
            EndPaint (hWnd, &ps);
            EndPaint (hWnd, &ps);
        }
        }
        break;
        break;
 
 
        case WM_KEYDOWN:
        case WM_KEYDOWN:
        {
        {
            BOOL    bChange = FALSE;
            BOOL    bChange = FALSE;
            int     i;
            int     i;
            int     deleted;
            int     deleted;
                        PLINEDATA temp = NULL;
                        PLINEDATA temp = NULL;
                        char *  tempP = NULL;
                        char *  tempP = NULL;
 
 
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
            pMLEditData =(PMLEDITDATA) GetWindowAdditionalData2(hWnd);
 
 
            switch (LOWORD (wParam))
            switch (LOWORD (wParam))
            {
            {
 
 
                case VK_RETURN:         /* SCANCODE_ENTER: */
                case VK_RETURN:         /* SCANCODE_ENTER: */
                                {
                                {
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        if (pMLEditData->editPos < pLineData->dataEnd)
                                        if (pMLEditData->editPos < pLineData->dataEnd)
                                                tempP = pLineData->buffer + pMLEditData->editPos;
                                                tempP = pLineData->buffer + pMLEditData->editPos;
                                    temp = pLineData->next;
                                    temp = pLineData->next;
                                        pLineData->next = malloc( sizeof(LINEDATA) );
                                        pLineData->next = malloc( sizeof(LINEDATA) );
                                        pLineData->next->previous = pLineData;
                                        pLineData->next->previous = pLineData;
                                        pLineData->next->next = temp;
                                        pLineData->next->next = temp;
                                        if(temp)
                                        if(temp)
                                        {
                                        {
                                                temp->previous = pLineData->next;
                                                temp->previous = pLineData->next;
                                        }
                                        }
                                        temp = pLineData->next;
                                        temp = pLineData->next;
                                        temp->lineNO  = pMLEditData->editLine + 1;
                                        temp->lineNO  = pMLEditData->editLine + 1;
                                        if(tempP)
                                        if(tempP)
                                        {
                                        {
                                                memcpy(temp->buffer,tempP,strlen(tempP));
                                                memcpy(temp->buffer,tempP,strlen(tempP));
                                                temp->dataEnd = strlen(tempP);
                                                temp->dataEnd = strlen(tempP);
                                        }
                                        }
                                        else
                                        else
                                                temp->dataEnd = 0;
                                                temp->dataEnd = 0;
                                        temp->buffer[temp->dataEnd] = '\0';
                                        temp->buffer[temp->dataEnd] = '\0';
                                        pLineData->dataEnd = pMLEditData->editPos;
                                        pLineData->dataEnd = pMLEditData->editPos;
                                        pLineData->buffer[pLineData->dataEnd]='\0';
                                        pLineData->buffer[pLineData->dataEnd]='\0';
                                        temp = temp->next;
                                        temp = temp->next;
                                        while (temp)
                                        while (temp)
                                        {
                                        {
                                                temp->lineNO++;
                                                temp->lineNO++;
                                                temp = temp->next;
                                                temp = temp->next;
                                        }
                                        }
                                        pMLEditData->editPos = 0;
                                        pMLEditData->editPos = 0;
                                        pMLEditData->caretPos= 0;
                                        pMLEditData->caretPos= 0;
                                        pMLEditData->dispPos = 0;
                                        pMLEditData->dispPos = 0;
                                        if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)
                                        if(pMLEditData->linesDisp < pMLEditData->MaxlinesDisp)
                                        {
                                        {
                                                pMLEditData->EndlineDisp++;
                                                pMLEditData->EndlineDisp++;
                                                pMLEditData->linesDisp++;
                                                pMLEditData->linesDisp++;
                                        }
                                        }
                                        else if(pMLEditData->editLine == pMLEditData->EndlineDisp)
                                        else if(pMLEditData->editLine == pMLEditData->EndlineDisp)
                                        {
                                        {
                                                pMLEditData->StartlineDisp++;
                                                pMLEditData->StartlineDisp++;
                                                pMLEditData->EndlineDisp++;
                                                pMLEditData->EndlineDisp++;
                                        }
                                        }
                                        pMLEditData->editLine++;
                                        pMLEditData->editLine++;
                                        pMLEditData->lines++;
                                        pMLEditData->lines++;
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                                        +pMLEditData->topMargin);
                                                        +pMLEditData->topMargin);
                    InvalidateRect (hWnd, NULL, FALSE);
                    InvalidateRect (hWnd, NULL, FALSE);
                        return 0;
                        return 0;
                                }
                                }
                case VK_HOME:   /* SCANCODE_HOME: */
                case VK_HOME:   /* SCANCODE_HOME: */
                                {
                                {
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                    if (pMLEditData->editPos == 0)
                    if (pMLEditData->editPos == 0)
                        return 0;
                        return 0;
 
 
                    pMLEditData->editPos  = 0;
                    pMLEditData->editPos  = 0;
                    pMLEditData->caretPos = 0;
                    pMLEditData->caretPos = 0;
 
 
                    SetCaretPos (pMLEditData->leftMargin,
                    SetCaretPos (pMLEditData->leftMargin,
                        (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                        (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                                        +pMLEditData->topMargin);
                                                        +pMLEditData->topMargin);
                                        temp = GetLineData(pMLEditData,pMLEditData->editLine);
                                        temp = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->dispPos != 0)
                    if (pMLEditData->dispPos != 0)
                                        {
                                        {
                                                pMLEditData->dispPos = 0;
                                                pMLEditData->dispPos = 0;
                                            InvalidateRect (hWnd, NULL, FALSE);
                                            InvalidateRect (hWnd, NULL, FALSE);
                                        }
                                        }
                        return 0;
                        return 0;
                }
                }
                case VK_END: /* SCANCODE_END: */
                case VK_END: /* SCANCODE_END: */
                {
                {
                    int newStartPos;
                    int newStartPos;
                    pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == pLineData->dataEnd)
                    if (pMLEditData->editPos == pLineData->dataEnd)
                        return 0;
                        return 0;
                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);
                    newStartPos = edtGetStartDispPosAtEnd (hWnd, pLineData);
 
 
                    pMLEditData->editPos = pLineData->dataEnd;
                    pMLEditData->editPos = pLineData->dataEnd;
                    pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                    pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
 
 
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                                (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                                (pMLEditData->editLine-pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                + pMLEditData->topMargin);
                                + pMLEditData->topMargin);
 
 
                    if (pMLEditData->dispPos != newStartPos)
                    if (pMLEditData->dispPos != newStartPos)
                        InvalidateRect (hWnd, NULL, FALSE);
                        InvalidateRect (hWnd, NULL, FALSE);
                                        pMLEditData->dispPos = newStartPos;
                                        pMLEditData->dispPos = newStartPos;
                }
                }
                return 0;
                return 0;
 
 
                case VK_LEFT: /* SCANCODE_CURSORBLOCKLEFT: */
                case VK_LEFT: /* SCANCODE_CURSORBLOCKLEFT: */
                {
                {
                    BOOL bScroll = FALSE;
                    BOOL bScroll = FALSE;
                    int  scrollStep,newStartPos;
                    int  scrollStep,newStartPos;
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == 0 )
                    if (pMLEditData->editPos == 0 )
                                        {
                                        {
                                                temp = pLineData->previous;
                                                temp = pLineData->previous;
                                                if(temp && pMLEditData->editLine > pMLEditData->StartlineDisp)
                                                if(temp && pMLEditData->editLine > pMLEditData->StartlineDisp)
                                                {
                                                {
                                                        pMLEditData->editLine --;
                                                        pMLEditData->editLine --;
                                                        pMLEditData->editPos = temp->dataEnd;
                                                        pMLEditData->editPos = temp->dataEnd;
                                    newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                    newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                if (pMLEditData->dispPos != newStartPos)
                                if (pMLEditData->dispPos != newStartPos)
                                                        {
                                                        {
                                                                pMLEditData->dispPos = newStartPos;
                                                                pMLEditData->dispPos = newStartPos;
                                                                bScroll = TRUE;
                                                                bScroll = TRUE;
                                                        }
                                                        }
                                                }
                                                }
                                                else
                                                else
                                return 0;
                                return 0;
                                        }
                                        }
                                        else
                                        else
                    {   if (edtIsACCharBeforePosition (pLineData->buffer,
                    {   if (edtIsACCharBeforePosition (pLineData->buffer,
                                    pLineData->dataEnd,
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                                    pMLEditData->editPos)) {
                                scrollStep = 2;
                                scrollStep = 2;
                                pMLEditData->editPos -= 2;
                                pMLEditData->editPos -= 2;
                        }
                        }
                        else {
                        else {
                                scrollStep = 1;
                                scrollStep = 1;
                                pMLEditData->editPos --;
                                pMLEditData->editPos --;
                        }
                        }
 
 
                        pMLEditData->caretPos -= scrollStep;
                        pMLEditData->caretPos -= scrollStep;
                        if (pMLEditData->caretPos == 0
                        if (pMLEditData->caretPos == 0
                                    && pMLEditData->editPos != 0) {
                                    && pMLEditData->editPos != 0) {
 
 
                                bScroll = TRUE;
                                bScroll = TRUE;
 
 
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                    pLineData->dataEnd,
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                                    pMLEditData->editPos)) {
                                        pMLEditData->dispPos -= 2;
                                        pMLEditData->dispPos -= 2;
                                pMLEditData->caretPos = 2;
                                pMLEditData->caretPos = 2;
                                }
                                }
                                else {
                                else {
                                                                pMLEditData->dispPos--;
                                                                pMLEditData->dispPos--;
                                    pMLEditData->caretPos = 1;
                                    pMLEditData->caretPos = 1;
                            }
                            }
                            }
                            }
                        else if (pMLEditData->caretPos < 0) {
                        else if (pMLEditData->caretPos < 0) {
                                                        pMLEditData->dispPos = 0;
                                                        pMLEditData->dispPos = 0;
                            pMLEditData->caretPos = 0;
                            pMLEditData->caretPos = 0;
                        }
                        }
                    }
                    }
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                                (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                                (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                + pMLEditData->topMargin);
                                + pMLEditData->topMargin);
 
 
                    if (bScroll)
                    if (bScroll)
                        InvalidateRect (hWnd, NULL, FALSE);
                        InvalidateRect (hWnd, NULL, FALSE);
                }
                }
                return 0;
                return 0;
 
 
                case VK_RIGHT: /* SCANCODE_CURSORBLOCKRIGHT: */
                case VK_RIGHT: /* SCANCODE_CURSORBLOCKRIGHT: */
                {
                {
                    BOOL bScroll = FALSE;
                    BOOL bScroll = FALSE;
                    int  scrollStep, moveStep;
                    int  scrollStep, moveStep;
                                        PLINEDATA temp;
                                        PLINEDATA temp;
 
 
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if (pMLEditData->editPos == pLineData->dataEnd)
                    if (pMLEditData->editPos == pLineData->dataEnd)
                                        {
                                        {
                                                temp = pLineData->next;
                                                temp = pLineData->next;
                                                if(temp)
                                                if(temp)
                                                {
                                                {
                                                        pMLEditData->editLine++;
                                                        pMLEditData->editLine++;
                                                        pMLEditData->editPos  = 0;
                                                        pMLEditData->editPos  = 0;
                                                        pMLEditData->caretPos = 0;
                                                        pMLEditData->caretPos = 0;
                                                        if(pMLEditData->dispPos !=0)
                                                        if(pMLEditData->dispPos !=0)
                                                        {
                                                        {
                                                                pMLEditData->dispPos  = 0;
                                                                pMLEditData->dispPos  = 0;
                                                                bScroll = TRUE;
                                                                bScroll = TRUE;
                                                        }
                                                        }
                                                }
                                                }
                                                else
                                                else
                                return 0;
                                return 0;
                                        }
                                        }
                                        else
                                        else
                    {
                    {
                                                if (edtIsACCharAtPosition (pLineData->buffer,
                                                if (edtIsACCharAtPosition (pLineData->buffer,
                                        pLineData->dataEnd,
                                        pLineData->dataEnd,
                                    pMLEditData->dispPos)) {
                                    pMLEditData->dispPos)) {
                            if (edtIsACCharAtPosition (pLineData->buffer,
                            if (edtIsACCharAtPosition (pLineData->buffer,
                                    pLineData->dataEnd,
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                                    pMLEditData->editPos)) {
                                scrollStep = 2;
                                scrollStep = 2;
                                    moveStep = 2;
                                    moveStep = 2;
                                pMLEditData->editPos  += 2;
                                pMLEditData->editPos  += 2;
                                }
                                }
                                else {
                                else {
                                scrollStep = 2;
                                scrollStep = 2;
                                    moveStep = 1;
                                    moveStep = 1;
                                pMLEditData->editPos ++;
                                pMLEditData->editPos ++;
                                }
                                }
                        }
                        }
                            else {
                            else {
                            if (edtIsACCharAtPosition (pLineData->buffer,
                            if (edtIsACCharAtPosition (pLineData->buffer,
                                            pLineData->dataEnd,
                                            pLineData->dataEnd,
                                        pMLEditData->editPos)) {
                                        pMLEditData->editPos)) {
 
 
                                    if (edtIsACCharAtPosition (pLineData->buffer,
                                    if (edtIsACCharAtPosition (pLineData->buffer,
                                        pLineData->dataEnd,
                                        pLineData->dataEnd,
                                            pMLEditData->dispPos + 1))
                                            pMLEditData->dispPos + 1))
                                    scrollStep = 3;
                                    scrollStep = 3;
                                    else
                                    else
                                    scrollStep = 2;
                                    scrollStep = 2;
 
 
                                moveStep = 2;
                                moveStep = 2;
                                    pMLEditData->editPos += 2;
                                    pMLEditData->editPos += 2;
                            }
                            }
                                else {
                                else {
                                scrollStep = 1;
                                scrollStep = 1;
                                    moveStep = 1;
                                    moveStep = 1;
                                pMLEditData->editPos ++;
                                pMLEditData->editPos ++;
                                }
                                }
                        }
                        }
 
 
                            pMLEditData->caretPos += moveStep;
                            pMLEditData->caretPos += moveStep;
                        if (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                        if (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                    > edtGetOutWidth (hWnd)) {
                                    > edtGetOutWidth (hWnd)) {
                            bScroll = TRUE;
                            bScroll = TRUE;
                                pMLEditData->dispPos += scrollStep;
                                pMLEditData->dispPos += scrollStep;
                                pMLEditData->caretPos =
                                pMLEditData->caretPos =
                                pMLEditData->editPos - pMLEditData->dispPos;
                                pMLEditData->editPos - pMLEditData->dispPos;
                            }
                            }
                                        }
                                        }
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight (hWnd)
                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight (hWnd)
                                + pMLEditData->topMargin);
                                + pMLEditData->topMargin);
 
 
                    if (bScroll)
                    if (bScroll)
                        InvalidateRect (hWnd, NULL, FALSE);
                        InvalidateRect (hWnd, NULL, FALSE);
                }
                }
                return 0;
                return 0;
 
 
                case VK_UP: /* SCANCODE_CURSORBLOCKUP: */
                case VK_UP: /* SCANCODE_CURSORBLOCKUP: */
                {
                {
                    BOOL bScroll = FALSE;
                    BOOL bScroll = FALSE;
                    int  newStartPos;
                    int  newStartPos;
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        temp = pLineData->previous;
                                        temp = pLineData->previous;
                                        if(pMLEditData->editLine == 0)
                                        if(pMLEditData->editLine == 0)
                                                return 0;
                                                return 0;
                                        else if (pMLEditData->editLine == pMLEditData->StartlineDisp)
                                        else if (pMLEditData->editLine == pMLEditData->StartlineDisp)
                                        {
                                        {
                                                bScroll = TRUE;
                                                bScroll = TRUE;
                                                pMLEditData->StartlineDisp--;
                                                pMLEditData->StartlineDisp--;
                                                pMLEditData->EndlineDisp--;
                                                pMLEditData->EndlineDisp--;
                                        }
                                        }
                                        pMLEditData->editLine--;
                                        pMLEditData->editLine--;
 
 
                                        if( pMLEditData->editPos >= temp->dataEnd )
                                        if( pMLEditData->editPos >= temp->dataEnd )
                                        {
                                        {
                                                pMLEditData->editPos = temp->dataEnd;
                                                pMLEditData->editPos = temp->dataEnd;
                                                pMLEditData->dispPos = 0;
                                                pMLEditData->dispPos = 0;
                                newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                pMLEditData->dispPos =  newStartPos;
                                pMLEditData->dispPos =  newStartPos;
                                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                                bScroll = TRUE;
                                                bScroll = TRUE;
                                        }
                                        }
                                        else
                                        else
                                        {
                                        {
                                        newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                        newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                        + pMLEditData->leftMargin);
                                        + pMLEditData->leftMargin);
                                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
                                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
                                                                pMLEditData->dispPos))
                                                                pMLEditData->dispPos))
                                                {
                                                {
                                                        bScroll = TRUE;
                                                        bScroll = TRUE;
                                                        pMLEditData->dispPos--;
                                                        pMLEditData->dispPos--;
                                                newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                + pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
                                                + pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
                                                }
                                                }
                                    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
                                    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
                                pMLEditData->caretPos = newStartPos;
                                pMLEditData->caretPos = newStartPos;
                                        }
                                        }
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
                            + pMLEditData->topMargin);
                                        if(bScroll)
                                        if(bScroll)
                                                InvalidateRect(hWnd,NULL,FALSE);
                                                InvalidateRect(hWnd,NULL,FALSE);
                                }
                                }
                                break;
                                break;
                case VK_DOWN: /* SCANCODE_CURSORBLOCKDOWN: */
                case VK_DOWN: /* SCANCODE_CURSORBLOCKDOWN: */
                {
                {
                    BOOL bScroll = FALSE;
                    BOOL bScroll = FALSE;
                    int  newStartPos;
                    int  newStartPos;
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        temp = pLineData->next;
                                        temp = pLineData->next;
                                        if(pMLEditData->editLine == pMLEditData->lines-1)
                                        if(pMLEditData->editLine == pMLEditData->lines-1)
                                                return 0;
                                                return 0;
                                        else if (pMLEditData->editLine == pMLEditData->EndlineDisp)
                                        else if (pMLEditData->editLine == pMLEditData->EndlineDisp)
                                        {
                                        {
                                                bScroll = TRUE;
                                                bScroll = TRUE;
                                                pMLEditData->StartlineDisp++;
                                                pMLEditData->StartlineDisp++;
                                                pMLEditData->EndlineDisp++;
                                                pMLEditData->EndlineDisp++;
                                        }
                                        }
                                        pMLEditData->editLine++;
                                        pMLEditData->editLine++;
 
 
                                        if( pMLEditData->editPos >= temp->dataEnd )
                                        if( pMLEditData->editPos >= temp->dataEnd )
                                        {
                                        {
                                                pMLEditData->editPos = temp->dataEnd;
                                                pMLEditData->editPos = temp->dataEnd;
                                                pMLEditData->dispPos = 0;
                                                pMLEditData->dispPos = 0;
                                newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                newStartPos = edtGetStartDispPosAtEnd (hWnd, temp);
                                pMLEditData->dispPos =  newStartPos;
                                pMLEditData->dispPos =  newStartPos;
                                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                                pMLEditData->caretPos = pMLEditData->editPos - newStartPos;
                                                bScroll = TRUE;
                                                bScroll = TRUE;
                                        }
                                        }
                                        else
                                        else
                                        {
                                        {
                                        newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                        newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                        + pMLEditData->leftMargin);
                                        + pMLEditData->leftMargin);
                                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
                                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,
                                                                pMLEditData->dispPos))
                                                                pMLEditData->dispPos))
                                                {
                                                {
                                                        bScroll = TRUE;
                                                        bScroll = TRUE;
                                                        pMLEditData->dispPos--;
                                                        pMLEditData->dispPos--;
                                                newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                newStartPos = edtGetOffset(hWnd, pMLEditData,temp,
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                pMLEditData->caretPos * GetSysCharWidth (hWnd)
                                                + pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
                                                + pMLEditData->leftMargin+GetSysCharWidth(hWnd)/2);
                                                }
                                                }
                                    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
                                    pMLEditData->editPos = newStartPos + pMLEditData->dispPos;
                                pMLEditData->caretPos = newStartPos;
                                pMLEditData->caretPos = newStartPos;
                                        }
                                        }
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
                            + pMLEditData->topMargin);
                                        if(bScroll)
                                        if(bScroll)
                                                InvalidateRect(hWnd,NULL,FALSE);
                                                InvalidateRect(hWnd,NULL,FALSE);
 
 
                                }
                                }
                                break;
                                break;
                case VK_INSERT: /* SCANCODE_INSERT: */
                case VK_INSERT: /* SCANCODE_INSERT: */
                                        dw = GetWindowAdditionalData(hWnd);
                                        dw = GetWindowAdditionalData(hWnd);
                    dw ^= EST_REPLACE;
                    dw ^= EST_REPLACE;
                                        SetWindowAdditionalData(hWnd,dw);
                                        SetWindowAdditionalData(hWnd,dw);
                break;
                break;
 
 
                case VK_DELETE: /* SCANCODE_REMOVE: */
                case VK_DELETE: /* SCANCODE_REMOVE: */
                                {
                                {
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                                        int leftLen;
                                        int leftLen;
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
#if 0   /* fix: no ping() */
#if 0   /* fix: no ping() */
                        ping ();
                        ping ();
#endif
#endif
                        return 0;
                        return 0;
                    }
                    }
                        temp = pLineData->next;
                        temp = pLineData->next;
                                        if (pLineData->dataEnd == pMLEditData->editPos && temp)
                                        if (pLineData->dataEnd == pMLEditData->editPos && temp)
                                        {
                                        {
                                                if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
                                                if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
                                                {
                                                {
                                                        memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd);
                                                        memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,temp->dataEnd);
                                                        pLineData->dataEnd += temp->dataEnd;
                                                        pLineData->dataEnd += temp->dataEnd;
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                        if(temp->next)
                                                        if(temp->next)
                                                        {
                                                        {
                                                            pLineData->next = temp->next;
                                                            pLineData->next = temp->next;
                                                                temp->next->previous = pLineData;
                                                                temp->next->previous = pLineData;
                                                        }
                                                        }
                                                        else
                                                        else
                                                                pLineData->next = NULL;
                                                                pLineData->next = NULL;
                                                        free(temp);
                                                        free(temp);
                                                        temp = pLineData->next;
                                                        temp = pLineData->next;
                                                        while (temp)
                                                        while (temp)
                                                        {
                                                        {
                                                                temp->lineNO--;
                                                                temp->lineNO--;
                                                                temp = temp->next;
                                                                temp = temp->next;
                                                        }
                                                        }
                                                        if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)
                                                        if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)
                                                        {
                                                        {
                                                                pMLEditData->EndlineDisp--;
                                                                pMLEditData->EndlineDisp--;
                                                                pMLEditData->linesDisp--;
                                                                pMLEditData->linesDisp--;
                                                        }
                                                        }
                                                        if(pMLEditData->EndlineDisp >= pMLEditData->lines-1)
                                                        if(pMLEditData->EndlineDisp >= pMLEditData->lines-1)
                                                        {
                                                        {
                                                                pMLEditData->EndlineDisp--;
                                                                pMLEditData->EndlineDisp--;
                                                                if(pMLEditData->StartlineDisp !=0)
                                                                if(pMLEditData->StartlineDisp !=0)
                                                                        pMLEditData->StartlineDisp--;
                                                                        pMLEditData->StartlineDisp--;
                                                                else
                                                                else
                                                                        pMLEditData->linesDisp--;
                                                                        pMLEditData->linesDisp--;
                                                        }
                                                        }
                                                        pMLEditData->lines--;
                                                        pMLEditData->lines--;
                                                }
                                                }
                                                else if (temp->dataEnd > 0)
                                                else if (temp->dataEnd > 0)
                                                {
                                                {
                                                        leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd;
                                                        leftLen = LEN_MLEDIT_BUFFER - pLineData->dataEnd;
                                                        memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen);
                                                        memcpy(pLineData->buffer+pLineData->dataEnd,temp->buffer,leftLen);
                                                        pLineData->dataEnd +=leftLen;
                                                        pLineData->dataEnd +=leftLen;
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                        memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen);
                                                        memcpy(temp->buffer,temp->buffer+leftLen,temp->dataEnd-leftLen);
                                                        temp->dataEnd -=leftLen;
                                                        temp->dataEnd -=leftLen;
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                }
                                                }
                                        }
                                        }
                                        else if (pMLEditData->editPos != pLineData->dataEnd)
                                        else if (pMLEditData->editPos != pLineData->dataEnd)
                                        {
                                        {
                            if (edtIsACCharAtPosition (pLineData->buffer,
                            if (edtIsACCharAtPosition (pLineData->buffer,
                                        pLineData->dataEnd,
                                        pLineData->dataEnd,
                                            pMLEditData->editPos))
                                            pMLEditData->editPos))
                                deleted = 2;
                                deleted = 2;
                        else
                        else
                                deleted = 1;
                                deleted = 1;
 
 
                        for (i = pMLEditData->editPos;
                        for (i = pMLEditData->editPos;
                                    i < pLineData->dataEnd - deleted;
                                    i < pLineData->dataEnd - deleted;
                                i++)
                                i++)
                               pLineData->buffer [i]
                               pLineData->buffer [i]
                                = pLineData->buffer [i + deleted];
                                = pLineData->buffer [i + deleted];
 
 
                            pLineData->dataEnd -= deleted;
                            pLineData->dataEnd -= deleted;
                                                pLineData->buffer[pLineData->dataEnd] = '\0';
                                                pLineData->buffer[pLineData->dataEnd] = '\0';
                                        }
                                        }
                        bChange = TRUE;
                        bChange = TRUE;
                    InvalidateRect (hWnd, NULL,FALSE);
                    InvalidateRect (hWnd, NULL,FALSE);
                                }
                                }
                break;
                break;
 
 
                case VK_BACK: /* SCANCODE_BACKSPACE: */
                case VK_BACK: /* SCANCODE_BACKSPACE: */
                                {
                                {
                                        PLINEDATA temp;
                                        PLINEDATA temp;
                                        int leftLen,tempEnd;
                                        int leftLen,tempEnd;
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
                    if ((GetWindowAdditionalData(hWnd) & EST_READONLY) ){
#if 0    /* fix: no Ping() */
#if 0    /* fix: no Ping() */
                        Ping ();
                        Ping ();
#endif
#endif
                        return 0;
                        return 0;
                    }
                    }
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                                        temp = pLineData->previous;
                                        temp = pLineData->previous;
                                        if (pMLEditData->editPos == 0 && temp)
                                        if (pMLEditData->editPos == 0 && temp)
                                        {
                                        {
                                                tempEnd = temp->dataEnd;
                                                tempEnd = temp->dataEnd;
                                                if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
                                                if(pLineData->dataEnd + temp->dataEnd <= LEN_MLEDIT_BUFFER)
                                                {
                                                {
                                                        memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,pLineData->dataEnd);
                                                        memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,pLineData->dataEnd);
                                                        temp->dataEnd +=pLineData->dataEnd;
                                                        temp->dataEnd +=pLineData->dataEnd;
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                        if(pLineData->next)
                                                        if(pLineData->next)
                                                        {
                                                        {
                                                            temp->next = pLineData->next;
                                                            temp->next = pLineData->next;
                                                                pLineData->next->previous = temp;
                                                                pLineData->next->previous = temp;
                                                        }
                                                        }
                                                        else
                                                        else
                                                                temp->next = NULL;
                                                                temp->next = NULL;
                                                        free(pLineData);
                                                        free(pLineData);
                                                        pLineData = temp;
                                                        pLineData = temp;
                                                        temp = temp->next;
                                                        temp = temp->next;
                                                        while(temp)
                                                        while(temp)
                                                        {
                                                        {
                                                                temp->lineNO--;
                                                                temp->lineNO--;
                                                                temp = temp->next;
                                                                temp = temp->next;
                                                        }
                                                        }
                                                        if(pMLEditData->StartlineDisp == pMLEditData->editLine
                                                        if(pMLEditData->StartlineDisp == pMLEditData->editLine
                                                                        && pMLEditData->StartlineDisp != 0)
                                                                        && pMLEditData->StartlineDisp != 0)
                                                        {
                                                        {
                                                                pMLEditData->StartlineDisp--;
                                                                pMLEditData->StartlineDisp--;
                                                                if(pMLEditData->EndlineDisp == pMLEditData->lines)
                                                                if(pMLEditData->EndlineDisp == pMLEditData->lines)
                                                                        pMLEditData->EndlineDisp--;
                                                                        pMLEditData->EndlineDisp--;
                                                        }
                                                        }
                                                        if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)
                                                        if(pMLEditData->lines <= pMLEditData->MaxlinesDisp)
                                                        {
                                                        {
                                                                pMLEditData->linesDisp--;
                                                                pMLEditData->linesDisp--;
                                                                pMLEditData->EndlineDisp--;
                                                                pMLEditData->EndlineDisp--;
                                                        }
                                                        }
                                                        pMLEditData->lines--;
                                                        pMLEditData->lines--;
                                                }
                                                }
                                                else if (pLineData->dataEnd > 0)
                                                else if (pLineData->dataEnd > 0)
                                                {
                                                {
                                                        leftLen = LEN_MLEDIT_BUFFER - temp->dataEnd;
                                                        leftLen = LEN_MLEDIT_BUFFER - temp->dataEnd;
                                                        memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,leftLen);
                                                        memcpy(temp->buffer+temp->dataEnd,pLineData->buffer,leftLen);
                                                        temp->dataEnd +=leftLen;
                                                        temp->dataEnd +=leftLen;
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                        temp->buffer[temp->dataEnd] = '\0';
                                                        memcpy(pLineData->buffer,pLineData->buffer+leftLen,pLineData->dataEnd-leftLen);
                                                        memcpy(pLineData->buffer,pLineData->buffer+leftLen,pLineData->dataEnd-leftLen);
                                                        pLineData->dataEnd -=leftLen;
                                                        pLineData->dataEnd -=leftLen;
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                        pLineData->buffer[pLineData->dataEnd] = '\0';
                                                }
                                                }
                                                pMLEditData->editLine--;
                                                pMLEditData->editLine--;
                                                pMLEditData->editPos = tempEnd;
                                                pMLEditData->editPos = tempEnd;
                                                pMLEditData->dispPos = tempEnd;
                                                pMLEditData->dispPos = tempEnd;
                                                /* µ±±à¼­Î»Öò»Îª0,caretλÖÃΪ0µÄʱºò,Òƶ¯caretλÖÃ. */
                                                /* µ±±à¼­Î»Öò»Îª0,caretλÖÃΪ0µÄʱºò,Òƶ¯caretλÖÃ. */
                                if (pMLEditData->caretPos == 0
                                if (pMLEditData->caretPos == 0
                                    && pMLEditData->editPos != 0) {
                                    && pMLEditData->editPos != 0) {
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                    pLineData->dataEnd,
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                                    pMLEditData->editPos)) {
                                        pMLEditData->dispPos -= 2;
                                        pMLEditData->dispPos -= 2;
                                pMLEditData->caretPos = 2;
                                pMLEditData->caretPos = 2;
                                    }
                                    }
                                else {
                                else {
                                                                pMLEditData->dispPos--;
                                                                pMLEditData->dispPos--;
                                        pMLEditData->caretPos = 1;
                                        pMLEditData->caretPos = 1;
                            }
                            }
                                }
                                }
                        else if (pMLEditData->caretPos < 0) {
                        else if (pMLEditData->caretPos < 0) {
                                                        pMLEditData->dispPos = 0;
                                                        pMLEditData->dispPos = 0;
                                pMLEditData->caretPos = 0;
                                pMLEditData->caretPos = 0;
                        }
                        }
                                        }
                                        }
                                        else if (pMLEditData->editPos != 0 )
                                        else if (pMLEditData->editPos != 0 )
                                        {
                                        {
                            if (edtIsACCharBeforePosition (pLineData->buffer,
                            if (edtIsACCharBeforePosition (pLineData->buffer,
                                        pLineData->dataEnd,
                                        pLineData->dataEnd,
                                        pMLEditData->editPos))
                                        pMLEditData->editPos))
                                deleted = 2;
                                deleted = 2;
                        else
                        else
                                deleted = 1;
                                deleted = 1;
 
 
                        for (i = pMLEditData->editPos;
                        for (i = pMLEditData->editPos;
                                    i < pLineData->dataEnd;
                                    i < pLineData->dataEnd;
                                i++)
                                i++)
                                pLineData->buffer [i - deleted]
                                pLineData->buffer [i - deleted]
                                = pLineData->buffer [i];
                                = pLineData->buffer [i];
 
 
                            pLineData->dataEnd -= deleted;
                            pLineData->dataEnd -= deleted;
                        pMLEditData->editPos -= deleted;
                        pMLEditData->editPos -= deleted;
                            pMLEditData->caretPos -= deleted;
                            pMLEditData->caretPos -= deleted;
                            if (pMLEditData->caretPos == 0
                            if (pMLEditData->caretPos == 0
                                && pMLEditData->editPos != 0) {
                                && pMLEditData->editPos != 0) {
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                if (edtIsACCharBeforePosition (pLineData->buffer,
                                    pLineData->dataEnd,
                                    pLineData->dataEnd,
                                    pMLEditData->editPos)) {
                                    pMLEditData->editPos)) {
                                    pMLEditData->dispPos -= 2;
                                    pMLEditData->dispPos -= 2;
                                pMLEditData->caretPos = 2;
                                pMLEditData->caretPos = 2;
                                 }
                                 }
                            else {
                            else {
                                    pMLEditData->dispPos --;
                                    pMLEditData->dispPos --;
                                pMLEditData->caretPos = 1;
                                pMLEditData->caretPos = 1;
                            }
                            }
 
 
                            }
                            }
                                        }
                                        }
                    bChange = TRUE;
                    bChange = TRUE;
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                    SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
                            + pMLEditData->topMargin);
                    InvalidateRect (hWnd, NULL, FALSE);
                    InvalidateRect (hWnd, NULL, FALSE);
                                }
                                }
                break;
                break;
 
 
                default:
                default:
                break;
                break;
            }
            }
 
 
            if (bChange)
            if (bChange)
                SendMessage (GetParent (hWnd), WM_COMMAND,
                SendMessage (GetParent (hWnd), WM_COMMAND,
                        (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_CHANGE),
                        (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_CHANGE),
                        (LPARAM) hWnd);
                        (LPARAM) hWnd);
            return 0;
            return 0;
        }
        }
 
 
        case WM_CHAR:
        case WM_CHAR:
        {
        {
            char charBuffer [2];
            char charBuffer [2];
            int  i, chars, scrollStep, inserting;
            int  i, chars, scrollStep, inserting;
                        UINT format;
                        UINT format;
 
 
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
 
 
                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
                        pLineData = GetLineData(pMLEditData,pMLEditData->editLine);
 
 
            if (dwStyle & ES_READONLY) {
            if (dwStyle & ES_READONLY) {
#if 0    /* fix: no Ping() */
#if 0    /* fix: no Ping() */
                Ping ();
                Ping ();
#endif
#endif
                return 0;
                return 0;
            }
            }
            if (HIBYTE (wParam)) {
            if (HIBYTE (wParam)) {
                charBuffer [0] = LOBYTE (wParam);
                charBuffer [0] = LOBYTE (wParam);
                charBuffer [1] = HIBYTE (wParam);
                charBuffer [1] = HIBYTE (wParam);
                chars = 2;
                chars = 2;
            }
            }
            else {
            else {
                charBuffer [0] = LOBYTE (wParam);
                charBuffer [0] = LOBYTE (wParam);
                chars = 1;
                chars = 1;
            }
            }
 
 
            if (chars == 1) {
            if (chars == 1) {
                switch (charBuffer [0])
                switch (charBuffer [0])
                {
                {
                    case 0x00:  /* NULL */
                    case 0x00:  /* NULL */
                    case 0x07:  /* BEL */
                    case 0x07:  /* BEL */
                    case 0x08:  /* BS */
                    case 0x08:  /* BS */
                    case 0x09:  /* HT */
                    case 0x09:  /* HT */
                    case 0x0A:  /* LF */
                    case 0x0A:  /* LF */
                    case 0x0B:  /* VT */
                    case 0x0B:  /* VT */
                    case 0x0C:  /* FF */
                    case 0x0C:  /* FF */
                    case 0x0D:  /* CR */
                    case 0x0D:  /* CR */
                    case 0x1B:  /* Escape */
                    case 0x1B:  /* Escape */
                    return 0;
                    return 0;
                }
                }
            }
            }
            if (GetWindowAdditionalData(hWnd) & EST_REPLACE) {
            if (GetWindowAdditionalData(hWnd) & EST_REPLACE) {
                if (pLineData->dataEnd == pMLEditData->editPos)
                if (pLineData->dataEnd == pMLEditData->editPos)
                    inserting = chars;
                    inserting = chars;
                else if (edtIsACCharAtPosition (pLineData->buffer,
                else if (edtIsACCharAtPosition (pLineData->buffer,
                                pLineData->dataEnd,
                                pLineData->dataEnd,
                                pMLEditData->editPos)) {
                                pMLEditData->editPos)) {
                    if (chars == 2)
                    if (chars == 2)
                        inserting = 0;
                        inserting = 0;
                    else
                    else
                        inserting = -1;
                        inserting = -1;
                }
                }
                else {
                else {
                    if (chars == 2)
                    if (chars == 2)
                        inserting = 1;
                        inserting = 1;
                    else
                    else
                        inserting = 0;
                        inserting = 0;
                }
                }
            }
            }
            else
            else
                inserting = chars;
                inserting = chars;
 
 
            /* check space */
            /* check space */
            if (pLineData->dataEnd + inserting > pMLEditData->totalLen) {
            if (pLineData->dataEnd + inserting > pMLEditData->totalLen) {
#if 0   /* fix no ping */
#if 0   /* fix no ping */
                Ping ();
                Ping ();
#endif
#endif
                SendMessage (GetParent (hWnd), WM_COMMAND,
                SendMessage (GetParent (hWnd), WM_COMMAND,
                            (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_MAXTEXT),
                            (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_MAXTEXT),
                            (LPARAM) hWnd);
                            (LPARAM) hWnd);
                return 0;
                return 0;
            }
            }
            else if ((pMLEditData->hardLimit >= 0)
            else if ((pMLEditData->hardLimit >= 0)
                        && ((pLineData->dataEnd + inserting)
                        && ((pLineData->dataEnd + inserting)
                            > pMLEditData->hardLimit)) {
                            > pMLEditData->hardLimit)) {
#if 0   /* fix no ping */
#if 0   /* fix no ping */
                Ping ();
                Ping ();
#endif
#endif
                SendMessage (GetParent (hWnd), WM_COMMAND,
                SendMessage (GetParent (hWnd), WM_COMMAND,
                            (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_MAXTEXT),
                            (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_MAXTEXT),
                            (LPARAM) hWnd);
                            (LPARAM) hWnd);
                return 0;
                return 0;
            }
            }
            if (inserting == -1) {
            if (inserting == -1) {
                for (i = pMLEditData->editPos; i < pLineData->dataEnd-1; i++)
                for (i = pMLEditData->editPos; i < pLineData->dataEnd-1; i++)
                    pLineData->buffer [i] = pLineData->buffer [i + 1];
                    pLineData->buffer [i] = pLineData->buffer [i + 1];
            }
            }
            else if (inserting > 0) {
            else if (inserting > 0) {
                for (i = pLineData->dataEnd + inserting - 1;
                for (i = pLineData->dataEnd + inserting - 1;
                        i > pMLEditData->editPos + inserting - 1;
                        i > pMLEditData->editPos + inserting - 1;
                        i--)
                        i--)
                    pLineData->buffer [i]
                    pLineData->buffer [i]
                            = pLineData->buffer [i - inserting];
                            = pLineData->buffer [i - inserting];
            }
            }
            for (i = 0; i < chars; i++)
            for (i = 0; i < chars; i++)
                    pLineData->buffer [pMLEditData->editPos + i]
                    pLineData->buffer [pMLEditData->editPos + i]
                        = charBuffer [i];
                        = charBuffer [i];
 
 
            pMLEditData->editPos += chars;
            pMLEditData->editPos += chars;
            pMLEditData->caretPos += chars;
            pMLEditData->caretPos += chars;
            pLineData->dataEnd += inserting;
            pLineData->dataEnd += inserting;
                        pLineData->buffer[pLineData->dataEnd] = '\0';
                        pLineData->buffer[pLineData->dataEnd] = '\0';
            if (pMLEditData->caretPos * GetSysCharWidth (hWnd)
            if (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            > edtGetOutWidth (hWnd))
                            > edtGetOutWidth (hWnd))
            {
            {
                if (edtIsACCharAtPosition (pLineData->buffer,
                if (edtIsACCharAtPosition (pLineData->buffer,
                                pLineData->dataEnd,
                                pLineData->dataEnd,
                                pMLEditData->dispPos))
                                pMLEditData->dispPos))
                    scrollStep = 2;
                    scrollStep = 2;
                else {
                else {
                    if (chars == 2) {
                    if (chars == 2) {
                        if (edtIsACCharAtPosition (pLineData->buffer,
                        if (edtIsACCharAtPosition (pLineData->buffer,
                                pLineData->dataEnd,
                                pLineData->dataEnd,
                                pMLEditData->dispPos + 1))
                                pMLEditData->dispPos + 1))
                            scrollStep = 3;
                            scrollStep = 3;
                        else
                        else
                            scrollStep = 2;
                            scrollStep = 2;
                    }
                    }
                    else
                    else
                        scrollStep = 1;
                        scrollStep = 1;
                }
                }
 
 
                pMLEditData->dispPos += scrollStep;
                pMLEditData->dispPos += scrollStep;
 
 
                pMLEditData->caretPos =
                pMLEditData->caretPos =
                            pMLEditData->editPos - pMLEditData->dispPos;
                            pMLEditData->editPos - pMLEditData->dispPos;
 
 
            }
            }
            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                            (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                            + pMLEditData->topMargin);
                            + pMLEditData->topMargin);
            InvalidateRect (hWnd, NULL,FALSE);
            InvalidateRect (hWnd, NULL,FALSE);
                        format = DT_NOPREFIX;
                        format = DT_NOPREFIX;
            SendMessage (GetParent (hWnd), WM_COMMAND,
            SendMessage (GetParent (hWnd), WM_COMMAND,
                    (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_CHANGE),
                    (WPARAM) MAKELONG (GetDlgCtrlID(hWnd), EN_CHANGE),
                    (LPARAM) hWnd);
                    (LPARAM) hWnd);
        }
        }
        return 0;
        return 0;
 
 
        case WM_GETTEXTLENGTH:
        case WM_GETTEXTLENGTH:
                {
                {
                        PLINEDATA temp;
                        PLINEDATA temp;
                        int    lineNO = (int)wParam;
                        int    lineNO = (int)wParam;
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
                        temp = pMLEditData->head;
                        temp = pMLEditData->head;
                        while(temp)
                        while(temp)
                        {
                        {
                                if (temp->lineNO == lineNO)
                                if (temp->lineNO == lineNO)
                                        return  temp->dataEnd;
                                        return  temp->dataEnd;
                                temp = temp->next;
                                temp = temp->next;
                        }
                        }
        return -1;
        return -1;
        }
        }
                case WM_GETTEXT:
                case WM_GETTEXT:
                {
                {
                        PLINEDATA temp;
                        PLINEDATA temp;
                        int len,total = 0,lineNO;
                        int len,total = 0,lineNO;
                        char * buffer = (char*)lParam;
                        char * buffer = (char*)lParam;
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
                        len = (int)wParam;
                        len = (int)wParam;
            lineNO = (int)wParam;
            lineNO = (int)wParam;
                        temp = pMLEditData->head;
                        temp = pMLEditData->head;
                        while (temp && total + temp->dataEnd < len)
                        while (temp && total + temp->dataEnd < len)
                        {
                        {
                                memcpy(buffer+total,temp->buffer,temp->dataEnd);
                                memcpy(buffer+total,temp->buffer,temp->dataEnd);
                                total += temp->dataEnd;
                                total += temp->dataEnd;
                                temp = temp->next;
                                temp = temp->next;
                        }
                        }
 
 
                }
                }
                return 0;
                return 0;
/* can i add it to message define ? */
/* can i add it to message define ? */
#if 0
#if 0
        case WM_GETLINETEXT:
        case WM_GETLINETEXT:
        {
        {
                        PLINEDATA temp;
                        PLINEDATA temp;
            char*   buffer = (char*)lParam;
            char*   buffer = (char*)lParam;
            int     lineNO,len;
            int     lineNO,len;
 
 
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            lineNO = (int)wParam;
            lineNO = (int)wParam;
                        temp = GetLineData(pMLEditData,lineNO);
                        temp = GetLineData(pMLEditData,lineNO);
                        if(temp)
                        if(temp)
                        {
                        {
                                len = min ((int)wParam, temp->dataEnd);
                                len = min ((int)wParam, temp->dataEnd);
                        memcpy (buffer, temp->buffer,len);
                        memcpy (buffer, temp->buffer,len);
                        buffer [len] = '\0';
                        buffer [len] = '\0';
                                return 0;
                                return 0;
                        }
                        }
            return -1;
            return -1;
        }
        }
        break;
        break;
                case WM_SETTEXT:
                case WM_SETTEXT:
                {
                {
                        MLEditInitBuffer(pMLEditData,(char *)lParam);
                        MLEditInitBuffer(pMLEditData,(char *)lParam);
                }
                }
                return 0;
                return 0;
#endif
#endif
/* can i add it to message defined? */
/* can i add it to message defined? */
#if 0
#if 0
        case WM_SETLINETEXT:
        case WM_SETLINETEXT:
        {
        {
            int len,lineNO;
            int len,lineNO;
                        PLINEDATA temp;
                        PLINEDATA temp;
 
 
            if (dwStyle & ES_READONLY)
            if (dwStyle & ES_READONLY)
                return 0;
                return 0;
 
 
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
 
 
            len = strlen ((char*)lParam);
            len = strlen ((char*)lParam);
                        lineNO = (int)wParam;
                        lineNO = (int)wParam;
                        temp = pMLEditData->head;
                        temp = pMLEditData->head;
            len = min (len, pMLEditData->totalLen);
            len = min (len, pMLEditData->totalLen);
 
 
            if (pMLEditData->hardLimit >= 0)
            if (pMLEditData->hardLimit >= 0)
                len = min (len, pMLEditData->hardLimit);
                len = min (len, pMLEditData->hardLimit);
                while (temp)
                while (temp)
                        {
                        {
                                if(temp->lineNO == lineNO)
                                if(temp->lineNO == lineNO)
                                {
                                {
                        temp->dataEnd = len;
                        temp->dataEnd = len;
                    memcpy (temp->buffer, (char*)lParam, len);
                    memcpy (temp->buffer, (char*)lParam, len);
                                }
                                }
                                temp = temp->next;
                                temp = temp->next;
                        }
                        }
            pMLEditData->editPos        = 0;
            pMLEditData->editPos        = 0;
            pMLEditData->caretPos       = 0;
            pMLEditData->caretPos       = 0;
            pMLEditData->dispPos        = 0;
            pMLEditData->dispPos        = 0;
            InvalidateRect (hWnd, NULL, FALSE);
            InvalidateRect (hWnd, NULL, FALSE);
        }
        }
        return 0;
        return 0;
#endif
#endif
        case WM_LBUTTONDBLCLK:
        case WM_LBUTTONDBLCLK:
        break;
        break;
 
 
        case WM_LBUTTONDOWN:
        case WM_LBUTTONDOWN:
        {
        {
            int newOff,lineNO;
            int newOff,lineNO;
                        PLINEDATA temp;
                        PLINEDATA temp;
                        BOOL bScroll = FALSE;
                        BOOL bScroll = FALSE;
 
 
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            lineNO = edtGetLineNO (hWnd,pMLEditData, HIWORD (lParam));
            lineNO = edtGetLineNO (hWnd,pMLEditData, HIWORD (lParam));
                        if ( lineNO < 0 )
                        if ( lineNO < 0 )
                                return 0;
                                return 0;
                        lineNO += pMLEditData->StartlineDisp;
                        lineNO += pMLEditData->StartlineDisp;
                        if (lineNO <= pMLEditData->EndlineDisp && lineNO <= pMLEditData->lines-1 )
                        if (lineNO <= pMLEditData->EndlineDisp && lineNO <= pMLEditData->lines-1 )
                        {
                        {
                                temp = GetLineData(pMLEditData,lineNO);
                                temp = GetLineData(pMLEditData,lineNO);
                        newOff = edtGetOffset (hWnd,pMLEditData,temp, LOWORD (lParam));
                        newOff = edtGetOffset (hWnd,pMLEditData,temp, LOWORD (lParam));
                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,pMLEditData->dispPos))
                                if(!edtIsACCharFromBegin(temp->buffer,temp->dataEnd,pMLEditData->dispPos))
                                {
                                {
                                        bScroll = TRUE;
                                        bScroll = TRUE;
                                        pMLEditData->dispPos--;
                                        pMLEditData->dispPos--;
                                newOff = edtGetOffset (hWnd,pMLEditData,temp, LOWORD(lParam)+GetSysCharWidth(hWnd)/2);
                                newOff = edtGetOffset (hWnd,pMLEditData,temp, LOWORD(lParam)+GetSysCharWidth(hWnd)/2);
                                }
                                }
                if (newOff != pMLEditData->caretPos || lineNO != pMLEditData->editLine) {
                if (newOff != pMLEditData->caretPos || lineNO != pMLEditData->editLine) {
                                        pMLEditData->editLine = temp->lineNO;
                                        pMLEditData->editLine = temp->lineNO;
                            pMLEditData->editPos = newOff +pMLEditData->dispPos;
                            pMLEditData->editPos = newOff +pMLEditData->dispPos;
                        pMLEditData->caretPos = newOff;
                        pMLEditData->caretPos = newOff;
                            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            SetCaretPos (pMLEditData->caretPos * GetSysCharWidth (hWnd)
                            + pMLEditData->leftMargin,
                            + pMLEditData->leftMargin,
                                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                        (pMLEditData->editLine - pMLEditData->StartlineDisp) * GetSysCharHeight(hWnd)
                                        + pMLEditData->topMargin);
                                        + pMLEditData->topMargin);
                        }
                        }
                                if(bScroll)
                                if(bScroll)
                                        InvalidateRect(hWnd,NULL,FALSE);
                                        InvalidateRect(hWnd,NULL,FALSE);
                        }
                        }
        }
        }
        break;
        break;
 
 
        case WM_LBUTTONUP:
        case WM_LBUTTONUP:
        break;
        break;
 
 
        case WM_MOUSEMOVE:
        case WM_MOUSEMOVE:
        break;
        break;
 
 
        case WM_GETDLGCODE:
        case WM_GETDLGCODE:
        return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS;
        return DLGC_WANTCHARS | DLGC_HASSETSEL | DLGC_WANTARROWS;
 
 
        case EM_SETREADONLY:
        case EM_SETREADONLY:
            if (wParam)
            if (wParam)
                                IncludeWindowStyle(hWnd,ES_READONLY);
                                IncludeWindowStyle(hWnd,ES_READONLY);
            else
            else
                                ExcludeWindowStyle(hWnd,ES_READONLY);
                                ExcludeWindowStyle(hWnd,ES_READONLY);
        return 0;
        return 0;
 
 
        case EM_SETPASSWORDCHAR:
        case EM_SETPASSWORDCHAR:
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
 
 
            if (pMLEditData->passwdChar != (int)wParam) {
            if (pMLEditData->passwdChar != (int)wParam) {
                if (dwStyle & ES_PASSWORD) {
                if (dwStyle & ES_PASSWORD) {
                    pMLEditData->passwdChar = (int)wParam;
                    pMLEditData->passwdChar = (int)wParam;
                    InvalidateRect (hWnd, NULL, TRUE);
                    InvalidateRect (hWnd, NULL, TRUE);
                }
                }
            }
            }
        return 0;
        return 0;
 
 
        case EM_GETPASSWORDCHAR:
        case EM_GETPASSWORDCHAR:
        {
        {
            int* passwdchar;
            int* passwdchar;
 
 
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            passwdchar = (int*) lParam;
            passwdchar = (int*) lParam;
 
 
            *passwdchar = pMLEditData->passwdChar;
            *passwdchar = pMLEditData->passwdChar;
        }
        }
        return 0;
        return 0;
 
 
        case EM_LIMITTEXT:
        case EM_LIMITTEXT:
        {
        {
            int newLimit = (int)wParam;
            int newLimit = (int)wParam;
 
 
            if (newLimit >= 0) {
            if (newLimit >= 0) {
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
            pMLEditData = (PMLEDITDATA)GetWindowAdditionalData2(hWnd);
                if (pMLEditData->totalLen < newLimit)
                if (pMLEditData->totalLen < newLimit)
                    pMLEditData->hardLimit = -1;
                    pMLEditData->hardLimit = -1;
                else
                else
                    pMLEditData->hardLimit = newLimit;
                    pMLEditData->hardLimit = newLimit;
            }
            }
        }
        }
        return 0;
        return 0;
 
 
        default:
        default:
                return DefWindowProc (hWnd, message, wParam, lParam);
                return DefWindowProc (hWnd, message, wParam, lParam);
        break;
        break;
    }
    }
 
 
    return 0;    /* !DefaultControlProc (hWnd, message, wParam, lParam); */
    return 0;    /* !DefaultControlProc (hWnd, message, wParam, lParam); */
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.