Changeset 1784 for trunk/src


Ignore:
Timestamp:
Nov 19, 1999, 10:22:01 PM (26 years ago)
Author:
cbratschi
Message:

* empty log message *

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/user32/combo.cpp

    r1781 r1784  
    1 /* $Id: combo.cpp,v 1.15 1999-11-19 17:59:33 cbratschi Exp $ */
     1/* $Id: combo.cpp,v 1.16 1999-11-19 21:22:01 cbratschi Exp $ */
    22/*
    33 * Combo controls
     
    1414 - problems with focus handling (Win32 <-> OS/2)
    1515   will be fixed soon
     16 - several other bugs
    1617*/
    1718
     
    3031 */
    3132
    32 #define CB_GETPTR( hwnd )      ((LPHEADCOMBO)(GetInfoPtr(hwnd)))
    3333#define CB_NOTIFY( lphc, code ) \
    3434        (SendMessageA( (lphc)->owner, WM_COMMAND, \
     
    3838
    3939/*
    40  * Drawing globals
    41  */
    42 static HBITMAP  hComboBmp = 0;
    43 static UINT     CBitHeight, CBitWidth;
    44 
    45 /*
    4640 * Look and feel dependant "constants"
    4741 */
     
    5347
    5448/***********************************************************************
    55  *           COMBO_Init
    56  *
    57  * Load combo button bitmap.
    58  */
    59 static BOOL COMBO_Init()
    60 {
    61   HDC           hDC;
    62 
    63   if( hComboBmp ) return TRUE;
    64   hDC = CreateCompatibleDC(0);
    65   if(hDC)
    66   {
    67     BOOL      bRet = FALSE;
    68 
    69     hComboBmp = LoadBitmapA(hInstanceUser32, MAKEINTRESOURCEA(OBM_COMBO));
    70     if(hComboBmp)
    71     {
    72       BITMAP      bm;
    73       HBITMAP     hPrevB;
    74       RECT        r;
    75 
    76       GetObjectA( hComboBmp, sizeof(bm), &bm );
    77       CBitHeight = bm.bmHeight;
    78       CBitWidth  = bm.bmWidth;
    79 
    80       //TRACE("combo bitmap [%i,%i]\n", CBitWidth, CBitHeight );
    81 
    82       hPrevB = SelectObject( hDC, hComboBmp);
    83       SetRect( &r, 0, 0, CBitWidth, CBitHeight );
    84       InvertRect( hDC, &r );
    85       SelectObject( hDC, hPrevB );
    86       bRet = TRUE;
    87     }
    88     DeleteDC( hDC );
    89     return bRet;
    90   }
    91   return FALSE;
    92 }
    93 
    94 /***********************************************************************
    9549 *           COMBO_NCCreate
    9650 */
     
    9953   LPHEADCOMBO          lphc;
    10054
    101    if ( hwnd && COMBO_Init() &&
     55   if ( hwnd &&
    10256      (lphc = (LPHEADCOMBO)HeapAlloc(GetProcessHeap(), 0, sizeof(HEADCOMBO))) )
    10357   {
     
    14498   if( lphc )
    14599   {
    146        HWND hwnd = lphc->hwndself;
    147 
    148100       //TRACE("[%04x]: freeing storage\n", CB_HWND(lphc));
    149101
     
    942894  HDC   hDC;
    943895
    944   hDC = (wParam) ? (HDC)wParam:BeginPaint( lphc->hwndself, &ps);
     896  hDC = (wParam) ? (HDC)wParam:BeginPaint(hwnd,&ps);
    945897
    946898
     
    953905       * DC.
    954906       */
    955       hBkgBrush = COMBO_PrepareColors(lphc->hwndself, lphc, hDC);
     907      hBkgBrush = COMBO_PrepareColors(hwnd,lphc,hDC);
    956908
    957909      hPrevBrush = SelectObject( hDC, hBkgBrush );
     
    980932  }
    981933
    982   if(!wParam) EndPaint(lphc->hwndself, &ps);
     934  if(!wParam) EndPaint(hwnd,&ps);
    983935
    984936  return 0;
     
    14471399
    14481400/***********************************************************************
    1449  *           COMBO_ItemOp
     1401 *           COMBO_HandleItem
    14501402 *
    14511403 * Fixup an ownerdrawn item operation and pass it up to the combobox owner.
    14521404 */
    1453 static LRESULT COMBO_ItemOp( LPHEADCOMBO lphc, UINT msg,
    1454                                WPARAM wParam, LPARAM lParam )
    1455 {
    1456    HWND hWnd = lphc->hwndself;
     1405static LRESULT COMBO_HandleItem(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
     1406{
     1407   LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
    14571408
    14581409   //TRACE("[%04x]: ownerdraw op %04x\n", CB_HWND(lphc), msg );
     
    14621413   /* two first items are the same in all 4 structs */
    14631414   lpIS->CtlType = ODT_COMBOBOX;
    1464    lpIS->CtlID   = GetWindowLongA(lphc->hwndself,GWL_ID);
     1415   lpIS->CtlID   = GetWindowLongA(hwnd,GWL_ID);
    14651416
    14661417   switch( msg )        /* patch window handle */
    14671418   {
    14681419        case WM_DELETEITEM:
    1469              lpIS->hwndItem = hWnd;
     1420             lpIS->hwndItem = hwnd;
    14701421#undef  lpIS
    14711422             break;
    14721423        case WM_DRAWITEM:
    14731424#define lpIS    ((LPDRAWITEMSTRUCT)lParam)
    1474              lpIS->hwndItem = hWnd;
     1425             lpIS->hwndItem = hwnd;
    14751426#undef  lpIS
    14761427             break;
    14771428        case WM_COMPAREITEM:
    14781429#define lpIS    ((LPCOMPAREITEMSTRUCT)lParam)
    1479              lpIS->hwndItem = hWnd;
     1430             lpIS->hwndItem = hwnd;
    14801431#undef  lpIS
    14811432             break;
    14821433   }
    14831434
    1484    return SendMessageA( lphc->owner, msg, GetWindowLongA(lphc->hwndself,GWL_ID), lParam );
     1435   return SendMessageA( lphc->owner, msg, GetWindowLongA(hwnd,GWL_ID), lParam );
    14851436}
    14861437
     
    15351486}
    15361487
     1488static LRESULT COMBO_HandleText(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
     1489{
     1490  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1491
     1492  if ((message == WM_GETTEXTLENGTH) && !(lphc->wState & CBF_EDIT))
     1493  {
     1494    int j = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0 );
     1495
     1496    if (j == -1) return 0;
     1497    return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, j, 0);
     1498  } else if( lphc->wState & CBF_EDIT )
     1499  {
     1500    lphc->wState |= CBF_NOEDITNOTIFY;
     1501
     1502    return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
     1503  } else return  CB_ERR;
     1504}
    15371505
    15381506/***********************************************************************
     
    15921560  if(lphc->hWndLBox && !(lphc->wState & CBF_NORESIZE))
    15931561  {
    1594     CBCalcPlacement(lphc->hwndself,
     1562    CBCalcPlacement(hwnd,
    15951563                    lphc,
    15961564                    &lphc->textRect,
     
    16291597  if ( CB_GETTYPE(lphc) == CBS_SIMPLE)
    16301598  {
    1631     CBCalcPlacement(lphc->hwndself,
     1599    CBCalcPlacement(hwnd,
    16321600                    lphc,
    16331601                    &lphc->textRect,
     
    16541622
    16551623/***********************************************************************
    1656  *           COMBO_SetItemHeight
    1657  */
    1658 static LRESULT COMBO_SetItemHeight( LPHEADCOMBO lphc, INT index, INT height )
    1659 {
    1660    LRESULT      lRet = CB_ERR;
    1661 
    1662    if( index == -1 ) /* set text field height */
    1663    {
    1664        if( height < 32768 )
    1665        {
    1666            lphc->editHeight = height;
    1667 
    1668          /*
    1669           * Redo the layout of the control.
    1670           */
    1671          if ( CB_GETTYPE(lphc) == CBS_SIMPLE)
    1672          {
    1673            CBCalcPlacement(lphc->hwndself,
    1674                            lphc,
    1675                            &lphc->textRect,
    1676                            &lphc->buttonRect,
    1677                            &lphc->droppedRect);
    1678 
    1679            CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );
    1680          }
    1681          else
    1682          {
    1683            CBForceDummyResize(lphc);
    1684          }
    1685 
    1686            lRet = height;
    1687        }
    1688    }
    1689    else if ( CB_OWNERDRAWN(lphc) )      /* set listbox item height */
    1690         lRet = SendMessageA( lphc->hWndLBox, LB_SETITEMHEIGHT,
    1691                               (WPARAM)index, (LPARAM)height );
    1692    return lRet;
    1693 }
    1694 
    1695 /***********************************************************************
    1696  *           COMBO_SelectString
    1697  */
    1698 static LRESULT COMBO_SelectString( LPHEADCOMBO lphc, INT start, LPCSTR pText )
    1699 {
    1700    INT index = SendMessageA( lphc->hWndLBox, LB_SELECTSTRING,
    1701                                  (WPARAM)start, (LPARAM)pText );
    1702    if( index >= 0 )
    1703    {
    1704      if( lphc->wState & CBF_EDIT )
    1705        CBUpdateEdit( lphc, index );
    1706      else
    1707      {
    1708        InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE);
    1709      }
    1710    }
    1711    return (LRESULT)index;
    1712 }
    1713 
    1714 /***********************************************************************
    17151624 *           COMBO_LButtonDown
    17161625 */
    1717 static void COMBO_LButtonDown( LPHEADCOMBO lphc, LPARAM lParam )
    1718 {
     1626static LRESULT COMBO_LButtonDown(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1627{
     1628   LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
    17191629   POINT     pt;
    17201630   BOOL      bButton;
    1721    HWND      hWnd = lphc->hwndself;
     1631
     1632   if(!(lphc->wState & CBF_FOCUSED)) SetFocus(hwnd);
     1633   if(!(lphc->wState & CBF_FOCUSED)) return 0;
    17221634
    17231635   pt.x = LOWORD(lParam);
     
    17351647           lphc->wState &= ~CBF_BUTTONDOWN;
    17361648           CBRollUp( lphc, TRUE, FALSE );
    1737            if( !IsWindow( hWnd ) ) return;
     1649           if( !IsWindow( hwnd ) ) return 0;
    17381650
    17391651           if( lphc->wState & CBF_CAPTURE )
     
    17491661           lphc->wState |= CBF_CAPTURE;
    17501662           CBDropDown( lphc );
    1751            SetCapture( hWnd );
     1663           SetCapture( hwnd );
    17521664       }
    17531665       if( bButton ) CBRepaintButton( lphc );
    17541666   }
     1667
     1668   return 0;
    17551669}
    17561670
     
    17601674 * Release capture and stop tracking if needed.
    17611675 */
    1762 static void COMBO_LButtonUp( LPHEADCOMBO lphc, LPARAM lParam )
    1763 {
     1676static LRESULT COMBO_LButtonUp(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1677{
     1678   LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1679
    17641680   if( lphc->wState & CBF_CAPTURE )
    17651681   {
     
    17801696       CBRepaintButton( lphc );
    17811697   }
     1698
     1699   return 0;
    17821700}
    17831701
     
    17881706 * pointer goes into the listbox.
    17891707 */
    1790 static void COMBO_MouseMove( LPHEADCOMBO lphc, WPARAM wParam, LPARAM lParam )
    1791 {
     1708static LRESULT COMBO_MouseMove(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1709{
     1710   LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
    17921711   POINT  pt;
    17931712   RECT   lbRect;
     1713
     1714   if(!(lphc->wState & CBF_CAPTURE)) return 0;
    17941715
    17951716   pt.x = LOWORD(lParam);
     
    18101731
    18111732   GetClientRect( lphc->hWndLBox, &lbRect );
    1812    MapWindowPoints( lphc->hwndself, lphc->hWndLBox, &pt, 1 );
     1733   MapWindowPoints(hwnd, lphc->hWndLBox, &pt, 1 );
    18131734   if( PtInRect(&lbRect, pt) )
    18141735   {
     
    18201741       SendMessageA( lphc->hWndLBox, WM_LBUTTONDOWN, wParam, lParam );
    18211742   }
    1822 }
    1823 
     1743
     1744   return 0;
     1745}
     1746
     1747static LRESULT COMBO_Enable(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1748{
     1749  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1750
     1751  if( lphc->wState & CBF_EDIT )
     1752    EnableWindow( lphc->hWndEdit, (BOOL)wParam );
     1753  EnableWindow( lphc->hWndLBox, (BOOL)wParam );
     1754
     1755  /* Force the control to repaint when the enabled state changes. */
     1756  InvalidateRect(CB_HWND(lphc), NULL, TRUE);
     1757
     1758  return 0;
     1759}
     1760
     1761static LRESULT COMBO_SetRedraw(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1762{
     1763  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1764
     1765  if( wParam )
     1766    lphc->wState &= ~CBF_NOREDRAW;
     1767  else
     1768    lphc->wState |= CBF_NOREDRAW;
     1769
     1770  if( lphc->wState & CBF_EDIT )
     1771    SendMessageA( lphc->hWndEdit, WM_SETREDRAW, wParam, lParam );
     1772  SendMessageA( lphc->hWndLBox, WM_SETREDRAW, wParam, lParam );
     1773
     1774  return 0;
     1775}
     1776
     1777static LRESULT COMBO_SysKeyDown(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1778{
     1779  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1780
     1781  if( KEYDATA_ALT & HIWORD(lParam) )
     1782    if( wParam == VK_UP || wParam == VK_DOWN )
     1783      COMBO_FlipListbox( lphc, TRUE );
     1784
     1785  return DefWindowProcA(hwnd,WM_SYSKEYDOWN,wParam,lParam);
     1786}
     1787
     1788static LRESULT COMBO_HandleKey(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
     1789{
     1790  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1791
     1792  if( lphc->wState & CBF_EDIT )
     1793    return  SendMessageA( lphc->hWndEdit, message, wParam, lParam );
     1794  else
     1795    return  SendMessageA( lphc->hWndLBox, message, wParam, lParam );
     1796}
     1797
     1798/* combobox messages */
     1799
     1800static LRESULT COMBO_AddString(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1801{
     1802  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1803
     1804  return SendMessageA(lphc->hWndLBox,LB_ADDSTRING,0,lParam);
     1805}
     1806
     1807static LRESULT COMBO_InsertString(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1808{
     1809  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1810
     1811  return SendMessageA(lphc->hWndLBox,LB_INSERTSTRING,wParam,lParam);
     1812}
     1813
     1814static LRESULT COMBO_DeleteString(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1815{
     1816  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1817
     1818  return SendMessageA(lphc->hWndLBox,LB_DELETESTRING,wParam,0);
     1819}
     1820
     1821/***********************************************************************
     1822 *           COMBO_SelectString
     1823 */
     1824static LRESULT COMBO_SelectString(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1825{
     1826  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1827  INT index = SendMessageA(lphc->hWndLBox,LB_SELECTSTRING,wParam,lParam);
     1828
     1829  if( index >= 0 )
     1830  {
     1831    if( lphc->wState & CBF_EDIT )
     1832      CBUpdateEdit( lphc, index );
     1833    else
     1834      InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE);
     1835  }
     1836
     1837  return (LRESULT)index;
     1838}
     1839
     1840static LRESULT COMBO_FindString(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1841{
     1842  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1843
     1844  return SendMessageA(lphc->hWndLBox,LB_FINDSTRING,wParam,lParam);
     1845}
     1846
     1847static LRESULT COMBO_FindStringExact(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1848{
     1849  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1850
     1851  return SendMessageA(lphc->hWndLBox,LB_FINDSTRINGEXACT,wParam,lParam);
     1852}
     1853
     1854/***********************************************************************
     1855 *           COMBO_SetItemHeight
     1856 */
     1857static LRESULT COMBO_SetItemHeight(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1858{
     1859   LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1860   LRESULT      lRet = CB_ERR;
     1861
     1862   if( wParam == -1 ) /* set text field height */
     1863   {
     1864       if( lParam < 32768 )
     1865       {
     1866           lphc->editHeight = lParam;
     1867
     1868         /*
     1869          * Redo the layout of the control.
     1870          */
     1871         if ( CB_GETTYPE(lphc) == CBS_SIMPLE)
     1872         {
     1873           CBCalcPlacement(hwnd,
     1874                           lphc,
     1875                           &lphc->textRect,
     1876                           &lphc->buttonRect,
     1877                           &lphc->droppedRect);
     1878
     1879           CBResetPos( lphc, &lphc->textRect, &lphc->droppedRect, TRUE );
     1880         }
     1881         else
     1882         {
     1883           CBForceDummyResize(lphc);
     1884         }
     1885
     1886           lRet = lParam;
     1887       }
     1888   }
     1889   else if ( CB_OWNERDRAWN(lphc) )      /* set listbox item height */
     1890        lRet = SendMessageA( lphc->hWndLBox, LB_SETITEMHEIGHT,
     1891                              wParam,lParam);
     1892   return lRet;
     1893}
     1894
     1895static LRESULT COMBO_GetItemHeight(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1896{
     1897  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1898
     1899  if( (INT)wParam >= 0 )  /* listbox item */
     1900    return SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
     1901
     1902  return CBGetTextAreaHeight(hwnd, lphc);
     1903}
     1904
     1905static LRESULT COMBO_ResetContent(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1906{
     1907  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1908
     1909  SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 );
     1910  InvalidateRect(CB_HWND(lphc), NULL, TRUE);
     1911
     1912  return  TRUE;
     1913}
     1914
     1915static LRESULT COMBO_InitStorage(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1916{
     1917  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1918
     1919  return SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
     1920}
     1921
     1922static LRESULT COMBO_GetHorizontalExtent(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1923{
     1924  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1925
     1926  return SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
     1927}
     1928
     1929static LRESULT COMBO_SetHorizontalExtent(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1930{
     1931  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1932
     1933  return SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
     1934}
     1935
     1936static LRESULT COMBO_GetTopIndex(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1937{
     1938  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1939
     1940  return SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
     1941}
     1942
     1943static LRESULT COMBO_GetLocale(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1944{
     1945  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1946
     1947  return SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
     1948}
     1949
     1950static LRESULT COMBO_SetLocale(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1951{
     1952  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1953
     1954  return SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
     1955}
     1956
     1957static LRESULT COMBO_GetDroppedWidth(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1958{
     1959  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1960
     1961  if( lphc->droppedWidth )
     1962    return  lphc->droppedWidth;
     1963
     1964  return lphc->droppedRect.right - lphc->droppedRect.left;
     1965}
     1966
     1967static LRESULT COMBO_SetDroppedWidth(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1968{
     1969  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1970
     1971  if( (CB_GETTYPE(lphc) != CBS_SIMPLE) &&
     1972      (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam;
     1973
     1974  return CB_ERR;
     1975}
     1976
     1977static LRESULT COMBO_GetDroppedControlRect(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1978{
     1979  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1980
     1981  if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
     1982
     1983  return CB_OKAY;
     1984}
     1985
     1986static LRESULT COMBO_GetDroppedState(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1987{
     1988  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1989
     1990  return (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
     1991}
     1992
     1993static LRESULT COMBO_Dir(HWND hwnd,WPARAM wParam,LPARAM lParam)
     1994{
     1995  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     1996
     1997  return COMBO_Directory( lphc, (UINT)wParam,
     1998                          (LPSTR)lParam,TRUE);
     1999}
     2000
     2001static LRESULT COMBO_ShowDropDown(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2002{
     2003  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2004
     2005  if( CB_GETTYPE(lphc) != CBS_SIMPLE )
     2006  {
     2007    if( wParam )
     2008    {
     2009      if( !(lphc->wState & CBF_DROPPED) )
     2010        CBDropDown( lphc );
     2011    }
     2012    else
     2013      if( lphc->wState & CBF_DROPPED )
     2014        CBRollUp( lphc, FALSE, TRUE );
     2015  }
     2016
     2017  return TRUE;
     2018}
     2019
     2020static LRESULT COMBO_GetCount(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2021{
     2022  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2023
     2024  return SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
     2025}
     2026
     2027static LRESULT COMBO_GetCurSel(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2028{
     2029  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2030
     2031  return SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
     2032}
     2033
     2034static LRESULT COMBO_SetCurSel(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2035{
     2036  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2037
     2038  lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0);
     2039  if( lphc->wState & CBF_SELCHANGE )
     2040  {
     2041    /* no LBN_SELCHANGE in this case, update manually */
     2042    InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE);
     2043    lphc->wState &= ~CBF_SELCHANGE;
     2044  }
     2045
     2046  return lParam;
     2047}
     2048
     2049static LRESULT COMBO_GetLBText(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2050{
     2051  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2052
     2053  return SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
     2054}
     2055
     2056static LRESULT COMBO_GetLBTextLen(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2057{
     2058  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2059
     2060  return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
     2061}
     2062
     2063static LRESULT COMBO_GetItemData(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2064{
     2065  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2066
     2067  return SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
     2068}
     2069
     2070static LRESULT COMBO_SetItemData(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2071{
     2072  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2073
     2074  return SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
     2075}
     2076
     2077static LRESULT COMBO_GetEditSel(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2078{
     2079  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2080
     2081  if( lphc->wState & CBF_EDIT )
     2082  {
     2083    INT a, b;
     2084
     2085    return  SendMessageA( lphc->hWndEdit, EM_GETSEL,
     2086                          (wParam) ? wParam : (WPARAM)&a,
     2087                          (lParam) ? lParam : (LPARAM)&b );
     2088  }
     2089
     2090  return CB_ERR;
     2091}
     2092
     2093static LRESULT COMBO_SetEditSel(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2094{
     2095  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2096
     2097  if( lphc->wState & CBF_EDIT )
     2098    return  SendMessageA( lphc->hWndEdit, EM_SETSEL,
     2099                          (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) );
     2100
     2101  return CB_ERR;
     2102}
     2103
     2104static LRESULT COMBO_SetExtendedUI(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2105{
     2106  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2107
     2108  if( CB_GETTYPE(lphc) == CBS_SIMPLE )
     2109    return  CB_ERR;
     2110  if( wParam )
     2111    lphc->wState |= CBF_EUI;
     2112  else lphc->wState &= ~CBF_EUI;
     2113    return CB_OKAY;
     2114}
     2115
     2116static LRESULT COMBO_GetExtendedUI(HWND hwnd,WPARAM wParam,LPARAM lParam)
     2117{
     2118  LPHEADCOMBO lphc = (LPHEADCOMBO)GetInfoPtr(hwnd);
     2119
     2120  return (lphc->wState & CBF_EUI) ? TRUE : FALSE;
     2121}
    18242122
    18252123/***********************************************************************
     
    18312129                             WPARAM wParam, LPARAM lParam )
    18322130{
    1833       LPHEADCOMBO   lphc = NULL;
    1834       LONG          ptr = GetInfoPtr(hwnd);
    1835 
    1836       if(ptr)
    1837         lphc = (LPHEADCOMBO)ptr;
    1838 
    18392131      //TRACE("[%04x]: msg %s wp %08x lp %08lx\n",
    18402132      //             pWnd->hwndSelf, SPY_GetMsgName(message), wParam, lParam );
    18412133
    1842       if( lphc || message == WM_NCCREATE )
    18432134      switch(message)
    18442135      {
     
    18902181        case WM_GETTEXT:
    18912182          return COMBO_GetText(hwnd,wParam,lParam);
    1892 //CB:
     2183
    18932184        case WM_SETTEXT:
    18942185        case WM_GETTEXTLENGTH:
     
    18972188        case WM_PASTE:
    18982189        case WM_COPY:
    1899                 if ((message == WM_GETTEXTLENGTH) && !(lphc->wState & CBF_EDIT))
    1900                 {
    1901                 int j = SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0 );
    1902                 if (j == -1) return 0;
    1903                 return SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, j, 0);
    1904                 }
    1905                 else if( lphc->wState & CBF_EDIT )
    1906                 {
    1907                     lphc->wState |= CBF_NOEDITNOTIFY;
    1908 
    1909                     return SendMessageA( lphc->hWndEdit, message, wParam, lParam );
    1910                 }
    1911                 else return  CB_ERR;
     2190          return COMBO_HandleText(hwnd,message,wParam,lParam);
     2191
    19122192        case WM_DRAWITEM:
    19132193        case WM_DELETEITEM:
    19142194        case WM_COMPAREITEM:
    19152195        case WM_MEASUREITEM:
    1916                 return  COMBO_ItemOp( lphc, message, wParam, lParam );
     2196          return COMBO_HandleItem(hwnd,message,wParam,lParam);
     2197
    19172198        case WM_ENABLE:
    1918                 if( lphc->wState & CBF_EDIT )
    1919                     EnableWindow( lphc->hWndEdit, (BOOL)wParam );
    1920                 EnableWindow( lphc->hWndLBox, (BOOL)wParam );
    1921 
    1922                 /* Force the control to repaint when the enabled state changes. */
    1923                 InvalidateRect(CB_HWND(lphc), NULL, TRUE);
    1924                 return  TRUE;
     2199          return COMBO_Enable(hwnd,wParam,lParam);
     2200
    19252201        case WM_SETREDRAW:
    1926                 if( wParam )
    1927                     lphc->wState &= ~CBF_NOREDRAW;
    1928                 else
    1929                     lphc->wState |= CBF_NOREDRAW;
    1930 
    1931                 if( lphc->wState & CBF_EDIT )
    1932                     SendMessageA( lphc->hWndEdit, message, wParam, lParam );
    1933                 SendMessageA( lphc->hWndLBox, message, wParam, lParam );
    1934                 return  0;
     2202          return COMBO_SetRedraw(hwnd,wParam,lParam);
     2203
    19352204        case WM_SYSKEYDOWN:
    1936                 if( KEYDATA_ALT & HIWORD(lParam) )
    1937                     if( wParam == VK_UP || wParam == VK_DOWN )
    1938                         COMBO_FlipListbox( lphc, TRUE );
    1939                 break;/* -> DefWindowProc */
     2205          return COMBO_SysKeyDown(hwnd,wParam,lParam);
    19402206
    19412207        case WM_CHAR:
    19422208        case WM_KEYDOWN:
    1943                 if( lphc->wState & CBF_EDIT )
    1944                     return  SendMessageA( lphc->hWndEdit, message, wParam, lParam );
    1945                 else
    1946                     return  SendMessageA( lphc->hWndLBox, message, wParam, lParam );
     2209          return COMBO_HandleKey(hwnd,message,wParam,lParam);
     2210
    19472211        case WM_LBUTTONDOWN:
    1948                 if( !(lphc->wState & CBF_FOCUSED) ) SetFocus( lphc->hwndself );
    1949                 if( lphc->wState & CBF_FOCUSED ) COMBO_LButtonDown( lphc, lParam );
    1950                 return  TRUE;
     2212          return COMBO_LButtonDown(hwnd,wParam,lParam);
     2213
    19512214        case WM_LBUTTONUP:
    1952                 COMBO_LButtonUp( lphc, lParam );
    1953                 return  TRUE;
     2215          return COMBO_LButtonUp(hwnd,wParam,lParam);
     2216
    19542217        case WM_MOUSEMOVE:
    1955                 if( lphc->wState & CBF_CAPTURE )
    1956                     COMBO_MouseMove( lphc, wParam, lParam );
    1957                 return  0;
     2218          return COMBO_MouseMove(hwnd,wParam,lParam);
     2219
    19582220        /* Combo messages */
    19592221
    19602222        case CB_ADDSTRING:
    1961                 return  SendMessageA( lphc->hWndLBox, LB_ADDSTRING, 0, lParam);
     2223          return COMBO_AddString(hwnd,wParam,lParam);
     2224
    19622225        case CB_INSERTSTRING:
    1963                 return  SendMessageA( lphc->hWndLBox, LB_INSERTSTRING, wParam, lParam);
     2226          return COMBO_InsertString(hwnd,wParam,lParam);
     2227
    19642228        case CB_DELETESTRING:
    1965                 return  SendMessageA( lphc->hWndLBox, LB_DELETESTRING, wParam, 0);
     2229          return COMBO_DeleteString(hwnd,wParam,lParam);
     2230
    19662231        case CB_SELECTSTRING:
    1967                 return  COMBO_SelectString( lphc, (INT)wParam, (LPSTR)lParam );
     2232          return COMBO_SelectString(hwnd,wParam,lParam);
     2233
    19682234        case CB_FINDSTRING:
    1969                 return  SendMessageA( lphc->hWndLBox, LB_FINDSTRING, wParam, lParam);
     2235          return COMBO_FindString(hwnd,wParam,lParam);
     2236
    19702237        case CB_FINDSTRINGEXACT:
    1971                 return  SendMessageA( lphc->hWndLBox, LB_FINDSTRINGEXACT,
    1972                                                        wParam, lParam );
     2238          return COMBO_FindStringExact(hwnd,wParam,lParam);
     2239
    19732240        case CB_SETITEMHEIGHT:
    1974                 return  COMBO_SetItemHeight( lphc, (INT)wParam, (INT)lParam);
     2241          return COMBO_SetItemHeight(hwnd,wParam,lParam);
     2242
    19752243        case CB_GETITEMHEIGHT:
    1976                 if( (INT)wParam >= 0 )  /* listbox item */
    1977                     return  SendMessageA( lphc->hWndLBox, LB_GETITEMHEIGHT, wParam, 0);
    1978                 return  CBGetTextAreaHeight(hwnd, lphc);
     2244          return COMBO_GetItemHeight(hwnd,wParam,lParam);
     2245
    19792246        case CB_RESETCONTENT:
    1980                 SendMessageA( lphc->hWndLBox, LB_RESETCONTENT, 0, 0 );
    1981                 InvalidateRect(CB_HWND(lphc), NULL, TRUE);
    1982                 return  TRUE;
     2247          return COMBO_ResetContent(hwnd,wParam,lParam);
     2248
    19832249        case CB_INITSTORAGE:
    1984                 return  SendMessageA( lphc->hWndLBox, LB_INITSTORAGE, wParam, lParam);
     2250          return COMBO_InitStorage(hwnd,wParam,lParam);
     2251
    19852252        case CB_GETHORIZONTALEXTENT:
    1986                 return  SendMessageA( lphc->hWndLBox, LB_GETHORIZONTALEXTENT, 0, 0);
     2253          return COMBO_GetHorizontalExtent(hwnd,wParam,lParam);
     2254
    19872255        case CB_SETHORIZONTALEXTENT:
    1988                 return  SendMessageA( lphc->hWndLBox, LB_SETHORIZONTALEXTENT, wParam, 0);
     2256          return COMBO_SetHorizontalExtent(hwnd,wParam,lParam);
     2257
    19892258        case CB_GETTOPINDEX:
    1990                 return  SendMessageA( lphc->hWndLBox, LB_GETTOPINDEX, 0, 0);
     2259          return COMBO_GetTopIndex(hwnd,wParam,lParam);
     2260
    19912261        case CB_GETLOCALE:
    1992                 return  SendMessageA( lphc->hWndLBox, LB_GETLOCALE, 0, 0);
     2262          return COMBO_GetLocale(hwnd,wParam,lParam);
     2263
    19932264        case CB_SETLOCALE:
    1994                 return  SendMessageA( lphc->hWndLBox, LB_SETLOCALE, wParam, 0);
     2265          return COMBO_SetLocale(hwnd,wParam,lParam);
     2266
    19952267        case CB_GETDROPPEDWIDTH:
    1996                 if( lphc->droppedWidth )
    1997                     return  lphc->droppedWidth;
    1998                 return  lphc->droppedRect.right - lphc->droppedRect.left;
     2268          return COMBO_GetDroppedWidth(hwnd,wParam,lParam);
     2269
    19992270        case CB_SETDROPPEDWIDTH:
    2000                 if( (CB_GETTYPE(lphc) != CBS_SIMPLE) &&
    2001                     (INT)wParam < 32768 ) lphc->droppedWidth = (INT)wParam;
    2002                 return  CB_ERR;
     2271          return COMBO_SetDroppedWidth(hwnd,wParam,lParam);
     2272
    20032273        case CB_GETDROPPEDCONTROLRECT:
    2004                 if( lParam ) CBGetDroppedControlRect(lphc, (LPRECT)lParam );
    2005                 return  CB_OKAY;
     2274          return COMBO_GetDroppedControlRect(hwnd,wParam,lParam);
     2275
    20062276        case CB_GETDROPPEDSTATE:
    2007                 return  (lphc->wState & CBF_DROPPED) ? TRUE : FALSE;
     2277          return COMBO_GetDroppedState(hwnd,wParam,lParam);
     2278
    20082279        case CB_DIR:
    2009                 return  COMBO_Directory( lphc, (UINT)wParam,
    2010                                        (LPSTR)lParam, (message == CB_DIR));
     2280          return COMBO_Dir(hwnd,wParam,lParam);
     2281
    20112282        case CB_SHOWDROPDOWN:
    2012                 if( CB_GETTYPE(lphc) != CBS_SIMPLE )
    2013                 {
    2014                     if( wParam )
    2015                     {
    2016                         if( !(lphc->wState & CBF_DROPPED) )
    2017                             CBDropDown( lphc );
    2018                     }
    2019                     else
    2020                         if( lphc->wState & CBF_DROPPED )
    2021                             CBRollUp( lphc, FALSE, TRUE );
    2022                 }
    2023                 return  TRUE;
     2283          return COMBO_ShowDropDown(hwnd,wParam,lParam);
     2284
    20242285        case CB_GETCOUNT:
    2025                 return  SendMessageA( lphc->hWndLBox, LB_GETCOUNT, 0, 0);
     2286          return COMBO_GetCount(hwnd,wParam,lParam);
     2287
    20262288        case CB_GETCURSEL:
    2027                 return  SendMessageA( lphc->hWndLBox, LB_GETCURSEL, 0, 0);
     2289          return COMBO_GetCurSel(hwnd,wParam,lParam);
     2290
    20282291        case CB_SETCURSEL:
    2029                 lParam = SendMessageA( lphc->hWndLBox, LB_SETCURSEL, wParam, 0);
    2030                 if( lphc->wState & CBF_SELCHANGE )
    2031                 {
    2032                     /* no LBN_SELCHANGE in this case, update manually */
    2033                     InvalidateRect(CB_HWND(lphc), &lphc->textRect, TRUE);
    2034                     lphc->wState &= ~CBF_SELCHANGE;
    2035                 }
    2036                 return  lParam;
     2292          return COMBO_SetCurSel(hwnd,wParam,lParam);
     2293
    20372294        case CB_GETLBTEXT:
    2038                 return  SendMessageA( lphc->hWndLBox, LB_GETTEXT, wParam, lParam);
     2295          return COMBO_GetLBText(hwnd,wParam,lParam);
     2296
    20392297        case CB_GETLBTEXTLEN:
    2040                 return  SendMessageA( lphc->hWndLBox, LB_GETTEXTLEN, wParam, 0);
     2298          return COMBO_GetLBTextLen(hwnd,wParam,lParam);
     2299
    20412300        case CB_GETITEMDATA:
    2042                 return  SendMessageA( lphc->hWndLBox, LB_GETITEMDATA, wParam, 0);
     2301          return COMBO_GetItemData(hwnd,wParam,lParam);
     2302
    20432303        case CB_SETITEMDATA:
    2044                 return  SendMessageA( lphc->hWndLBox, LB_SETITEMDATA, wParam, lParam);
     2304          return COMBO_SetItemData(hwnd,wParam,lParam);
     2305
    20452306        case CB_GETEDITSEL:
    2046                 if( lphc->wState & CBF_EDIT )
    2047                 {
    2048                     INT a, b;
    2049 
    2050                     return  SendMessageA( lphc->hWndEdit, EM_GETSEL,
    2051                                            (wParam) ? wParam : (WPARAM)&a,
    2052                                            (lParam) ? lParam : (LPARAM)&b );
    2053                 }
    2054                 return  CB_ERR;
     2307          return COMBO_GetEditSel(hwnd,wParam,lParam);
     2308
    20552309        case CB_SETEDITSEL:
    2056                 if( lphc->wState & CBF_EDIT )
    2057                     return  SendMessageA( lphc->hWndEdit, EM_SETSEL,
    2058                           (INT)(INT16)LOWORD(lParam), (INT)(INT16)HIWORD(lParam) );
    2059                 return  CB_ERR;
     2310          return COMBO_SetEditSel(hwnd,wParam,lParam);
     2311
    20602312        case CB_SETEXTENDEDUI:
    2061                 if( CB_GETTYPE(lphc) == CBS_SIMPLE )
    2062                     return  CB_ERR;
    2063                 if( wParam )
    2064                     lphc->wState |= CBF_EUI;
    2065                 else lphc->wState &= ~CBF_EUI;
    2066                 return  CB_OKAY;
     2313          return COMBO_SetExtendedUI(hwnd,wParam,lParam);
     2314
    20672315        case CB_GETEXTENDEDUI:
    2068                 return  (lphc->wState & CBF_EUI) ? TRUE : FALSE;
     2316          return COMBO_GetExtendedUI(hwnd,wParam,lParam);
     2317
    20692318        //case (WM_USER + 0x1B):
    20702319        //        WARN("[%04x]: undocumented msg!\n", hwnd );
Note: See TracChangeset for help on using the changeset viewer.