edit.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:18k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : EDIT.c
  16. Purpose     : emWin GSC button widget
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #define EDIT_C       /* Required to generate intermodule data */
  22. #include "EDIT.h"
  23. #include "GUIDebug.h"
  24. #include "GUI_Protected.h"
  25. #include "EDIT_Private.h"
  26. #if GUI_WINSUPPORT
  27. /*********************************************************************
  28. *
  29. *       Private config defaults
  30. *
  31. **********************************************************************
  32. */
  33. #ifndef EDIT_LOG_ENABLE
  34.   #ifdef _DEBUG
  35.     #define EDIT_LOG_ENABLE 0
  36.   #else
  37.     #define EDIT_LOG_ENABLE 0
  38.   #endif
  39. #endif
  40. /* Define default fonts */
  41. #ifndef EDIT_FONT_DEFAULT
  42.   #define EDIT_FONT_DEFAULT &GUI_Font13_1
  43. #endif
  44. #ifndef EDIT_ALIGN_DEFAULT
  45.   #define EDIT_ALIGN_DEFAULT GUI_TA_RIGHT | GUI_TA_VCENTER
  46. #endif
  47. /* Define colors */
  48. #ifndef EDIT_BKCOLOR0_DEFAULT
  49.   #define EDIT_BKCOLOR0_DEFAULT 0xc0c0c0
  50. #endif
  51. #ifndef EDIT_BKCOLOR1_DEFAULT
  52.   #define EDIT_BKCOLOR1_DEFAULT GUI_WHITE
  53. #endif
  54. #ifndef EDIT_TEXTCOLOR0_DEFAULT
  55.   #define EDIT_TEXTCOLOR0_DEFAULT GUI_BLACK
  56. #endif
  57. #ifndef EDIT_TEXTCOLOR1_DEFAULT
  58.   #define EDIT_TEXTCOLOR1_DEFAULT GUI_BLACK
  59. #endif
  60. #ifndef EDIT_BORDER_DEFAULT
  61.   #define EDIT_BORDER_DEFAULT 1
  62. #endif
  63. #ifndef EDIT_XOFF
  64.   #define EDIT_XOFF 2
  65. #endif
  66. /*********************************************************************
  67. *
  68. *       Static data
  69. *
  70. **********************************************************************
  71. */
  72. static int _DefaultAlign              = EDIT_ALIGN_DEFAULT;
  73. static int _DefaultBorder             = EDIT_BORDER_DEFAULT;
  74. static const GUI_FONT * _pDefaultFont = EDIT_FONT_DEFAULT;
  75. /*********************************************************************
  76. *
  77. *       Macros for internal use
  78. *
  79. **********************************************************************
  80. */
  81. #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  82.   #define OBJECT_ID 0x4569   /* Magic nubmer, should be unique if possible */
  83.   #define INIT_ID(p)   p->DebugId = OBJECT_ID
  84.   #define DEINIT_ID(p) p->DebugId = 0
  85. #else
  86.   #define INIT_ID(p)
  87.   #define DEINIT_ID(p)
  88. #endif
  89. /*********************************************************************
  90. *
  91. *       Static routines
  92. *
  93. **********************************************************************
  94. */
  95. #if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_CHECK_ALL
  96. EDIT_Obj* EDIT_h2p(EDIT_Handle h) {
  97.   EDIT_Obj* p = (EDIT_Obj*)WM_HMEM2Ptr(h);
  98.   if (p) {
  99.     if (p->DebugId != OBJECT_ID) {
  100.       GUI_DEBUG_ERROROUT("EDIT.C: Wrong handle type or Object not init'ed");
  101.       return 0;
  102.     }
  103.   }
  104.   return p;
  105. }
  106. #endif
  107. /*********************************************************************
  108. *
  109. *       _Paint
  110. */
  111. static void _Paint(EDIT_Obj* pObj) {
  112.   int PixelLen, xSize, ySize, xPosText, xPosCursor, yPosText, yPosCursor, XSizeCursor, YSizeCursor;
  113.   int IsEnabled;
  114.   GUI_RECT rClient, rWindow;
  115.   char * s;
  116.   s = (char*) WM_HMEM2Ptr(pObj->hpText);
  117.   GUI_DEBUG_LOG("BUTTON: _Paint(..)n");
  118.   if (pObj->Border) {
  119.     GUI_SetBkColor(pObj->aBkColor[0]);
  120.     GUI_Clear();
  121.   }
  122.   IsEnabled = WIDGET__IsEnabled(&pObj->Widget);
  123.   /* Set clipping rectangle */
  124.   WIDGET__GetInsideRect(&pObj->Widget, &rWindow);
  125.   WM_SetUserClipRect(&rWindow);
  126.   /* Calculate size */
  127.   GUI_GetClientRect(&rClient);
  128.   xSize = rClient.x1 - rClient.x0 + 1;
  129.   ySize = rClient.y1 - rClient.y0 + 1;
  130.   /* Draw background */
  131.   GUI_SetBkColor (pObj->aBkColor[IsEnabled]);
  132.   GUI_SetColor   (pObj->aTextColor[0]);
  133.   GUI_Clear();
  134.   /* Calculate length */
  135.   GUI_SetFont    (pObj->pFont);
  136.   PixelLen = GUI_GetStringDistX(s);
  137.   /* Calculate size of cursor */
  138.   YSizeCursor = GUI_GetFontDistY();
  139.   if (pObj->EditMode == GUI_EDIT_MODE_INSERT) {
  140.     if (pObj->XSizeCursor != 0) {
  141.       XSizeCursor = pObj->XSizeCursor;
  142.     } else {
  143.       XSizeCursor = GUI_GetCharDistX(' ');
  144.     }
  145.   } else {
  146.     if (pObj->CursorPos < (int)strlen(s))  {
  147.       XSizeCursor = GUI_GetCharDistX(*(s + pObj->CursorPos));
  148.     } else {
  149.       XSizeCursor = pObj->XSizeCursor;
  150.     }
  151.   }
  152.   /* Calculate X-pos */
  153.   switch (pObj->Align & GUI_TA_HORIZONTAL) {
  154.     case GUI_TA_CENTER:
  155.       xPosCursor = (xSize - PixelLen + 1) / 2;
  156.       xPosText = xSize / 2;
  157.       break;
  158.     case GUI_TA_LEFT:
  159.       xPosCursor = pObj->Border + EDIT_XOFF;
  160.       xPosText   = pObj->Border + EDIT_XOFF;
  161.       break;
  162.     case GUI_TA_RIGHT:
  163.       xPosCursor = xSize - (pObj->Border + EDIT_XOFF) - PixelLen;
  164.       xPosText   = xSize - (pObj->Border + EDIT_XOFF);
  165.       break;
  166.   }
  167.   /* Calculate Y-pos */
  168.   switch (pObj->Align & GUI_TA_VERTICAL) {
  169.     case GUI_TA_TOP:
  170.       yPosCursor = 0;
  171.       yPosText = 0;
  172.       break;
  173.     case GUI_TA_BOTTOM:
  174.       yPosCursor = ySize - YSizeCursor;
  175.       yPosText = ySize;
  176.       break;
  177.     case GUI_TA_VCENTER:
  178.       yPosCursor = (ySize - YSizeCursor + 1) / 2;
  179.       yPosText = ySize / 2;
  180.       break;
  181.   }
  182.   /* Display text */
  183.   GUI_SetTextAlign(pObj->Align);
  184.   GUI_DispStringAt(s, xPosText, yPosText);
  185.   /* Display cursor */
  186.   if (pObj->Widget.State & WIDGET_STATE_FOCUS) {
  187.     int i;
  188.     for (i = 0; i != pObj->CursorPos; i++) {
  189.       xPosCursor += GUI_GetCharDistX(*(s + i));
  190.     }
  191.     GUI_InvertRect(xPosCursor, 
  192.                    yPosCursor, 
  193.                    xPosCursor + XSizeCursor - 1, 
  194.                    yPosCursor + YSizeCursor - 1);
  195.   }
  196.   WM_SetUserClipRect(NULL);
  197.   /* Draw the 3D effect (if configured) */
  198.   WIDGET__EFFECT_DrawDown(&pObj->Widget);
  199. }
  200. /*********************************************************************
  201. *
  202. *       _Delete
  203. */
  204. static void _Delete(EDIT_Obj* pObj) {
  205.   WM_FREEPTR(&pObj->hpText);
  206. }
  207. /*********************************************************************
  208. *
  209. *       _SetCursor
  210. */
  211. static void _SetCursor(EDIT_Handle hObj, EDIT_Obj* pObj, int x) {
  212.   int xPos, xSize, PixelLen, Len;
  213.   char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  214.   const GUI_FONT *pOldFont = GUI_SetFont(pObj->pFont);
  215.   xSize = WM_GetWindowSizeX(hObj);
  216.   PixelLen = GUI_GetStringDistX(s);
  217.   xPos = x;
  218.   switch (pObj->Align & GUI_TA_HORIZONTAL) {
  219.     case GUI_TA_CENTER:
  220.       xPos -= (xSize - PixelLen + 1) / 2;
  221.       break;
  222.     case GUI_TA_LEFT:
  223.       xPos -= (pObj->Border + EDIT_XOFF);
  224.       break;
  225.     case GUI_TA_RIGHT:
  226.       xPos -= xSize - PixelLen - (pObj->Border + EDIT_XOFF);
  227.       break;
  228.   }
  229.   Len = strlen(s);
  230.   if (xPos < 0) {
  231.     pObj->CursorPos = 0;
  232.   } else if (xPos > PixelLen) {
  233.     pObj->CursorPos = Len;
  234.   } else {
  235.     int i, x;
  236.     for (i = 0, x = 0; (i < Len) && (x < xPos); i++) {
  237.       int xLenChar = GUI_GetCharDistX(*(s + i));
  238.       if (xPos < (x + xLenChar))
  239.         break;
  240.       x += xLenChar;
  241.     }
  242.     pObj->CursorPos = i;
  243.     EDIT_Invalidate(hObj);
  244.   }
  245.   GUI_SetFont(pOldFont);
  246. }
  247. /*********************************************************************
  248. *
  249. *       _OnTouch
  250. */
  251. static void _OnTouch(EDIT_Handle hObj, EDIT_Obj* pObj, WM_MESSAGE*pMsg) {
  252.   GUI_TOUCH_tState* pState = (GUI_TOUCH_tState*)pMsg->Data.p;
  253.   if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
  254.     if (pState->Pressed) {
  255.       GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Pressed, Handle %d)n",1);
  256.       _SetCursor(hObj, pObj, pState->x);
  257.       WM_SetFocus(hObj);
  258.     } else {
  259.       GUI_DEBUG_LOG1("EDIT__Callback(WM_TOUCH, Released, Handle %d)n",1);
  260.     }
  261.   } else {
  262.     GUI_DEBUG_LOG1("_EDIT_Callback(WM_TOUCH, Moved out, Handle %d)n",1);
  263.   }
  264. }
  265. /*********************************************************************
  266. *
  267. *       Callback
  268. */
  269. static void EDIT__Callback (WM_MESSAGE * pMsg) {
  270.   int IsEnabled;
  271.   EDIT_Handle hObj = (EDIT_Handle)pMsg->hWin;
  272.   EDIT_Obj* pObj = (EDIT_Obj*)WM_HMEM2Ptr(hObj);
  273.   IsEnabled = WIDGET__IsEnabled(&pObj->Widget);
  274.   /* Let widget handle the standard messages */
  275.   if (WIDGET_HandleActive(hObj, pMsg) == 0) {
  276.     return;
  277.   }
  278.   switch (pMsg->MsgId) {
  279.   case WM_TOUCH:
  280.     if (IsEnabled) {
  281.       _OnTouch(hObj, pObj, pMsg);
  282.     }
  283.     break;
  284.   case WM_PAINT:
  285.     GUI_DEBUG_LOG("EDIT: _Callback(WM_PAINT)n");
  286.     _Paint(pObj);
  287.     return;
  288.   case WM_DELETE:
  289.     GUI_DEBUG_LOG("EDIT: _Callback(WM_DELETE)n");
  290.     _Delete(pObj);
  291.     break;       /* No return here ... WM_DefaultProc needs to be called */
  292.   case WM_KEY:
  293.     if (IsEnabled) {
  294.       if ( ((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) {
  295.         int Key = ((WM_KEY_INFO*)(pMsg->Data.p))->Key;
  296.         switch (Key) {
  297.           case GUI_KEY_TAB:
  298.             break;                    /* Send to parent by not doing anything */
  299.           default:
  300.             EDIT_AddKey(hObj, Key);
  301.             return;
  302.         }
  303.       }
  304.     }
  305.     break;
  306.   }
  307.   WM_DefaultProc(pMsg);
  308. }
  309. /*********************************************************************
  310. *
  311. *       Exported routines:  Create
  312. *
  313. **********************************************************************
  314. */
  315. EDIT_Handle EDIT_CreateAsChild     (int x0, int y0, int xsize, int ysize, WM_HWIN hParent, int Id, int Flags, int MaxLen) {
  316.   EDIT_Handle hObj;
  317.   if (MaxLen == 0) {
  318.     MaxLen = 8;
  319.   }
  320.   /* Alloc memory for obj */
  321.   WM_LOCK();
  322.   hObj = WM_CreateWindowAsChild(x0, y0, xsize, ysize, hParent, 
  323.                        WM_CF_SHOW | Flags, EDIT__Callback,
  324.                        sizeof(EDIT_Obj)-sizeof(WM_Obj));
  325.   if (hObj) {
  326.     EDIT_Obj* pObj = (EDIT_Obj*)WM_HMEM2Ptr(hObj);
  327.     /* init widget specific variables */
  328.     WIDGET__Init(&pObj->Widget, WIDGET_STATE_FOCUSSABLE  | WIDGET_STATE_ENABLED);
  329.     pObj->Widget.Id     = Id;
  330.     /* init member variables */
  331.     INIT_ID(pObj);
  332.     pObj->pFont         = _pDefaultFont;
  333.     pObj->aBkColor[0]   = EDIT_BKCOLOR0_DEFAULT;
  334.     pObj->aBkColor[1]   = EDIT_BKCOLOR1_DEFAULT;
  335.     pObj->aTextColor[0] = EDIT_TEXTCOLOR0_DEFAULT;
  336.     pObj->aTextColor[1] = EDIT_TEXTCOLOR1_DEFAULT;
  337.     pObj->Align         = _DefaultAlign;
  338.     pObj->Border        = _DefaultBorder;
  339.     pObj->XSizeCursor   = 1;
  340.     pObj->MaxLen        = MaxLen;
  341.     if ((pObj->hpText = WM_ALLOC(MaxLen+1)) ==0) {
  342.       GUI_DEBUG_ERROROUT("EDIT_Create failed to alloc buffer");
  343.       EDIT_Delete(hObj);
  344.       hObj =0;
  345.     }
  346.   }
  347.   WM_UNLOCK();
  348.   return hObj;
  349. }
  350. EDIT_Handle EDIT_Create(int x0, int y0, int xsize, int ysize, int Id, int MaxLen, int Flags) {
  351.   return EDIT_CreateAsChild(x0, y0, xsize, ysize, WM_HMEM_NULL, Id, Flags, MaxLen);
  352. }
  353. EDIT_Handle EDIT_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* pCallback) {
  354.   EDIT_Handle hEdit;
  355.   GUI_USE_PARA(pCallback);
  356.   hEdit = EDIT_CreateAsChild(
  357.     pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize,
  358.     hWinParent, pCreateInfo->Id, pCreateInfo->Flags, pCreateInfo->Para);
  359.   return hEdit;
  360. }
  361. /*********************************************************************
  362. *
  363. *       Exported routines:  Various methods
  364. *
  365. **********************************************************************
  366. */
  367. void EDIT_AddKey(EDIT_Handle hObj, int Key) {
  368.   EDIT_Obj* pObj;
  369.   if (hObj == 0)
  370.     return;
  371.   WM_LOCK();
  372.   pObj = EDIT_H2P(hObj);
  373.   if (pObj) {
  374.     if (pObj->pfAddKeyEx) {
  375.       pObj->pfAddKeyEx(pObj, hObj, Key);
  376.     } else {
  377.       char*s = (char*) WM_HMEM2Ptr(pObj->hpText);
  378.       int len = strlen(s);
  379.       switch (Key) {
  380.         case GUI_KEY_UP:
  381.           {
  382.             char c = *(s + pObj->CursorPos);
  383.             if (c < 0x7f) {
  384.               *(s + pObj->CursorPos) = c + 1;
  385.               WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  386.             }
  387.           }
  388.           break;
  389.         case GUI_KEY_DOWN:
  390.           {
  391.             char c = *(s + pObj->CursorPos);
  392.             if (c > 0x20) {
  393.               *(s + pObj->CursorPos) = c - 1;
  394.               WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  395.             }
  396.           }
  397.           break;
  398.         case GUI_KEY_RIGHT:
  399.           if (pObj->CursorPos < (pObj->MaxLen - 1))
  400.             if (pObj->CursorPos < len)
  401.               pObj->CursorPos++;
  402.           break;
  403.         case GUI_KEY_LEFT:
  404.           if (pObj->CursorPos > 0)
  405.             pObj->CursorPos--;
  406.           break;
  407.         case GUI_KEY_BACKSPACE:
  408.           if ((len > 0) && (pObj->CursorPos > 0)) {
  409.             int CopyLength = pObj->MaxLen - pObj->CursorPos;
  410.             strncpy(s + pObj->CursorPos - 1, s + pObj->CursorPos, CopyLength);
  411.             *(s + len - 1) = 0;
  412.             WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  413.             pObj->CursorPos--;
  414.           }
  415.           break;
  416.         case GUI_KEY_DELETE:
  417.           if ((len > 0) && (pObj->CursorPos < len)) {
  418.             if (len > 1) {
  419.               int CopyLength = pObj->MaxLen - pObj->CursorPos - 1;
  420.               strncpy(s + pObj->CursorPos, s + pObj->CursorPos + 1, CopyLength);
  421.             }
  422.             *(s + len - 1) = 0;
  423.             WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  424.           }
  425.           break;
  426.         case GUI_KEY_INSERT:
  427.           if (pObj->EditMode == GUI_EDIT_MODE_OVERWRITE)
  428.             pObj->EditMode = GUI_EDIT_MODE_INSERT;
  429.           else
  430.             pObj->EditMode = GUI_EDIT_MODE_OVERWRITE;
  431.           break;
  432.         case GUI_KEY_ENTER:
  433.         case GUI_KEY_ESCAPE:
  434.           break;
  435.         default:
  436.           if ((Key >= 0x20) && (Key <= 0x7f)) {
  437.             if (pObj->EditMode == GUI_EDIT_MODE_INSERT) {
  438.               if (len < pObj->MaxLen) {
  439.                 int CopyLength = pObj->MaxLen - pObj->CursorPos - 1;
  440.                 memmove(s + pObj->CursorPos + 1, s + pObj->CursorPos, CopyLength);
  441.                 *(s + pObj->CursorPos) = Key;
  442.                 WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  443.                 if (pObj->CursorPos < (pObj->MaxLen - 1))
  444.                   pObj->CursorPos++;
  445.               }
  446.             } else {
  447.               *(s + pObj->CursorPos) = Key;
  448.               WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  449.               if (pObj->CursorPos < (pObj->MaxLen - 1))
  450.                 pObj->CursorPos++;
  451.             }
  452.           }
  453.           break;
  454.       }
  455.     }
  456.     EDIT_Invalidate(hObj);
  457.   }
  458.   WM_UNLOCK();
  459. }
  460. void EDIT_SetFont(EDIT_Handle hObj, const GUI_FONT* pfont) {
  461.   EDIT_Obj* pObj;
  462.   if (hObj == 0)
  463.     return;
  464.   WM_LOCK();
  465.   pObj = EDIT_H2P(hObj);
  466.   if (pObj) {
  467.     pObj->pFont = pfont;
  468.     EDIT_Invalidate(hObj);
  469.   }
  470.   WM_UNLOCK();
  471. }
  472. void EDIT_SetBkColor(EDIT_Handle hObj, int Index, GUI_COLOR color) {
  473.   EDIT_Obj* pObj;
  474.   if (hObj == 0)
  475.     return;
  476.   WM_LOCK();
  477.   pObj = EDIT_H2P(hObj);
  478.   if (pObj) {
  479.     pObj->aBkColor[Index] = color;
  480.     EDIT_Invalidate(hObj);
  481.   }
  482.   WM_UNLOCK();
  483. }
  484. void EDIT_SetTextColor(EDIT_Handle hObj, int Index, GUI_COLOR color) {
  485.   EDIT_Obj* pObj;
  486.   if (hObj == 0)
  487.     return;
  488.   WM_LOCK();
  489.   pObj = EDIT_H2P(hObj);
  490.   if (pObj) {
  491.     pObj->aTextColor[Index] = color;
  492.     EDIT_Invalidate(hObj);
  493.   }
  494.   WM_UNLOCK();
  495. }
  496. void EDIT_SetText     (EDIT_Handle hObj, const char* sNew) {
  497.   EDIT_Obj* pObj;
  498.   if (hObj == 0)
  499.     return;
  500.   WM_LOCK();
  501.   pObj = EDIT_H2P(hObj);
  502.   if (pObj) {
  503.     char*sDest = (char*) WM_HMEM2Ptr(pObj->hpText);
  504.     int Len = sNew ? strlen(sNew) : 0;
  505.     if (Len > pObj->MaxLen)
  506.       Len = pObj->MaxLen;
  507.     memcpy(sDest, sNew, Len);
  508.     *(sDest+Len) = 0;
  509.     pObj->CursorPos = Len;
  510.     if (pObj->CursorPos == pObj->MaxLen)
  511.       pObj->CursorPos--;
  512.     EDIT_Invalidate(hObj);
  513.   }
  514.   WM_UNLOCK();
  515. }
  516. void EDIT_GetText(EDIT_Handle hObj, char* sDest, int MaxLen) {
  517.   EDIT_Obj* pObj;
  518.   if (hObj == 0)
  519.     return;
  520.   WM_LOCK();
  521.   pObj = EDIT_H2P(hObj);
  522.   if (pObj) {
  523.     char * sSource = (char*) WM_HMEM2Ptr(pObj->hpText);
  524.     int Len = strlen(sSource);
  525.     if (Len > (MaxLen - 1))
  526.       Len = MaxLen - 1;
  527.     memcpy((void *)sDest, (const void *)sSource, Len);
  528.     *(sDest+Len) = 0;
  529.   }
  530.   WM_UNLOCK();
  531. }
  532. I32  EDIT_GetValue(EDIT_Handle hObj) {
  533.   EDIT_Obj* pObj;
  534.   I32 r = 0;
  535.   if (hObj) {
  536.     WM_LOCK();
  537.     pObj = EDIT_H2P(hObj);
  538.     r = pObj->CurrentValue;
  539.     WM_UNLOCK();
  540.   }
  541.   return r;
  542. }
  543. void EDIT_SetValue(EDIT_Handle hObj, I32 Value) {
  544.   EDIT_Obj* pObj;
  545.   if (hObj) {
  546.     WM_LOCK();
  547.     pObj = EDIT_H2P(hObj);
  548.     /* Put in min/max range */
  549.     if (Value < pObj->Min) {
  550.       Value = pObj->Min;
  551.     }
  552.     if (Value > pObj->Max) {
  553.       Value = pObj->Max;
  554.     }
  555.     if (pObj->CurrentValue != (U32)Value) {
  556.       pObj->CurrentValue = Value;
  557.       if (pObj->pfUpdateBufer) {
  558.         pObj->pfUpdateBufer(pObj);
  559.       }
  560.       WM_InvalidateWindow(hObj);
  561.       WM_NotifyParent(hObj, WM_NOTIFICATION_VALUE_CHANGED);
  562.     }
  563.     WM_UNLOCK();
  564.   }
  565. }
  566. void EDIT_SetMaxLen(EDIT_Handle  hObj, int MaxLen) {
  567.   EDIT_Obj* pObj;
  568.   WM_HMEM hpText;
  569.   if (hObj) {
  570.     WM_LOCK();
  571.     pObj = EDIT_H2P(hObj);
  572.     if ((hpText = WM_ALLOC(MaxLen+1)) ==0) {
  573.       GUI_DEBUG_ERROROUT("EDIT_SetMaxLen failed to alloc buffer");
  574.     } else {
  575.       WM_FREEPTR(&pObj->hpText);
  576.       pObj->hpText = hpText;
  577.       pObj->MaxLen = MaxLen;
  578.     }
  579.     EDIT_Invalidate(hObj);
  580.     WM_UNLOCK();
  581.   }
  582. }
  583. void EDIT_SetTextAlign(EDIT_Handle hObj, int Align) {
  584.   EDIT_Obj* pObj;
  585.   if (hObj == 0)
  586.     return;
  587.   WM_LOCK();
  588.   pObj = EDIT_H2P(hObj);
  589.   if (pObj) {
  590.     pObj->Align = Align;
  591.     EDIT_Invalidate(hObj);
  592.   }
  593.   WM_UNLOCK();
  594. }
  595. void EDIT_SetDefaultFont(const GUI_FONT* pFont) {
  596.   _pDefaultFont = pFont;
  597. }
  598. const GUI_FONT* EDIT_GetDefaultFont(void) {
  599.   return _pDefaultFont;
  600. }
  601. void EDIT_SetDefaultTextAlign(int Align) {
  602.   WM_LOCK();
  603.   _DefaultAlign = Align;
  604.   WM_UNLOCK();
  605. }
  606. #else  /* avoid empty object files */
  607. void Edit_C(void) {}
  608. #endif