/*����������������������������������������������������������������������������*/
PSZ
MpFormat(MPARAM    mpValue,
         MP_FORMAT mpFormat,
         PSZ       pszWhere)
{
  /**************************************************************************
  * Local data
  **************************************************************************/
  CHAR    szC1[32],
          szC2[32],
          szC3[32],
          szC4[32];

  /**************************************************************************
  * Locate control data for this MP format specification
  **************************************************************************/
  PMPF_CONTROL pMPF = MpFind(mpFormat);

  /**************************************************************************
  * Process based on MP format specified
  **************************************************************************/
  switch(pMPF->mpMethod)
  {
    /**************************************************************************
    * Format as one 32 bit value
    **************************************************************************/
    case As_32:

         sprintf(pszWhere,
                 pMPF->pszFormat,

                 mpValue);
    break;

    /**************************************************************************
    * Format as two 16 bit values
    **************************************************************************/
    case As_16_16:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  SHORT2FROMMP(mpValue),

                  SHORT1FROMMP(mpValue)
                );
    break;

    /**************************************************************************
    * Format as 16 bit and two 8 bit values
    **************************************************************************/
    case As_16_8_8:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  SHORT2FROMMP(mpValue),

                  CHAR2FROMMP(mpValue),
                  CHAR1FROMMP(mpValue)
                );
    break;

    /**************************************************************************
    * Format as 16 bit and two character values
    **************************************************************************/
    case As_16_C_C:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  SHORT2FROMMP(mpValue),

                  MpAsCharacter( CHAR2FROMMP(mpValue), szC1 ),
                  MpAsCharacter( CHAR1FROMMP(mpValue), szC2 )
                );
    break;

    /**************************************************************************
    * Format as two 8 bit and 16 bit values
    **************************************************************************/
    case As_8_8_16:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  CHAR4FROMMP(mpValue),
                  CHAR3FROMMP(mpValue),

                  SHORT1FROMMP(mpValue)
                );
    break;

    /**************************************************************************
    * Format as two character and 16 bit values
    **************************************************************************/
    case As_C_C_16:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  MpAsCharacter( CHAR4FROMMP(mpValue), szC1 ),
                  MpAsCharacter( CHAR3FROMMP(mpValue), szC2 ),

                  SHORT1FROMMP(mpValue)
                );
    break;

    /**************************************************************************
    * Format as four 8 bit values
    **************************************************************************/
    case As_8_8_8_8:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  CHAR4FROMMP(mpValue),
                  CHAR3FROMMP(mpValue),

                  CHAR2FROMMP(mpValue),
                  CHAR1FROMMP(mpValue)
                );
    break;

    /**************************************************************************
    * Format as four character values
    **************************************************************************/
    case As_C_C_C_C:

         MpFormat(mpValue, MP_32H, pszWhere);

         strcat(pszWhere, ": ");

         sprintf( pszWhere + strlen(pszWhere),
                  pMPF->pszFormat,

                  MpAsCharacter( CHAR4FROMMP(mpValue), szC1 ),
                  MpAsCharacter( CHAR3FROMMP(mpValue), szC2 ),

                  MpAsCharacter( CHAR2FROMMP(mpValue), szC3 ),
                  MpAsCharacter( CHAR1FROMMP(mpValue), szC4 )
                );
    break;
  }

  /**************************************************************************
  * Return where formatted MP text went
  **************************************************************************/
  return(pszWhere);
}
Пример #2
0
MRESULT hia_wmChar(HWND hwnd,MPARAM mp1,MPARAM mp2)
{
USHORT  fsFlags = SHORT1FROMMP(mp1);
UCHAR   ucVkey  = CHAR3FROMMP(mp2);
UCHAR   ucChar  = CHAR1FROMMP(mp2);
UCHAR   ucScancode = CHAR4FROMMP(mp1);

HIA     *hia    = WinQueryWindowPtr(hwnd,WINWORD_INSTANCE);

USHORT ckey;

//  printf("HIA:: WM_CHAR\n");

    if (fsFlags & KC_KEYUP) return 0L;

    if( hia->isHanjaKey != NULL )
    {
        if( hia->isHanjaKey( fsFlags, ucScancode, ucVkey, ucChar ))
        {
            if( hia->inbuf->newpos != HIABUF_NONE )
            {
                HANCHAR hch = SHORT1FROMMR( WinSendMsg( hwnd, HIAM_QUERYWORKINGHCH, 0, 0 ));
                HANCHAR hj;

                hj = hjselDlg( HWND_DESKTOP, hia->responseTo->hwnd, NULLHANDLE, hch );
                if( hj != HCH_SINGLE_SPACE )
                    hch = hj;

                WinSendMsg( hwnd, HIAM_CANCELBUF, 0, 0 );
                HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROMSHORT(hch));
                HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROMSHORT(hch));

                //WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 );
                //HIA_NotifyToConnected( hia, HIAN_HGHJCONVERT, MPFROMLONG( TRUE ));
            }
            else
                HIA_NotifyToConnected( hia, HIAN_HGHJCONVERT, 0);

            return MRFROMLONG( TRUE );
        }
    }

    if( hia->isSpecialCharKey != NULL )
    {
        if( hia->isSpecialCharKey( fsFlags, ucScancode, ucVkey, ucChar ))
        {
            SCSELINFO scselInfo = { -1, -1, -1 };

            WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 );

            scselDlg( HWND_DESKTOP, hia->responseTo->hwnd, NULLHANDLE, &scselInfo );
            if( scselInfo.hch != HCH_SINGLE_SPACE )
            {
                HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROMSHORT(scselInfo.hch));
                HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROMSHORT(scselInfo.hch));
            }

            return MRFROMLONG( TRUE );
        }
    }

    if (fsFlags & KC_VIRTUALKEY)
        {
        switch (ucVkey) {
        case VK_SPACE:
            WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
            if (FKC_SHIFTONLY(fsFlags))
                WinSendMsg(hwnd,HIAM_CHANGEHANMODE,0L,0L);
            else if (FKC_CTRLONLY(fsFlags))
                WinSendMsg(hwnd,HIAM_CHANGEKBDTYPE,0L,0L);
            else if (FKC_NONE(fsFlags))
                HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(' ',0));
            return MRFROMLONG(TRUE);    // consumed
            break;
        case VK_TAB:
            WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
            if (FKC_NONE(fsFlags))
                {
                HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT('\t',0));
                return MPFROMLONG(TRUE);    // consumed
                } else {
                return MPFROMLONG(FALSE);
                }
            break;
        case VK_HOME:
        case VK_END:
        case VK_LEFT:
        case VK_UP:
        case VK_DOWN:
        case VK_PAGEUP:
        case VK_PAGEDOWN:
        case VK_PAGEDOWN + 0x90:
        case VK_DELETE:
            if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break;  // considering keypad
            if (hia->inbuf->newpos != HIABUF_NONE)
                WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
            return MPFROMLONG(FALSE);
            break;
        case VK_ENTER:
        case VK_NEWLINE:
            if (hia->inbuf->newpos != HIABUF_NONE)
                WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
            return MPFROMLONG(FALSE);   // not consumed
            break;
        case VK_RIGHT:
            if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break;   // considering keypad
            if (hia->inbuf->newpos != HIABUF_NONE)
                {
                WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
                return MRFROMLONG(TRUE);
                } else {
                return MRFROMLONG(FALSE);   // NOT consumed
                }
            break;
        case VK_BACKSPACE:
            if (hia->inbuf->newpos != HIABUF_NONE)
                {
                WinSendMsg(hwnd,HIAM_CANCELKEY,0L,0L);
                return MRFROMLONG(TRUE);
                } else {
                return MRFROMLONG(FALSE);
                }
            break;

        case VK_INSERT:
            if ((fsFlags & KC_CHAR) && (FKC_NONE(fsFlags))) break;   // considering keypad
            if (hia->inbuf->newpos != HIABUF_NONE)
                WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
            if (FKC_NONE(fsFlags))
                {
                WinSendMsg(hwnd,HIAM_CHANGEINSERTMODE,0L,0L);
                return MRFROMLONG(TRUE);
                } else {
                return MRFROMLONG(FALSE);
                }
            break;

        case VK_ESC :
            WinSendMsg(hwnd,HIAM_CANCELBUF,0L,0L);

            return FALSE;

        case VK_SHIFT :
        case VK_CTRL :
        case VK_ALT :
            return FALSE;
        }   // switch

        WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 );

        return FALSE;
        } // Virtualkey

    if(( fsFlags & ( KC_CTRL | KC_ALT )) || (ucChar < 32) || (ucChar > 127))
    {
        WinSendMsg( hwnd, HIAM_COMPLETEHCH, 0, 0 );
        return FALSE;
    }

    if (hia->hanmode == HCH_ENG)
        {
        HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(ucChar,0));
        return MRFROMLONG(TRUE);
        }

    if ((hia_iskeypadkey(ucScancode))&&(fsFlags & KC_CHAR))
        {
        WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
        HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(ucChar,0));
        return MRFROMLONG(TRUE);
        }

    ucChar = hia_transkey( fsFlags, ucScancode, ucChar );

    if (WinGetKeyState(HWND_DESKTOP,VK_CAPSLOCK))
        {
        if (fsFlags & KC_SHIFT)
            {
            ucChar = toupper(ucChar);
            } else {
            ucChar = tolower(ucChar);
            }
        }
    ckey = hia_convertkey(hia->kbdtype,ucChar);
    {
    HANCHAR completedHch;
    HANCHAR workingHch;
    if (ckey & 0x80)    // if hangul key
        {
        ULONG oldbufState = hia->inbuf->newpos;
        if (hia->kbdtype == HAN_KBD_2)
            completedHch = HIAAutomata2(hia,ckey);
            else
            completedHch = HIAAutomata3(hia,ckey);
        workingHch = SHORT1FROMMR(WinSendMsg(hwnd,HIAM_QUERYWORKINGHCH,0L,0L));

        if (completedHch)       // if hch completed
            {
            HIA_NotifyToConnected(hia,HIAN_COMPO_COMPLETE,MPFROM2SHORT(completedHch,workingHch));
            HIA_NotifyToConnected(hia,HIAN_INSERTHCH,MPFROM2SHORT(completedHch,workingHch));
            if (workingHch)     // begin composition of new hch
                HIA_NotifyToConnected(hia,HIAN_COMPO_BEGIN,MPFROM2SHORT(completedHch,workingHch));

            } else {    // if hch not completed

            if (workingHch)     // if exist composing hch
            if (oldbufState)
                HIA_NotifyToConnected(hia,HIAN_COMPO_STEP,
                    MPFROM2SHORT(0,workingHch));
                else
                HIA_NotifyToConnected(hia,HIAN_COMPO_BEGIN,
                    MPFROM2SHORT(0,workingHch));
            }

        return MRFROMLONG(TRUE);    // consumed

        } else {  // !@#$%^&*() ,etc

        WinSendMsg(hwnd,HIAM_COMPLETEHCH,0L,0L);
        HIA_NotifyToConnected(hia,HIAN_INSERTHCH,
            MPFROM2SHORT(ckey,0));
        return MRFROMLONG(TRUE);    // consumed

        }
        }
    return MRFROMLONG(FALSE);    // not consumed
}
/**************************************************************************\
*                                                                          *
*       ROUTINE:    EntryFieldSubProc                                      *
*                                                                          *
*       COMMENT:    "Alarm..." dialog                                      *
* This procedure filter messages for the entry field and make it a time    *
* entry field. It doesn't allow for illigal characters according to the    *
* current selection. It doesn't allow modification of the time separator.  *
* It works only for hours and minutes. The entry field has to be limited   *
* to 5 characters.                                                         *
*                                                                          *
*                                                                          *
*       RETURNS:    MRESULT, 0 or return value from WinDefDlgProc          *
*                                                                          *
\**************************************************************************/
MRESULT EXPENTRY EntryFieldSubProc(HWND hwnd, ULONG usMsg, MPARAM mp1, MPARAM mp2)
{
   USHORT usSelect, fsKeyFlags, usLast;
   UCHAR usChr1;
   UCHAR uchHourMinutes[6];
   BOOL bValid;

   if ((usMsg > WM_MOUSEFIRST) && (usMsg < WM_MOUSELAST))
   {
      MRESULT mresult = pfnwpEntryField(hwnd, usMsg, mp1, mp2);
      MRESULT mresultSel = pfnwpEntryField(hwnd, EM_QUERYSEL, (PLONG)NULL, (PLONG)NULL);

      usSelect = LOUSHORT(mresultSel);
      usLast   = HIUSHORT(mresultSel);
      if ((usSelect == 2))
         pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(3, 3), NULL);
      if ((usSelect == 5))
         pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(4, 4), NULL);
      return mresult;
   }

   switch (usMsg)
   {
   case WM_SETFOCUS:
      pfnwpEntryField(hwnd, usMsg, mp1, mp2);
      if (SHORT1FROMMP(mp2))
          pfnwpEntryField(hwnd,
                          EM_SETINSERTMODE,
                          MPFROMSHORT(FALSE),
                          (MPARAM)NULL);
      return MPVOID;

   case WM_CHAR:
      fsKeyFlags = SHORT1FROMMP(mp1);    /* key flags             */
      if (!(fsKeyFlags & KC_KEYUP))
      {
         usSelect = (USHORT)WinSendMsg(hwnd, EM_QUERYSEL, MPVOID, MPVOID);
         if (fsKeyFlags & KC_VIRTUALKEY)
         {
            switch(SHORT2FROMMP(mp2))
            {
            case VK_UP:
            case VK_DOWN:
               break;

            case VK_LEFT:
               if (usSelect == 3)
                   pfnwpEntryField(hwnd, usMsg, mp1, mp2);
               return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
               break;

            case VK_RIGHT:
               if (usSelect == 4)
               {
                  return MPVOID;
               }
               if (usSelect == 1)
                  pfnwpEntryField(hwnd, usMsg, mp1, mp2);
               return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
               break;

            case VK_DELETE:
            case VK_BACKSPACE:
            case VK_INSERT:
               return MPVOID;

            case VK_SPACE:
               switch (usSelect)
               {
               case 0:   /*  Hours most significant digit   */
                  if (bTwelveHourFormat)
                  {
                     return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                  }

               default:
                  return MPVOID;
               }

            default:
               return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
               break;
            }
         }
         else
         {
            if (fsKeyFlags & KC_CHAR)
            {
               bValid = FALSE;
               WinQueryWindowText(hwnd, sizeof(uchHourMinutes), uchHourMinutes);
               usChr1 = (UCHAR)CHAR1FROMMP(mp2);
               switch (usSelect)
               {
               case 0:   /* Hours most significant digit */
                  if (bTwelveHourFormat)
                  {
                     if ((usChr1 > '1') || (usChr1 < '0'))
                     {
                         return MPVOID;
                     }
                     else
                     {
                         pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                         bValid = TRUE;
                     }
                  }
                  else
                  {
                     if ((usChr1 > '2') || (usChr1 < '0'))
                     {
                         return MPVOID;
                     }
                     else
                     {
                         pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                         bValid = TRUE;
                     }
                  }
                  if (bValid)
                  {
                     uchHourMinutes[0] = usChr1;
                     uchHourMinutes[1] = '0';
                     WinSetWindowText(hwnd, uchHourMinutes);
                     pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(1,1),(PLONG)NULL);
                  }
                  return MPVOID;
                  break;

               case 1:
                  if (bTwelveHourFormat)
                  {
                     if ((uchHourMinutes[0] == '0') || (uchHourMinutes[0] == ' '))
                     {
                        if ((usChr1 > '9') || (usChr1 < '0'))
                        {
                           return MPVOID;
                        }
                        else
                        {
                           pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                           bValid = TRUE;
                        }
                   }
                   else
                   {    /* probably 1  */
                      if ((usChr1 > '2') || (usChr1 < '0'))
                      {
                         return MPVOID;
                      }
                      else
                      {
                         pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                         bValid = TRUE;
                      }
                   }
               }
                else
                {
                   if (uchHourMinutes[0] < '2')
                   {
                      if ((usChr1 > '9') || (usChr1 < '0'))
                      {
                         return MPVOID;
                      }
                      else
                      {
                         pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                         bValid = TRUE;
                      }
                   }
                   else
                   {
                      if ((usChr1 > '4') || (usChr1 < '0'))
                      {
                         return MPVOID;
                      }
                      else
                      {
                         pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                         bValid = TRUE;
                      }
                   }
                }
                /*  Fill the entry field as if a time separator is in also */
                if (bValid)
                {
                   mp2 = (MPARAM)(((ULONG)mp2 & 0xffffff00) | szTimeSep[0]);
                   return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                }
                break;

            case 3:   /* minutes left digit, 0-5 */
               if ((usChr1 > '5') || (usChr1 < '0'))
               {
                  return MPVOID;
               }
               else
                  return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                  break;

            case 4:   /*minutes right digit, 0-9*/
               if ((usChr1 > '9') || (usChr1 < '0'))
               {
                  return MPVOID;
               }
               else
               {
                  pfnwpEntryField(hwnd, usMsg, mp1, mp2);
                  return pfnwpEntryField(hwnd, EM_SETSEL, MPFROM2SHORT(4,4), MPVOID);
               }
               break;
            }
         }
      }
   }

   default:
      return pfnwpEntryField(hwnd, usMsg, mp1, mp2);
   }
}