📄 multiedit.c
字号:
/* Note: the parameters to a create function may vary.
Some widgets may have multiple create functions */
/*********************************************************************
*
* MULTIEDIT_CreateEx
*/
MULTIEDIT_HANDLE MULTIEDIT_CreateEx(int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int WinFlags, int ExFlags,
int Id, int BufferSize, const char* pText)
{
MULTIEDIT_HANDLE hObj;
/* Create the window */
WM_LOCK();
if ((xsize == 0) && (ysize == 0) && (x0 == 0) && (y0 == 0)) {
GUI_RECT Rect;
WM_GetClientRectEx(hParent, &Rect);
xsize = Rect.x1 - Rect.x0 + 1;
ysize = Rect.y1 - Rect.y0 + 1;
}
hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, WinFlags, &_MULTIEDIT_Callback,
sizeof(MULTIEDIT_OBJ) - sizeof(WM_Obj));
if (hObj) {
int i;
MULTIEDIT_OBJ* pObj = MULTIEDIT_H2P(hObj);
/* init widget specific variables */
WIDGET__Init(&pObj->Widget, Id, WIDGET_STATE_FOCUSSABLE);
/* init member variables */
MULTIEDIT_INIT_ID(pObj);
for (i = 0; i < NUM_DISP_MODES; i++) {
pObj->aBkColor[i] = _aDefaultBkColor[i];
pObj->aColor[i] = _aDefaultColor[i];
}
pObj->pFont = _pDefaultFont;
pObj->Flags = ExFlags;
pObj->CursorPosChar = 0;
pObj->CursorPosByte = 0;
pObj->HBorder = 1;
pObj->MaxNumChars = 0;
pObj->NumCharsPrompt = 0;
pObj->BufferSize = 0;
pObj->hText = 0;
if (BufferSize > 0) {
WM_HWIN hText;
if ((hText = GUI_ALLOC_AllocZero(BufferSize)) != 0) {
pObj->BufferSize = BufferSize;
pObj->hText = hText;
} else {
GUI_DEBUG_ERROROUT("MULTIEDIT_CreateEx failed to alloc buffer");
WM_DeleteWindow(hObj);
hObj = 0;
}
}
MULTIEDIT_SetText(hObj, pText);
_ManageScrollers(hObj);
} else {
GUI_DEBUG_ERROROUT_IF(hObj==0, "MULTIEDIT_CreateEx failed")
}
WM_UNLOCK();
return hObj;
}
/*********************************************************************
*
* Exported routines: Various methods
*
**********************************************************************
*/
/*********************************************************************
*
* MULTIEDIT_AddKey
*/
int MULTIEDIT_AddKey(MULTIEDIT_HANDLE hObj, U16 Key) {
int r = 0;
if (hObj) {
WM_LOCK();
r = _AddKey(hObj, Key);
WM_UNLOCK();
}
return r;
}
/*********************************************************************
*
* MULTIEDIT_SetText
*/
void MULTIEDIT_SetText(MULTIEDIT_HANDLE hObj, const char* pNew) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
int NumCharsNew = 0, NumCharsOld = 0;
int NumBytesNew = 0, NumBytesOld = 0;
char* pText;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj->hText) {
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt);
NumCharsOld = GUI__GetNumChars(pText);
NumBytesOld = GUI_UC__NumChars2NumBytes(pText, NumCharsOld);
}
if (pNew) {
NumCharsNew = GUI__GetNumChars(pNew);
NumBytesNew = GUI_UC__NumChars2NumBytes(pNew, NumCharsNew);
}
if (_IsCharsAvailable(pObj, NumCharsNew - NumCharsOld)) {
if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) {
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt);
if (pNew) {
strcpy(pText, pNew);
} else {
*pText = 0;
}
_SetCursorPos(hObj, pObj, pObj->NumCharsPrompt);
_InvalidateTextArea(hObj);
_InvalidateNumChars(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_GetText
*/
void MULTIEDIT_GetText(MULTIEDIT_HANDLE hObj, char* sDest, int MaxLen) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj) {
char* pText;
int Len;
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
pText += GUI_UC__NumChars2NumBytes(pText, pObj->NumCharsPrompt);
Len = strlen(pText);
if (Len > (MaxLen - 1)) {
Len = MaxLen - 1;
}
memcpy(sDest, pText, Len);
*(sDest + Len) = 0;
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_GetPrompt
*/
void MULTIEDIT_GetPrompt(MULTIEDIT_HANDLE hObj, char * sDest, int MaxLen) {
if (hObj) {
MULTIEDIT_OBJ * pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj) {
char* sSource = (char*)GUI_ALLOC_h2p(pObj->hText);
int Len = GUI_UC__NumChars2NumBytes(sSource, pObj->NumCharsPrompt);
if (Len > (MaxLen - 1)) {
Len = MaxLen - 1;
}
memcpy(sDest, sSource, Len);
*(sDest + Len) = 0;
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetWrapWord
*/
void MULTIEDIT_SetWrapWord(MULTIEDIT_HANDLE hObj) {
_SetWrapMode(hObj, GUI_WRAPMODE_WORD);
}
/*********************************************************************
*
* MULTIEDIT_SetWrapChar
*/
void MULTIEDIT_SetWrapChar(MULTIEDIT_HANDLE hObj) {
_SetWrapMode(hObj, GUI_WRAPMODE_CHAR);
}
/*********************************************************************
*
* MULTIEDIT_SetWrapNone
*/
void MULTIEDIT_SetWrapNone(MULTIEDIT_HANDLE hObj) {
_SetWrapMode(hObj, GUI_WRAPMODE_NONE);
}
/*********************************************************************
*
* MULTIEDIT_SetInsertMode
*/
void MULTIEDIT_SetInsertMode(MULTIEDIT_HANDLE hObj, int OnOff) {
_SetFlag(hObj, OnOff, MULTIEDIT_SF_INSERT);
}
/*********************************************************************
*
* MULTIEDIT_SetReadOnly
*/
void MULTIEDIT_SetReadOnly(MULTIEDIT_HANDLE hObj, int OnOff) {
_SetFlag(hObj, OnOff, MULTIEDIT_SF_READONLY);
}
/*********************************************************************
*
* MULTIEDIT_SetPasswordMode
*/
void MULTIEDIT_SetPasswordMode(MULTIEDIT_HANDLE hObj, int OnOff) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
_SetFlag(hObj, OnOff, MULTIEDIT_SF_PASSWORD);
_InvalidateCursorXY(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetAutoScrollV
*/
void MULTIEDIT_SetAutoScrollV(MULTIEDIT_HANDLE hObj, int OnOff) {
_SetFlag(hObj, OnOff, MULTIEDIT_SF_AUTOSCROLLBAR_V);
}
/*********************************************************************
*
* MULTIEDIT_SetAutoScrollH
*/
void MULTIEDIT_SetAutoScrollH(MULTIEDIT_HANDLE hObj, int OnOff) {
_SetFlag(hObj, OnOff, MULTIEDIT_SF_AUTOSCROLLBAR_H);
}
/*********************************************************************
*
* MULTIEDIT_SetHBorder
*/
void MULTIEDIT_SetHBorder(MULTIEDIT_HANDLE hObj, unsigned HBorder) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if ((unsigned)pObj->HBorder != HBorder) {
pObj->HBorder = HBorder;
_Invalidate(hObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetFont
*/
void MULTIEDIT_SetFont(MULTIEDIT_HANDLE hObj, const GUI_FONT GUI_UNI_PTR * pFont) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj->pFont != pFont) {
pObj->pFont = pFont;
_InvalidateTextArea(hObj);
_InvalidateCursorXY(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetBkColor
*/
void MULTIEDIT_SetBkColor(MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color) {
if (hObj && (Index < NUM_DISP_MODES)) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
pObj->aBkColor[Index] = color;
_InvalidateTextArea(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetCursorOffset
*/
void MULTIEDIT_SetCursorOffset(MULTIEDIT_HANDLE hObj, int Offset) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
_SetCursorPos(hObj, pObj, Offset);
WM_Invalidate(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetTextColor
*/
void MULTIEDIT_SetTextColor(MULTIEDIT_HANDLE hObj, unsigned Index, GUI_COLOR color) {
if (hObj && (Index < NUM_DISP_MODES)) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
pObj->aColor[Index] = color;
WM_Invalidate(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetPrompt
*/
void MULTIEDIT_SetPrompt(MULTIEDIT_HANDLE hObj, const char* pPrompt) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
int NumCharsNew = 0, NumCharsOld = 0;
int NumBytesNew = 0, NumBytesOld = 0;
char* pText;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj->hText) {
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
NumCharsOld = pObj->NumCharsPrompt;
NumBytesOld = GUI_UC__NumChars2NumBytes(pText, NumCharsOld);
}
if (pPrompt) {
NumCharsNew = GUI__GetNumChars(pPrompt);
NumBytesNew = GUI_UC__NumChars2NumBytes(pPrompt, NumCharsNew);
}
if (_IsCharsAvailable(pObj, NumCharsNew - NumCharsOld)) {
if (_IsSpaceInBuffer(pObj, NumBytesNew - NumBytesOld)) {
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
memmove(pText + NumBytesNew, pText + NumBytesOld, strlen(pText + NumBytesOld) + 1);
if (pPrompt) {
memcpy(pText, pPrompt, NumBytesNew);
}
pObj->NumCharsPrompt = NumCharsNew;
_SetCursorPos(hObj, pObj, NumCharsNew);
_InvalidateTextArea(hObj);
_InvalidateNumChars(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetBufferSize
*/
void MULTIEDIT_SetBufferSize(MULTIEDIT_HANDLE hObj, int BufferSize) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_HMEM hText;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if ((hText = GUI_ALLOC_AllocZero(BufferSize)) == 0) {
GUI_DEBUG_ERROROUT("MULTIEDIT_SetBufferSize failed to alloc buffer");
} else {
GUI_ALLOC_FreePtr(&pObj->hText);
pObj->hText = hText;
pObj->BufferSize = BufferSize;
pObj->NumCharsPrompt = 0;
_SetCursorPos(hObj, pObj, 0);
_InvalidateNumChars(pObj);
_InvalidateCursorXY(pObj);
_InvalidateNumLines(pObj);
_InvalidateTextSizeX(pObj);
}
_InvalidateTextArea(hObj);
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_SetMaxNumChars
*/
void MULTIEDIT_SetMaxNumChars(MULTIEDIT_HANDLE hObj, unsigned MaxNumChars) {
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
pObj->MaxNumChars = MaxNumChars;
if (MaxNumChars < (unsigned)pObj->NumCharsPrompt) {
pObj->NumCharsPrompt = MaxNumChars;
}
if (pObj->hText && MaxNumChars) {
char* pText;
int Offset;
pText = (char*) GUI_ALLOC_h2p(pObj->hText);
Offset = GUI_UC__NumChars2NumBytes(pText, MaxNumChars);
if (Offset < pObj->BufferSize) {
pText += Offset;
*pText = 0;
_SetCursorPos(hObj, pObj, Offset);
_InvalidateTextArea(hObj);
_InvalidateNumChars(pObj);
}
}
WM_UNLOCK();
}
}
/*********************************************************************
*
* MULTIEDIT_GetTextSize
*
* Purpose:
* Returns the number of bytes required to store the text.
* It is typically used when allocating a buffer to pass to
* MULTIEDIT_GetText().
*/
int MULTIEDIT_GetTextSize(MULTIEDIT_HANDLE hObj) {
int r = 0;
if (hObj) {
MULTIEDIT_OBJ* pObj;
WM_LOCK();
pObj = MULTIEDIT_H2P(hObj);
if (pObj->hText) {
const char* s;
s = (const char*)GUI_ALLOC_h2p(pObj->hText);
s += GUI_UC__NumChars2NumBytes(s, pObj->NumCharsPrompt);
r = 1 + strlen(s);
}
WM_UNLOCK();
}
return r;
}
#else /* avoid empty object files */
void MULTIEDIT_C(void);
void MULTIEDIT_C(void){}
#endif /* #if GUI_WINSUPPORT */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -