Fix behavior of TVS_SINGLEEXPAND style broken in Corel merge. Optimize

redrawing in TREEVIEW_SetItemA() to redraw only if the item changes.
oldstable
Chris Morgan 2000-09-22 20:48:15 +00:00 committed by Alexandre Julliard
parent a99ce7ef3d
commit 36c8db8c7d
1 changed files with 38 additions and 25 deletions

View File

@ -1860,8 +1860,10 @@ static LRESULT
TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem) TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
{ {
TREEVIEW_ITEM *wineItem; TREEVIEW_ITEM *wineItem;
TREEVIEW_ITEM originalItem;
wineItem = tvItem->hItem; wineItem = tvItem->hItem;
TRACE("item %d,mask %x\n", TREEVIEW_GetItemIndex(infoPtr, wineItem), TRACE("item %d,mask %x\n", TREEVIEW_GetItemIndex(infoPtr, wineItem),
tvItem->mask); tvItem->mask);
@ -1871,6 +1873,9 @@ TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
if (!TREEVIEW_DoSetItem(infoPtr, wineItem, tvItem)) if (!TREEVIEW_DoSetItem(infoPtr, wineItem, tvItem))
return FALSE; return FALSE;
/* store the orignal item values */
originalItem = *wineItem;
/* If the text or TVIS_BOLD was changed, and it is visible, recalculate. */ /* If the text or TVIS_BOLD was changed, and it is visible, recalculate. */
if ((tvItem->mask & TVIF_TEXT if ((tvItem->mask & TVIF_TEXT
|| (tvItem->mask & TVIF_STATE && tvItem->stateMask & TVIS_BOLD)) || (tvItem->mask & TVIF_STATE && tvItem->stateMask & TVIS_BOLD))
@ -1885,18 +1890,22 @@ TREEVIEW_SetItemA(TREEVIEW_INFO *infoPtr, LPTVITEMEXA tvItem)
/* The refresh updates everything, but we can't wait until then. */ /* The refresh updates everything, but we can't wait until then. */
TREEVIEW_ComputeItemInternalMetrics(infoPtr, wineItem); TREEVIEW_ComputeItemInternalMetrics(infoPtr, wineItem);
if (tvItem->mask & TVIF_INTEGRAL) /* if any of the items values changed, redraw the item */
{ if(memcmp(&originalItem, wineItem, sizeof(TREEVIEW_ITEM)))
TREEVIEW_RecalculateVisibleOrder(infoPtr, wineItem); {
TREEVIEW_UpdateScrollBars(infoPtr); if (tvItem->mask & TVIF_INTEGRAL)
{
TREEVIEW_RecalculateVisibleOrder(infoPtr, wineItem);
TREEVIEW_UpdateScrollBars(infoPtr);
TREEVIEW_QueueRefresh(infoPtr); TREEVIEW_QueueRefresh(infoPtr);
} }
else else
{ {
TREEVIEW_UpdateScrollBars(infoPtr); TREEVIEW_UpdateScrollBars(infoPtr);
TREEVIEW_QueueItemRefresh(infoPtr, wineItem); TREEVIEW_QueueItemRefresh(infoPtr, wineItem);
} }
}
} }
return TRUE; return TRUE;
@ -3717,23 +3726,22 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
*/ */
TREEVIEW_SendTreeviewNotify(infoPtr, TVN_SINGLEEXPAND, TVIF_HANDLE | TVIF_PARAM, TREEVIEW_SendTreeviewNotify(infoPtr, TVN_SINGLEEXPAND, TVIF_HANDLE | TVIF_PARAM,
0, ht.hItem, 0); 0, ht.hItem, 0);
/* /*
* Close the previous selection all the way to the root * Close the previous selection all the way to the root
* as long as the new selection is not a child * as long as the new selection is not a child
*/ */
if((infoPtr->selectedItem) if((infoPtr->selectedItem)
&& (infoPtr->selectedItem != ht.hItem)) && (infoPtr->selectedItem != ht.hItem))
{ {
BOOL closeit = TRUE; BOOL closeit = TRUE;
SelItem = ht.hItem; SelItem = ht.hItem;
while(closeit && SelItem) /* determine of the hitItem is a child of the currently selected item */
while(closeit && SelItem && TREEVIEW_ValidItem(infoPtr, SelItem) && (SelItem != infoPtr->root))
{ {
closeit = (SelItem != infoPtr->selectedItem); closeit = (SelItem != infoPtr->selectedItem);
SelItem = SelItem->parent;
if(TREEVIEW_ValidItem(infoPtr, SelItem->parent))
SelItem = SelItem->parent;
} }
if(closeit) if(closeit)
@ -3741,12 +3749,10 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
if(TREEVIEW_ValidItem(infoPtr, infoPtr->selectedItem)) if(TREEVIEW_ValidItem(infoPtr, infoPtr->selectedItem))
SelItem = infoPtr->selectedItem; SelItem = infoPtr->selectedItem;
while((SelItem) && (SelItem != ht.hItem)) while(SelItem && (SelItem != ht.hItem) && TREEVIEW_ValidItem(infoPtr, SelItem) && (SelItem != infoPtr->root))
{ {
TREEVIEW_Expand(infoPtr, SelItem, (WPARAM)TVE_COLLAPSE, TREEVIEW_Collapse(infoPtr, SelItem, FALSE, FALSE);
FALSE); SelItem = SelItem->parent;
if(TREEVIEW_ValidItem(infoPtr, SelItem->parent))
SelItem = SelItem->parent;
} }
} }
} }
@ -3756,8 +3762,9 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
*/ */
TREEVIEW_Expand(infoPtr, ht.hItem, TVE_TOGGLE, FALSE); TREEVIEW_Expand(infoPtr, ht.hItem, TVE_TOGGLE, FALSE);
} }
else
TREEVIEW_DoSelectItem(infoPtr, TVGN_CARET, ht.hItem, TVC_BYMOUSE); /* Select the current item */
TREEVIEW_DoSelectItem(infoPtr, TVGN_CARET, ht.hItem, TVC_BYMOUSE);
} }
else if (ht.flags & TVHT_ONITEMSTATEICON) else if (ht.flags & TVHT_ONITEMSTATEICON)
{ {
@ -3849,7 +3856,7 @@ TREEVIEW_CreateDragImage(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
hOldFont = SelectObject(hdc, infoPtr->hFont); hOldFont = SelectObject(hdc, infoPtr->hFont);
GetTextExtentPoint32A(hdc, dragItem->pszText, lstrlenA(dragItem->pszText), GetTextExtentPoint32A(hdc, dragItem->pszText, lstrlenA(dragItem->pszText),
&size); &size);
TRACE("%d %d %s %d\n", size.cx, size.cy, dragItem->pszText, TRACE("%ld %ld %s %d\n", size.cx, size.cy, dragItem->pszText,
lstrlenA(dragItem->pszText)); lstrlenA(dragItem->pszText));
hbmp = CreateCompatibleBitmap(htopdc, size.cx, size.cy); hbmp = CreateCompatibleBitmap(htopdc, size.cx, size.cy);
hOldbmp = SelectObject(hdc, hbmp); hOldbmp = SelectObject(hdc, hbmp);
@ -3999,7 +4006,13 @@ TREEVIEW_EnsureVisible(TREEVIEW_INFO *infoPtr, HTREEITEM item, BOOL bHScroll)
if (!ISVISIBLE(item)) if (!ISVISIBLE(item))
{ {
/* Expand parents as necessary. */ /* Expand parents as necessary. */
HTREEITEM parent = item->parent; HTREEITEM parent;
/* see if we are trying to ensure that root is vislble */
if((item != infoPtr->root) && TREEVIEW_ValidItem(infoPtr, item))
parent = item->parent;
else
parent = item; /* this item is the topmost item */
while (parent != infoPtr->root) while (parent != infoPtr->root)
{ {