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

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        : EditDec
  16. Purpose     : Edit decimal values
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <string.h>
  20. #include "EDIT.h"
  21. #include "GUIDebug.h"
  22. #include "GUI_Protected.h"
  23. #include "EDIT_Private.h"
  24. #if GUI_WINSUPPORT
  25. /*********************************************************************
  26. *
  27. *        Defaults for config switches
  28. *
  29. **********************************************************************
  30. */
  31. #ifndef EDIT_DEC_DIGITONLY
  32.   #define EDIT_DEC_DIGITONLY     0
  33. #endif
  34. /*********************************************************************
  35. *
  36. *        static Helpers
  37. *
  38. **********************************************************************
  39. */
  40. static int _DecChar2Int(int Char) {
  41.   if ((Char >= '0') && (Char <= '9'))
  42.     return Char - '0';
  43.   return -1;
  44. }
  45. static void _UpdateBuffer(EDIT_Obj* pObj) {
  46.   char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  47.   if (pObj->Flags == GUI_EDIT_SIGNED) {
  48.     I32 Result = GUI_AddSign(pObj->CurrentValue, &s);
  49.     GUI_AddDecShift(Result, pObj->MaxLen - 1, pObj->NumDecs, &s);
  50.   } else {
  51.     GUI_AddDecShift(pObj->CurrentValue, pObj->MaxLen, pObj->NumDecs, &s);
  52.   }
  53. }
  54. static void _EditDec(int Digit, EDIT_Obj* pObj, EDIT_Handle hObj) {
  55.   I32 Result = 0;
  56.   int i, Pos = 0;
  57.   char * s = (char*) WM_HMEM2Ptr(pObj->hpText);
  58.   for (i = 0; i < pObj->MaxLen; i++) {
  59.     int Index = pObj->MaxLen - i - 1;
  60.     if (Index == pObj->CursorPos) {
  61.       Result += GUI_Pow10[Pos++] * Digit;
  62.     } else {
  63.       char c = *(s + Index);
  64.       int Value = _DecChar2Int(c);
  65.       if (Value >= 0) {
  66.         Result += GUI_Pow10[Pos++] * Value;
  67.       }
  68.       if (c == '-') {
  69.         Result *= -1;
  70.       }
  71.     }
  72.   }
  73.   EDIT_SetValue(hObj, Result);
  74. }
  75. static char _GetCurrentChar(EDIT_Obj* pObj) {
  76.   return *((char*) WM_HMEM2Ptr(pObj->hpText) + pObj->CursorPos);
  77. }
  78. #if EDIT_DEC_DIGITONLY
  79. static int GetCurrentDigit(EDIT_Obj* pObj) {
  80.   return _DecChar2Int(_GetCurrentChar(pObj));
  81. }
  82. #endif
  83. static void _MakePositive(EDIT_Obj* pObj, EDIT_Handle hObj) {
  84.   if ((I32)pObj->CurrentValue < 0) {
  85.     EDIT_SetValue(hObj, (I32)pObj->CurrentValue * -1);
  86.   }
  87. }
  88. static void _MakeNegative(EDIT_Obj* pObj, EDIT_Handle hObj) {
  89.   if ((I32)pObj->CurrentValue > 0) {
  90.     EDIT_SetValue(hObj, (I32)pObj->CurrentValue * -1);
  91.   }
  92. }
  93. static void _SwapSign(EDIT_Obj* pObj, EDIT_Handle hObj) {
  94.   if ((I32)pObj->CurrentValue > 0)
  95.     _MakeNegative(pObj, hObj);
  96.   else
  97.     _MakePositive(pObj, hObj);
  98. }
  99. static void _IncrementCursor(EDIT_Obj* pObj) {
  100.   if (pObj->CursorPos < (pObj->MaxLen - 1))
  101.     pObj->CursorPos++;
  102.   if (_GetCurrentChar(pObj) == '.') {
  103.     if (pObj->CursorPos < (pObj->MaxLen - 1)) {
  104.       pObj->CursorPos++;
  105.     } else {
  106.       pObj->CursorPos--;
  107.     }
  108.   }
  109. }
  110. #if !EDIT_DEC_DIGITONLY
  111. static void _AddPosition(EDIT_Obj* pObj, EDIT_Handle hObj, int Sign) {
  112.   int Pos;
  113.   I32 v;
  114.   v = Sign;
  115.   Pos = pObj->MaxLen - pObj->CursorPos-1;
  116.   if (pObj->NumDecs && (Pos > pObj->NumDecs)) {
  117.     Pos--;
  118.   }
  119.   while (Pos--) {
  120.     v *= 10;
  121.   }
  122.   EDIT_SetValue(hObj, (I32)pObj->CurrentValue + v);
  123. }
  124. #endif
  125. /*********************************************************************
  126. *
  127. *             Handle input
  128. *
  129. **********************************************************************
  130. */
  131. static void _AddKeyDec(EDIT_Obj* pObj, EDIT_Handle hObj, int Key) {
  132.   char c;
  133.   if (pObj) {
  134.     switch (Key) {
  135.       case '+':
  136.         if (pObj->CursorPos == 0) {
  137.           _MakePositive(pObj, hObj);
  138.           _IncrementCursor(pObj);
  139.         }
  140.         break;
  141.       case '-':
  142.         if (pObj->CursorPos == 0) {
  143.           _MakeNegative(pObj, hObj);
  144.           _IncrementCursor(pObj);
  145.         }
  146.         break;
  147.       #if EDIT_DEC_DIGITONLY
  148.         case GUI_KEY_UP:
  149.           c = _GetCurrentChar(pObj);
  150.           if ((c == '-') || (c == '+')) {
  151.             _SwapSign(pObj, hObj);
  152.           } else {
  153.             int Digit = GetCurrentDigit(pObj) + 1;
  154.             if (Digit > 9)
  155.               Digit = 0;
  156.             _EditDec(Digit, pObj, hObj);
  157.           }
  158.           break;
  159.         case GUI_KEY_DOWN:
  160.           c = _GetCurrentChar(pObj);
  161.           if ((c == '-') || (c == '+')) {
  162.             _SwapSign(pObj, hObj);
  163.           } else {
  164.             int Digit = GetCurrentDigit(pObj) - 1;
  165.             if (Digit < 0)
  166.               Digit = 9;
  167.             _EditDec(Digit, pObj, hObj);
  168.           }
  169.           break;
  170.       #else
  171.         case GUI_KEY_UP:
  172.           c = _GetCurrentChar(pObj);
  173.           if ((c == '-') || (c == '+')) {
  174.             _SwapSign(pObj, hObj);
  175.           } else {
  176.             _AddPosition(pObj, hObj, 1);
  177.           }
  178.           break;
  179.         case GUI_KEY_DOWN:
  180.           c = _GetCurrentChar(pObj);
  181.           if ((c == '-') || (c == '+')) {
  182.             _SwapSign(pObj, hObj);
  183.           } else {
  184.             _AddPosition(pObj, hObj, -1);
  185.           }
  186.           break;
  187.       #endif
  188.       case GUI_KEY_RIGHT:
  189.         _IncrementCursor(pObj);
  190.         break;
  191.       case GUI_KEY_LEFT:
  192.         if (pObj->CursorPos > 0)
  193.           pObj->CursorPos--;
  194.         if (_GetCurrentChar(pObj) == '.') {
  195.           if (pObj->CursorPos > 0) {
  196.             pObj->CursorPos--;
  197.           } else {
  198.             pObj->CursorPos++;
  199.           }
  200.         }
  201.         break;
  202.       default:
  203.         {
  204.           char c = _GetCurrentChar(pObj);
  205.           if ((c != '-') && (c != '+')) {
  206.             int Digit = _DecChar2Int(Key);
  207.             if (Digit >= 0) {
  208.               _EditDec(Digit, pObj, hObj);
  209.               _IncrementCursor(pObj);
  210.             }
  211.           }
  212.         }
  213.         break;
  214.     }
  215.   }
  216.   _UpdateBuffer(pObj);
  217. }
  218. /*********************************************************************
  219. *
  220. *             Exported routines
  221. *
  222. **********************************************************************
  223. */
  224. void EDIT_SetDecMode(EDIT_Handle hEdit, I32 Value, I32 Min, I32 Max, int Shift, U8 Flags) {
  225.   EDIT_Obj* pObj;
  226.   WM_LOCK();
  227.   if (hEdit) {
  228.     pObj = EDIT_H2P(hEdit);
  229.     pObj->pfAddKeyEx    = _AddKeyDec;
  230.     pObj->pfUpdateBufer = _UpdateBuffer;
  231.     pObj->CurrentValue  = Value;
  232.     pObj->CursorPos     = 0;
  233.     pObj->Min           = Min;
  234.     pObj->Max           = Max;
  235.     pObj->NumDecs       = Shift;
  236.     pObj->Flags         = Flags;
  237.     pObj->EditMode      = GUI_EDIT_MODE_OVERWRITE;
  238.     _UpdateBuffer(pObj);
  239.     if (_GetCurrentChar(pObj) == '.') {
  240.       pObj->CursorPos++;
  241.     }
  242.   }
  243.   WM_UNLOCK();
  244. }
  245. #else  /* avoid empty object files */
  246. void EditDec_C(void);
  247. #endif /* GUI_WINSUPPORT */