- Add routines to dump out tab items internally and externally

- Adjust TAB_SetItemBounds to split vertical tabs more like the native.
- Document major difference in laying out the vertical tabs.
- Fix drawing of icons. Wrong item padding used in vertical case.
- Fixed size of horizontal padding.
This commit is contained in:
Guy L. Albertelli 2002-06-20 22:45:29 +00:00 committed by Alexandre Julliard
parent 30f9da4b58
commit 533905e2ab
1 changed files with 135 additions and 21 deletions

View File

@ -80,7 +80,7 @@ typedef struct
* Positioning constants
*/
#define SELECTED_TAB_OFFSET 2
#define HORIZONTAL_ITEM_PADDING 5
#define HORIZONTAL_ITEM_PADDING 6
#define VERTICAL_ITEM_PADDING 3
#define ROUND_CORNER_SIZE 2
#define DISPLAY_AREA_PADDINGX 2
@ -139,6 +139,44 @@ TAB_RelayEvent (HWND hwndTip, HWND hwndMsg, UINT uMsg,
SendMessageA (hwndTip, TTM_RELAYEVENT, 0, (LPARAM)&msg);
}
static void
TAB_DumpItemExternalA(TCITEMA *pti, UINT iItem)
{
if (TRACE_ON(tab)) {
TRACE("external tab %d, mask=0x%08x, dwState=0x%08x, dwStateMask=0x%08x, cchTextMax=0x%08x\n",
iItem, pti->mask, pti->dwState, pti->dwStateMask, pti->cchTextMax);
TRACE("external tab %d, iImage=%d, lParam=0x%08lx, pszTextA=%s\n",
iItem, pti->iImage, pti->lParam, debugstr_a(pti->pszText));
}
}
static void
TAB_DumpItemExternalW(TCITEMW *pti, UINT iItem)
{
if (TRACE_ON(tab)) {
TRACE("external tab %d, mask=0x%08x, dwState=0x%08lx, dwStateMask=0x%08lx, cchTextMax=0x%08x\n",
iItem, pti->mask, pti->dwState, pti->dwStateMask, pti->cchTextMax);
TRACE("external tab %d, iImage=%d, lParam=0x%08lx, pszTextW=%s\n",
iItem, pti->iImage, pti->lParam, debugstr_w(pti->pszText));
}
}
static void
TAB_DumpItemInternal(TAB_INFO *infoPtr, UINT iItem)
{
if (TRACE_ON(tab)) {
TAB_ITEM *ti;
ti = &infoPtr->items[iItem];
TRACE("tab %d, mask=0x%08x, dwState=0x%08lx, pszText=%s, iImage=%d\n",
iItem, ti->mask, ti->dwState, debugstr_w(ti->pszText),
ti->iImage);
TRACE("tab %d, lParam=0x%08lx, rect.left=%d, rect.top(row)=%d\n",
iItem, ti->lParam, ti->rect.left, ti->rect.top);
}
}
static LRESULT
TAB_GetCurSel (HWND hwnd)
{
@ -1077,6 +1115,8 @@ static void TAB_SetItemBounds (HWND hwnd)
infoPtr->tabHeight, fontMetrics.tmHeight, icon_height);
}
TRACE("client right=%d\n", clientRect.right);
for (curItem = 0; curItem < infoPtr->uNumItem; curItem++)
{
/* Set the leftmost position of the tab. */
@ -1112,6 +1152,11 @@ static void TAB_SetItemBounds (HWND hwnd)
infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left +
size.cx + icon_width +
num * HORIZONTAL_ITEM_PADDING;
TRACE("for <%s>, l,r=%d,%d, num=%d\n",
debugstr_w(infoPtr->items[curItem].pszText),
infoPtr->items[curItem].rect.left,
infoPtr->items[curItem].rect.right,
num);
}
/*
@ -1131,6 +1176,10 @@ static void TAB_SetItemBounds (HWND hwnd)
infoPtr->items[curItem].rect.left = 0;
curItemRowCount++;
TRACE("wrapping <%s>, l,r=%d,%d\n",
debugstr_w(infoPtr->items[curItem].pszText),
infoPtr->items[curItem].rect.left,
infoPtr->items[curItem].rect.right);
}
infoPtr->items[curItem].rect.bottom = 0;
@ -1194,16 +1243,6 @@ static void TAB_SetItemBounds (HWND hwnd)
iItm<infoPtr->uNumItem;
iItm++,iCount++)
{
/* if we have reached the maximum number of tabs on this row */
/* move to the next row, reset our current item left position and */
/* the count of items on this row */
if (iCount >= ((iRow<remTab)?tabPerRow + 1:tabPerRow))
{
iRow++;
curItemLeftPos = 0;
iCount = 0;
}
/* normalize the current rect */
/* shift the item to the left side of the clientRect */
@ -1211,6 +1250,42 @@ static void TAB_SetItemBounds (HWND hwnd)
infoPtr->items[iItm].rect.left;
infoPtr->items[iItm].rect.left = 0;
TRACE("r=%d, cl=%d, cl.r=%d, iCount=%d, iRow=%d, uNumRows=%d, remTab=%d, tabPerRow=%d\n",
infoPtr->items[iItm].rect.right,
curItemLeftPos, clientRect.right,
iCount, iRow, infoPtr->uNumRows, remTab, tabPerRow);
/* if we have reached the maximum number of tabs on this row */
/* move to the next row, reset our current item left position and */
/* the count of items on this row */
/* ************ FIXME FIXME FIXME *************** */
/* */
/* FIXME: */
/* if vertical, */
/* if item n and n+1 are in the same row, */
/* then the display has n+1 lower (toward the */
/* bottom) than n. We do it just the */
/* opposite!!! */
/* */
/* ************ FIXME FIXME FIXME *************** */
if (lStyle & TCS_VERTICAL) {
/* Vert: Add the remaining tabs in the *last* remainder rows */
if (iCount >= ((iRow>=(INT)infoPtr->uNumRows - remTab)?tabPerRow + 1:tabPerRow)) {
iRow++;
curItemLeftPos = 0;
iCount = 0;
}
} else {
/* Horz: Add the remaining tabs in the *first* remainder rows */
if (iCount >= ((iRow<remTab)?tabPerRow + 1:tabPerRow)) {
iRow++;
curItemLeftPos = 0;
iCount = 0;
}
}
/* shift the item to the right to place it as the next item in this row */
infoPtr->items[iItm].rect.left += curItemLeftPos;
infoPtr->items[iItm].rect.right += curItemLeftPos;
@ -1223,6 +1298,12 @@ static void TAB_SetItemBounds (HWND hwnd)
}
else
curItemLeftPos = infoPtr->items[iItm].rect.right;
TRACE("arranging <%s>, l,r=%d,%d, row=%d\n",
debugstr_w(infoPtr->items[iItm].pszText),
infoPtr->items[iItm].rect.left,
infoPtr->items[iItm].rect.right,
infoPtr->items[iItm].rect.top);
}
/*
@ -1265,6 +1346,12 @@ static void TAB_SetItemBounds (HWND hwnd)
{
infoPtr->items[iIndex].rect.left += iCount * widthDiff;
infoPtr->items[iIndex].rect.right += (iCount + 1) * widthDiff;
TRACE("adjusting 1 <%s>, l,r=%d,%d\n",
debugstr_w(infoPtr->items[iIndex].pszText),
infoPtr->items[iIndex].rect.left,
infoPtr->items[iIndex].rect.right);
}
infoPtr->items[iIndex - 1].rect.right += remainder;
}
@ -1272,6 +1359,12 @@ static void TAB_SetItemBounds (HWND hwnd)
{
infoPtr->items[iIndexStart].rect.left = clientRect.left;
infoPtr->items[iIndexStart].rect.right = clientRect.right - 4;
TRACE("adjusting 2 <%s>, l,r=%d,%d\n",
debugstr_w(infoPtr->items[iIndexStart].pszText),
infoPtr->items[iIndexStart].rect.left,
infoPtr->items[iIndexStart].rect.right);
}
@ -1451,6 +1544,8 @@ TAB_DrawItemInterior
rcTemp = *drawRect;
rcText.left = rcText.top = rcText.right = rcText.bottom = 0;
/*
* Setup for text output
*/
@ -1472,41 +1567,45 @@ TAB_DrawItemInterior
ImageList_GetIconSize(infoPtr->himl, &cx, &cy);
if(lStyle & TCS_VERTICAL)
center_offset = ((drawRect->bottom - drawRect->top) - (cy + VERTICAL_ITEM_PADDING + (rcText.right - rcText.left))) / 2;
center_offset = ((drawRect->bottom - drawRect->top) - (cy + HORIZONTAL_ITEM_PADDING + (rcText.right - rcText.left))) / 2;
else
center_offset = ((drawRect->right - drawRect->left) - (cx + HORIZONTAL_ITEM_PADDING + (rcText.right - rcText.left))) / 2;
TRACE("for <%s>, c_o=%d, draw=(%d,%d)-(%d,%d), textlen=%d\n",
debugstr_w(infoPtr->items[iItem].pszText), center_offset,
drawRect->left, drawRect->top, drawRect->right, drawRect->bottom,
(rcText.right-rcText.left));
if((lStyle & TCS_VERTICAL) && (lStyle & TCS_BOTTOM))
{
/* rcImage.left = drawRect->left; */ /* explicit from above rcImage = *drawRect */
rcImage.top = drawRect->top + center_offset;
rcImage.left = drawRect->right - cx; /* if tab is TCS_VERTICAL and TCS_BOTTOM, the text is drawn from the */
/* right side of the tab, but the image still uses the left as its x position */
/* this keeps the image always drawn off of the same side of the tab */
drawRect->top = rcImage.top + (cx + VERTICAL_ITEM_PADDING);
drawRect->top = rcImage.top + (cx + HORIZONTAL_ITEM_PADDING);
}
else if(lStyle & TCS_VERTICAL)
{
/* rcImage.left = drawRect->left; */ /* explicit from above rcImage = *drawRect */
rcImage.top = drawRect->bottom - cy - center_offset;
drawRect->bottom = rcImage.top - VERTICAL_ITEM_PADDING;
rcImage.left--;
drawRect->bottom = rcImage.top - HORIZONTAL_ITEM_PADDING;
}
else /* normal style, whether TCS_BOTTOM or not */
{
rcImage.left = drawRect->left + center_offset;
/* rcImage.top = drawRect->top; */ /* explicit from above rcImage = *drawRect */
rcImage.left = drawRect->left + center_offset + 3;
drawRect->left = rcImage.left + cx + HORIZONTAL_ITEM_PADDING;
rcImage.top -= (lStyle & TCS_BOTTOM) ? 2 : 1;
}
TRACE("drawing image=%d, left=%d, top=%d\n",
infoPtr->items[iItem].iImage, rcImage.left, rcImage.top-1);
ImageList_Draw
(
infoPtr->himl,
infoPtr->items[iItem].iImage,
hdc,
rcImage.left,
rcImage.top + 1,
rcImage.top,
ILD_NORMAL
);
} else /* no image, so just shift the drawRect borders around */
@ -1937,6 +2036,8 @@ static void TAB_DrawItem(
}
}
TAB_DumpItemInternal(infoPtr, iItem);
/* This modifies r to be the text rectangle. */
{
HFONT hOldFont = SelectObject(hdc, infoPtr->hFont);
@ -2295,6 +2396,9 @@ TAB_InsertItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (iItem > infoPtr->uNumItem)
iItem = infoPtr->uNumItem;
TAB_DumpItemExternalA(pti, iItem);
if (infoPtr->uNumItem == 0) {
infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM));
infoPtr->uNumItem++;
@ -2367,6 +2471,8 @@ TAB_InsertItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (iItem > infoPtr->uNumItem)
iItem = infoPtr->uNumItem;
TAB_DumpItemExternalW(pti, iItem);
if (infoPtr->uNumItem == 0) {
infoPtr->items = COMCTL32_Alloc (sizeof (TAB_ITEM));
infoPtr->uNumItem++;
@ -2456,6 +2562,8 @@ TAB_SetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
TRACE("%d %p\n", iItem, tabItem);
if ((iItem<0) || (iItem>=infoPtr->uNumItem)) return FALSE;
TAB_DumpItemExternalA(tabItem, iItem);
wineItem = &infoPtr->items[iItem];
if (tabItem->mask & TCIF_IMAGE)
@ -2495,6 +2603,8 @@ TAB_SetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
TRACE("%d %p\n", iItem, tabItem);
if ((iItem<0) || (iItem>=infoPtr->uNumItem)) return FALSE;
TAB_DumpItemExternalW(tabItem, iItem);
wineItem = &infoPtr->items[iItem];
if (tabItem->mask & TCIF_IMAGE)
@ -2560,6 +2670,8 @@ TAB_GetItemA (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (tabItem->mask & TCIF_TEXT)
Str_GetPtrWtoA (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);
TAB_DumpItemExternalA(tabItem, iItem);
return TRUE;
}
@ -2595,6 +2707,8 @@ TAB_GetItemW (HWND hwnd, WPARAM wParam, LPARAM lParam)
if (tabItem->mask & TCIF_TEXT)
Str_GetPtrW (wineItem->pszText, tabItem->pszText, tabItem->cchTextMax);
TAB_DumpItemExternalW(tabItem, iItem);
return TRUE;
}