Ignore:
Timestamp:
Jul 4, 1999, 11:06:00 PM (26 years ago)
Author:
cbratschi
Message:

Unicode and other extensions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/comctl32/tab.c

    r252 r267  
    1 /* $Id: tab.c,v 1.7 1999-06-30 15:52:17 cbratschi Exp $ */
     1/* $Id: tab.c,v 1.8 1999-07-04 21:05:59 cbratschi Exp $ */
    22/*
    33 * Tab control
     
    1212 *  Image list support
    1313 *  Multiline support
    14  *  Unicode support
    1514 */
    1615
     
    2019#include "commctrl.h"
    2120#include "tab.h"
     21#include "comctl32.h"
    2222
    2323
     
    709709       * Calculate how wide the tab is depending on the text it contains
    710710       */
    711       GetTextExtentPoint32A(hdc, infoPtr->items[curItem].pszText,
    712                             lstrlenA(infoPtr->items[curItem].pszText), &size);
     711      GetTextExtentPoint32W(hdc, infoPtr->items[curItem].pszText,
     712                            lstrlenW(infoPtr->items[curItem].pszText), &size);
    713713
    714714      infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left +
     
    934934     * Draw the text;
    935935     */
    936     DrawTextA(hdc,
     936    DrawTextW(hdc,
    937937              infoPtr->items[iItem].pszText,
    938               lstrlenA(infoPtr->items[iItem].pszText),
     938              lstrlenW(infoPtr->items[iItem].pszText),
    939939              &r,
    940940              DT_LEFT|DT_SINGLELINE|DT_VCENTER);
     
    12381238}
    12391239
    1240 static LRESULT
    1241 TAB_InsertItem (HWND hwnd, WPARAM wParam, LPARAM lParam)
     1240static LRESULT TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
    12421241{
    12431242  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     
    12861285  if (pti->mask & TCIF_TEXT) {
    12871286    len = lstrlenA (pti->pszText);
    1288     infoPtr->items[iItem].pszText = COMCTL32_Alloc (len+1);
    1289     lstrcpyA (infoPtr->items[iItem].pszText, pti->pszText);
     1287    infoPtr->items[iItem].pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
     1288    lstrcpyAtoW (infoPtr->items[iItem].pszText, pti->pszText);
     1289    infoPtr->items[iItem].cchTextMax = pti->cchTextMax;
     1290  }
     1291
     1292  if (pti->mask & TCIF_IMAGE)
     1293    infoPtr->items[iItem].iImage = pti->iImage;
     1294
     1295  if (pti->mask & TCIF_PARAM)
     1296    infoPtr->items[iItem].lParam = pti->lParam;
     1297
     1298  TAB_InvalidateTabArea(hwnd, infoPtr);
     1299
     1300//  TRACE(tab, "[%04x]: added item %d '%s'\n",
     1301//      hwnd, iItem, infoPtr->items[iItem].pszText);
     1302
     1303  TAB_SetItemBounds(hwnd);
     1304  return iItem;
     1305}
     1306
     1307static LRESULT TAB_InsertItemW(HWND hwnd, WPARAM wParam, LPARAM lParam)
     1308{
     1309  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     1310  TCITEMW *pti;
     1311  INT iItem, len;
     1312  RECT rect;
     1313
     1314  GetClientRect (hwnd, &rect);
     1315//  TRACE(tab, "Rect: %x T %i, L %i, B %i, R %i\n", hwnd,
     1316//        rect.top, rect.left, rect.bottom, rect.right);
     1317
     1318  pti = (TCITEMW*)lParam;
     1319  iItem = (INT)wParam;
     1320
     1321  if (iItem < 0) return -1;
     1322  if (iItem > infoPtr->uNumItem)
     1323    iItem = infoPtr->uNumItem;
     1324
     1325  if (infoPtr->uNumItem == 0) {
     1326    infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM));
     1327    infoPtr->uNumItem++;
     1328  }
     1329  else {
     1330    TAB_ITEM *oldItems = infoPtr->items;
     1331
     1332    infoPtr->uNumItem++;
     1333    infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM) * infoPtr->uNumItem);
     1334
     1335    /* pre insert copy */
     1336    if (iItem > 0) {
     1337      memcpy (&infoPtr->items[0], &oldItems[0],
     1338              iItem * sizeof(TAB_ITEM));
     1339    }
     1340
     1341    /* post insert copy */
     1342    if (iItem < infoPtr->uNumItem - 1) {
     1343      memcpy (&infoPtr->items[iItem+1], &oldItems[iItem],
     1344              (infoPtr->uNumItem - iItem - 1) * sizeof(TAB_ITEM));
     1345
     1346    }
     1347
     1348    COMCTL32_Free (oldItems);
     1349  }
     1350
     1351  infoPtr->items[iItem].mask = pti->mask;
     1352  if (pti->mask & TCIF_TEXT) {
     1353    len = lstrlenW (pti->pszText);
     1354    infoPtr->items[iItem].pszText = COMCTL32_Alloc ((len+1)*sizeof(WCHAR));
     1355    lstrcpyW (infoPtr->items[iItem].pszText, pti->pszText);
    12901356    infoPtr->items[iItem].cchTextMax = pti->cchTextMax;
    12911357  }
     
    13531419   len = lstrlenA (tabItem->pszText);
    13541420   if (len>wineItem->cchTextMax)
    1355      wineItem->pszText = COMCTL32_ReAlloc (wineItem->pszText, len+1);
    1356    lstrcpynA (wineItem->pszText, tabItem->pszText, len+1);
     1421     wineItem->pszText = COMCTL32_ReAlloc (wineItem->pszText, (len+1)*sizeof(WCHAR));
     1422   lstrcpynAtoW (wineItem->pszText, tabItem->pszText, len+1);
     1423  }
     1424
     1425  return TRUE;
     1426}
     1427
     1428static LRESULT TAB_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
     1429{
     1430  TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     1431  TCITEMW *tabItem;
     1432  TAB_ITEM *wineItem;
     1433  INT    iItem,len;
     1434
     1435  iItem=(INT) wParam;
     1436  tabItem=(LPTCITEMW) lParam;
     1437//  TRACE (tab,"%d %p\n",iItem, tabItem);
     1438  if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE;
     1439
     1440  wineItem=& infoPtr->items[iItem];
     1441
     1442  if (tabItem->mask & TCIF_IMAGE)
     1443    wineItem->iImage=tabItem->iImage;
     1444
     1445  if (tabItem->mask & TCIF_PARAM)
     1446    wineItem->lParam=tabItem->lParam;
     1447
     1448//  if (tabItem->mask & TCIF_RTLREADING)
     1449//    FIXME (tab,"TCIF_RTLREADING\n");
     1450
     1451  if (tabItem->mask & TCIF_STATE)
     1452    wineItem->dwState=tabItem->dwState;
     1453
     1454  if (tabItem->mask & TCIF_TEXT) {
     1455   len = lstrlenW (tabItem->pszText);
     1456   if (len>wineItem->cchTextMax)
     1457     wineItem->pszText = COMCTL32_ReAlloc (wineItem->pszText, (len+1)*sizeof(WCHAR));
     1458   lstrcpynW (wineItem->pszText, tabItem->pszText, len+1);
    13571459  }
    13581460
     
    13971499
    13981500  if (tabItem->mask & TCIF_TEXT)
    1399    lstrcpynA (tabItem->pszText, wineItem->pszText, tabItem->cchTextMax);
     1501   lstrcpynWtoA (tabItem->pszText, wineItem->pszText, tabItem->cchTextMax);
     1502
     1503  return TRUE;
     1504}
     1505
     1506static LRESULT TAB_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
     1507{
     1508   TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd);
     1509   TCITEMW *tabItem;
     1510   TAB_ITEM *wineItem;
     1511   INT    iItem;
     1512
     1513  iItem=(INT) wParam;
     1514  tabItem=(LPTCITEMW) lParam;
     1515//  TRACE (tab,"\n");
     1516  if ((iItem<0) || (iItem>infoPtr->uNumItem)) return FALSE;
     1517
     1518  wineItem=& infoPtr->items[iItem];
     1519
     1520  if (tabItem->mask & TCIF_IMAGE)
     1521    tabItem->iImage=wineItem->iImage;
     1522
     1523  if (tabItem->mask & TCIF_PARAM)
     1524    tabItem->lParam=wineItem->lParam;
     1525
     1526//  if (tabItem->mask & TCIF_RTLREADING)
     1527//    FIXME (tab, "TCIF_RTLREADING\n");
     1528
     1529  if (tabItem->mask & TCIF_STATE)
     1530    tabItem->dwState=wineItem->dwState;
     1531
     1532  if (tabItem->mask & TCIF_TEXT)
     1533   lstrcpynW (tabItem->pszText, wineItem->pszText, tabItem->cchTextMax);
    14001534
    14011535  return TRUE;
     
    16681802
    16691803    case TCM_GETITEMW:
    1670 //      FIXME (tab, "Unimplemented msg TCM_GETITEMW\n");
    1671       return 0;
     1804      return TAB_GetItemW(hwnd,wParam,lParam);
    16721805
    16731806    case TCM_SETITEMA:
     
    16751808
    16761809    case TCM_SETITEMW:
    1677 //      FIXME (tab, "Unimplemented msg TCM_SETITEMW\n");
    1678       return 0;
     1810      return TAB_SetItemW(hwnd,wParam,lParam);
    16791811
    16801812    case TCM_DELETEITEM:
     
    16971829
    16981830    case TCM_INSERTITEMA:
    1699       return TAB_InsertItem (hwnd, wParam, lParam);
     1831      return TAB_InsertItemA(hwnd,wParam,lParam);
    17001832
    17011833    case TCM_INSERTITEMW:
    1702 //      FIXME (tab, "Unimplemented msg TCM_INSERTITEM32W\n");
    1703       return 0;
     1834      return TAB_InsertItemW(hwnd,wParam,lParam);
    17041835
    17051836    case TCM_SETITEMEXTRA:
Note: See TracChangeset for help on using the changeset viewer.