⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multiedit.c

📁 成功移植到s3c44b0开发板上的ucos-ii和lwip
💻 C
📖 第 1 页 / 共 4 页
字号:
/* 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 + -