/*
|
/*
|
* 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); */
|
}
|
}
|
|
|
|
|