140 #include "commctrl.h" 303 BOOL bDefaultBkColor;
341 #define DEBUG_BUFFERS 20 343 #define DEBUG_BUFFER_SIZE 256 346 #define SB_INTERNAL -1 349 #define DISP_TEXT_SIZE 260 352 #define WIDTH_PADDING 12 355 #define HEIGHT_PADDING 1 358 #define REPORT_MARGINX 2 372 #define ICON_TOP_PADDING_NOTHITABLE 2 373 #define ICON_TOP_PADDING_HITABLE 2 374 #define ICON_TOP_PADDING (ICON_TOP_PADDING_NOTHITABLE + ICON_TOP_PADDING_HITABLE) 375 #define ICON_BOTTOM_PADDING 4 376 #define LABEL_HOR_PADDING 5 377 #define LABEL_VERT_PADDING 7 378 #define ICON_LR_PADDING 16 379 #define ICON_LR_HALF (ICON_LR_PADDING/2) 382 #define DEFAULT_LABEL_WIDTH 40 384 #define MAX_EMPTYTEXT_SELECT_WIDTH 80 387 #define DEFAULT_COLUMN_WIDTH 128 390 #define LISTVIEW_SCROLL_ICON_LINE_SIZE 37 393 #define IMAGE_PADDING 2 396 #define TRAILING_LABEL_PADDING 12 397 #define TRAILING_HEADER_PADDING 11 400 #define CAPTION_BORDER 2 403 #define LV_ML_DT_FLAGS (DT_TOP | DT_NOPREFIX | DT_EDITCONTROL | DT_CENTER | DT_WORDBREAK | DT_WORD_ELLIPSIS | DT_END_ELLIPSIS) 404 #define LV_FL_DT_FLAGS (DT_TOP | DT_NOPREFIX | DT_EDITCONTROL | DT_CENTER | DT_WORDBREAK | DT_NOCLIP) 405 #define LV_SL_DT_FLAGS (DT_VCENTER | DT_NOPREFIX | DT_EDITCONTROL | DT_SINGLELINE | DT_WORD_ELLIPSIS | DT_END_ELLIPSIS) 408 #define STATEIMAGEINDEX(x) (((x) & LVIS_STATEIMAGEMASK) >> 12) 411 #define KEY_DELAY 450 414 #define LISTVIEW_DUMP(iP) do { \ 415 TRACE("hwndSelf=%p, clrBk=0x%06x, clrText=0x%06x, clrTextBk=0x%06x, ItemHeight=%d, ItemWidth=%d, Style=0x%08x\n", \ 416 iP->hwndSelf, iP->clrBk, iP->clrText, iP->clrTextBk, \ 417 iP->nItemHeight, iP->nItemWidth, iP->dwStyle); \ 418 TRACE("hwndSelf=%p, himlNor=%p, himlSml=%p, himlState=%p, Focused=%d, Hot=%d, exStyle=0x%08x, Focus=%d\n", \ 419 iP->hwndSelf, iP->himlNormal, iP->himlSmall, iP->himlState, \ 420 iP->nFocusedItem, iP->nHotItem, iP->dwLvExStyle, iP->bFocus ); \ 421 TRACE("hwndSelf=%p, ntmH=%d, icSz.cx=%d, icSz.cy=%d, icSp.cx=%d, icSp.cy=%d, notifyFmt=%d\n", \ 422 iP->hwndSelf, iP->ntmHeight, iP->iconSize.cx, iP->iconSize.cy, \ 423 iP->iconSpacing.cx, iP->iconSpacing.cy, iP->notifyFormat); \ 424 TRACE("hwndSelf=%p, rcList=%s\n", iP->hwndSelf, wine_dbgstr_rect(&iP->rcList)); \ 531 if (!aw)
return bt ? -1 : 0;
569 static int index = 0;
576 if (!lprng)
return "(null)";
585 if (pScrollInfo ==
NULL)
return "(null)";
619 if (!plvnm)
return "(null)";
621 " uOldState=0x%x, uChanged=0x%x, ptAction=%s, lParam=%ld",
631 if (lpLVItem ==
NULL)
return "(null)";
673 if (lpColumn ==
NULL)
return "(null)";
717 if (!lpht)
return "(null)";
736 default:
return "unknown";
745 switch (unicodeNotificationCode)
776 FIXME(
"unknown notification %x\n", unicodeNotificationCode);
777 return unicodeNotificationCode;
800 lpnmh->pitem->pszText =
NULL;
805 lpnmh->pitem->pvFilter)
820 Free(lpnmh->pitem->pszText);
953 ret_length =
pdi->item.cchTextMax;
954 ret_text =
pdi->item.pszText;
956 if (return_unicode || return_ansi)
967 *
pdi->item.pszText = 0;
989 TRACE(
" resulting code=%d\n",
pdi->hdr.code);
991 if (return_ansi || return_unicode)
995 strcpy((
char*)ret_text, (
char*)
pdi->item.pszText);
1001 else if (return_ansi)
1008 ret_text, ret_length);
1010 pdi->item.pszText = ret_text;
1011 pdi->item.cchTextMax = ret_length;
1040 lpnmlvcd->
nmcd.
rc = *rcBounds;
1043 if (!lplvItem)
return;
1089 textcolor = lpnmlvcd->
clrText;
1218 i->nItem =
i->nSpecial;
1219 if (
i->nItem != -1)
return TRUE;
1221 if (
i->nItem ==
i->nSpecial)
1223 if (
i->ranges)
i->index = 0;
1229 if (
i->nItem ==
i->nSpecial)
i->nItem++;
1230 if (
i->nItem <
i->range.upper)
return TRUE;
1239 else if (
i->nItem >=
i->range.upper)
goto end;
1241 i->nItem =
i->range.lower;
1242 if (
i->nItem >= 0)
goto testitem;
1264 if (
i->nItem ==
i->nSpecial)
1272 if (
i->nItem ==
i->nSpecial)
i->nItem--;
1273 if (
i->nItem >=
i->range.lower)
return TRUE;
1282 else if (!
start &&
i->nItem <
i->range.lower)
goto end;
1284 i->nItem =
i->range.upper;
1285 if (
i->nItem > 0)
goto testitem;
1287 return (
i->nItem =
i->nSpecial) != -1;
1294 if (!
i->ranges)
return i->range;
1320 i->nItem =
i->nSpecial =
i->range.lower =
i->range.upper = -1;
1349 RECT rcItem, rcTemp;
1373 TRACE(
"building icon ranges:\n");
1374 for (nItem = 0; nItem < infoPtr->
nItemCount; nItem++)
1416 nFirstCol =
max(frame->
left, 0);
1420 lower = nFirstCol * nPerCol + nFirstRow;
1422 TRACE(
"nPerCol=%d, nFirstRow=%d, nLastRow=%d, nFirstCol=%d, nLastCol=%d, lower=%d\n",
1423 nPerCol, nFirstRow, nLastRow, nFirstCol, nLastCol, lower);
1425 if (nLastCol < nFirstCol || nLastRow < nFirstRow)
return TRUE;
1429 TRACE(
"building list ranges:\n");
1430 for (nCol = nFirstCol; nCol <= nLastCol; nCol++)
1432 item_range.lower = nCol * nPerCol + nFirstRow;
1433 if(item_range.lower >= infoPtr->
nItemCount)
break;
1434 item_range.upper =
min(nCol * nPerCol + nLastRow + 1, infoPtr->
nItemCount);
1465 RECT rcItem, rcClip;
1478 if (
i->nSpecial != -1)
1486 TRACE(
"building visible range:\n");
1487 if (!
i->ranges &&
i->range.lower <
i->range.upper)
1525 ERR(
"result is not a one range iterator\n");
1529 if(iter1->
range.lower==-1 || iter2->
range.lower==-1)
1532 lower = iter1->
range.lower;
1533 upper = iter1->
range.upper;
1535 if(lower < iter2->
range.lower)
1537 else if(upper > iter2->
range.upper)
1540 iter1->
range.lower = iter1->
range.upper = -1;
1542 if(iter2->
range.lower < lower)
1543 iter2->
range.upper = lower;
1544 else if(iter2->
range.upper > upper)
1545 iter2->
range.lower = upper;
1547 iter2->
range.lower = iter2->
range.upper = -1;
1560 int delete = iter1->
nItem;
1635 return lpID->
id + 1;
1709 infoPtr->
dwLvExStyle & LVS_EX_HEADERINALLVIEWS) &&
1726 DWORD dwOldBkColor, dwOldTextColor;
1885 if (!charCode || !keyData || infoPtr->
nItemCount == 0)
return 0;
1889 charCode !=
'.' && charCode !=
'`' && charCode !=
'!' &&
1890 charCode !=
'@' && charCode !=
'#' && charCode !=
'$' &&
1891 charCode !=
'%' && charCode !=
'^' && charCode !=
'&' &&
1892 charCode !=
'*' && charCode !=
'(' && charCode !=
')' &&
1893 charCode !=
'-' && charCode !=
'_' && charCode !=
'+' &&
1894 charCode !=
'=' && charCode !=
'\\'&& charCode !=
']' &&
1895 charCode !=
'}' && charCode !=
'[' && charCode !=
'{' &&
1896 charCode !=
'/' && charCode !=
'?' && charCode !=
'>' &&
1897 charCode !=
'<' && charCode !=
',' && charCode !=
'~')
1928 if (startidx == infoPtr->
nItemCount) startidx = 0;
1949 int i = startidx, endidx;
1965 for (
i = startidx;
i < endidx;
i++)
1992 (startidx == 0 && endidx == infoPtr->
nItemCount) )
2020 TRACE(
"nNewScrollPos=%d\n", nNewScrollPos);
2031 point[0].
x = -nNewScrollPos;
2032 point[1].
x += nNewScrollPos;
2085 TRACE(
"horzInfo.nMax=%d\n", horzInfo.
nMax);
2126 if (vertInfo.
nPage != 0)
2189 if (
dx != 0 ||
dy != 0)
2192 listRect = infoPtr->
rcList;
2305 assert(nItem >= 0 && nItem < infoPtr->nItemCount);
2315 lpptPosition->
x = nItem / nCountPerColumn * infoPtr->
nItemWidth;
2316 lpptPosition->
y = nItem % nCountPerColumn * infoPtr->
nItemHeight;
2377 SIZE labelSize = { 0, 0 };
2388 if (lprcSelectBox) doSelectBox =
TRUE;
2389 if (lprcLabel) doLabel =
TRUE;
2390 if (doLabel || lprcIcon || lprcStateIcon) doIcon =
TRUE;
2420 LONG state_width = 0;
2427 Icon.left = Box.
left + state_width;
2441 Icon.left = Box.
left + state_width;
2453 (!lpColumnInfo || lpLVItem->
iSubItem == 0 ||
2458 if(lprcIcon) *lprcIcon =
Icon;
2464 lprcStateIcon->
left =
Icon.left - state_width;
2466 lprcStateIcon->
top =
Icon.top;
2471 else Icon.right = 0;
2539 if (!oversizedBox && labelSize.
cy > infoPtr->
ntmHeight)
2543 labelSize.
cy =
max(labelSize.
cy, 1);
2564 if (lprcLabel) *lprcLabel =
Label;
2588 if (lprcSelectBox) *lprcSelectBox = SelectBox;
2596 else *lprcBox = Box;
2625 lvItem.
iItem = nItem;
2653 if (id1->
id == id2->
id)
return 0;
2655 return (id1->
id < id2->
id) ? -1 : 1;
2674 TRACE(
"iID=%d\n", iID);
2707 TRACE(
"iItem=%d\n", iItem);
2710 if (iItem < 0 || iItem >= infoPtr->
nItemCount)
return -1;
2715 return lpItem->
id->
id;
2812 if ((*lpPos).x > nListWidth) (*lpPos).x = nMaxColumns * infoPtr->
nItemWidth;
2813 if ((*lpPos).y > nListHeight) (*lpPos).y = nMaxRows * infoPtr->
nItemHeight;
2842 if (lppt->
x == old.
x && lppt->
y == old.
y)
return TRUE;
2880 TRACE(
"nAlignCode=%d\n", nAlignCode);
2897 default:
return FALSE;
2904 next_pos(infoPtr, &
pos,
i);
2906 next_pos(infoPtr, &
pos);
2933 switch (infoPtr->
uView)
2977 TRACE(
"(lprcView=%p)\n", lprcView);
2979 if (!lprcView)
return FALSE;
3015 if (lpSubItem->
iSubItem == nSubItem)
3052 nItemWidth = rcHeader.
right;
3113 return max(nItemHeight, 1);
3183 if (((
RANGE*)range1)->upper <= ((
RANGE*)range2)->lower)
3185 else if (((
RANGE*)range2)->upper <= ((
RANGE*)range1)->lower)
3195 #define ranges_check(ranges, desc) if (TRACE_ON(listview)) ranges_assert(ranges, desc, __FILE__, __LINE__) 3209 assert (prev->lower >= 0 && prev->lower < prev->upper);
3213 assert (prev->upper <= curr->lower);
3214 assert (curr->lower < curr->upper);
3218 TRACE(
"--- Done checking---\n");
3224 if (!ranges)
return NULL;
3226 if (ranges->
hdpa)
return ranges;
3243 if (!ranges)
return;
3259 if (!newrng)
goto fail;
3270 TRACE (
"clone failed\n");
3295 RANGE srchrng = { nItem, nItem + 1 };
3297 TRACE(
"(nItem=%d)\n", nItem);
3309 count += sel->upper - sel->lower;
3317 RANGE srchrng = { nItem, nItem + 1 }, *chkrng;
3326 if (chkrng->lower >= nItem)
3327 chkrng->lower =
max(
min(chkrng->lower + delta, nUpper - 1), 0);
3328 if (chkrng->upper > nItem)
3329 chkrng->upper =
max(
min(chkrng->upper + delta, nUpper), 0);
3343 srchrgn.lower =
range.lower - 1;
3344 srchrgn.upper =
range.upper + 1;
3351 TRACE(
"Adding new range\n");
3355 if(!newrgn)
goto fail;
3372 RANGE *chkrgn, *mrgrgn;
3373 INT fromindex, mergeindex;
3378 chkrgn->lower =
min(
range.lower, chkrgn->lower);
3379 chkrgn->upper =
max(
range.upper, chkrgn->upper);
3385 srchrgn.lower = chkrgn->lower - 1;
3386 srchrgn.upper = chkrgn->upper + 1;
3391 if (mergeindex == -1)
break;
3392 if (mergeindex ==
index)
3394 fromindex =
index + 1;
3398 TRACE(
"Merge with index %i\n", mergeindex);
3401 chkrgn->lower =
min(chkrgn->lower, mrgrgn->lower);
3402 chkrgn->upper =
max(chkrgn->upper, mrgrgn->upper);
3435 if ( (chkrgn->upper ==
range.upper) &&
3436 (chkrgn->lower ==
range.lower) )
3443 else if ( (chkrgn->upper <=
range.upper) &&
3444 (chkrgn->lower >=
range.lower) )
3450 else if ( (chkrgn->upper <=
range.upper) &&
3451 (chkrgn->lower <
range.lower) )
3453 chkrgn->upper =
range.lower;
3456 else if ( (chkrgn->upper >
range.upper) &&
3457 (chkrgn->lower >=
range.lower) )
3459 chkrgn->lower =
range.upper;
3467 if (!(newrgn =
Alloc(
sizeof(
RANGE))))
goto fail;
3468 newrgn->lower = chkrgn->lower;
3469 newrgn->upper =
range.lower;
3470 chkrgn->lower =
range.upper;
3552 INT nSelectedCount = 0;
3566 TRACE(
"nSelectedCount=%d\n", nSelectedCount);
3567 return nSelectedCount;
3598 if (nShiftItem < nItem)
return nShiftItem;
3600 if (nShiftItem > nItem)
return nShiftItem + direction;
3602 if (direction > 0)
return nShiftItem + direction;
3639 TRACE(
"Shifting %i, %i steps\n", nItem, direction);
3678 if (nFirst == -1) nFirst = nItem;
3683 for (
i = nFirst;
i <= nLast;
i++)
3687 nmlv.
iFrom = nFirst;
3741 RECT rcItem, rcSel, rcSelMark;
3798 TRACE(
"nItem=%d\n", nItem);
3829 TRACE(
"nItem=%d, wShift=%d, wCtrl=%d\n", nItem, wShift, wCtrl);
3830 if ((nItem >= 0) && (nItem < infoPtr->nItemCount))
3865 ZeroMemory(&lvHitTestInfo,
sizeof(lvHitTestInfo));
3866 lvHitTestInfo.
pt.
x =
pt.x;
3867 lvHitTestInfo.
pt.
y =
pt.y;
3926 #define SCROLL_LEFT 0x1 3927 #define SCROLL_RIGHT 0x2 3928 #define SCROLL_UP 0x4 3929 #define SCROLL_DOWN 0x8 3968 rect.right = coords_offs.
x;
3972 rect.left = coords_offs.
x;
3979 rect.bottom = coords_offs.
y;
3983 rect.top = coords_offs.
y;
3999 if ((scroll &
SCROLL_UP) && (coords_orig->
y <= 0))
4017 if (old_elems.
nItem > -1)
4038 if (new_elems.
nItem > -1)
4092 if (scrollInfo.
nPos != scrollInfo.
nMin)
4095 if (((scrollInfo.
nPage + scrollInfo.
nPos) - 1) != scrollInfo.
nMax)
4101 if (scrollInfo.
nPos != scrollInfo.
nMin)
4104 if (((scrollInfo.
nPage + scrollInfo.
nPos) - 1) != scrollInfo.
nMax)
4311 if (lpLVItem->
mask == 0)
return TRUE;
4337 TRACE(
"oldState=%x, newState=%x\n",
item.state, lpLVItem->
state);
4354 TRACE(
"change mask=0x%x\n", uChanged);