LCL: TListView.OwnerData: fixed behaviour of ItemIndex when multiselection is enabled. issue #19825

git-svn-id: trunk@35597 -
This commit is contained in:
zeljko 2012-02-26 15:44:48 +00:00
parent 9f7ab89220
commit e222b242b6
2 changed files with 26 additions and 18 deletions

View File

@ -354,7 +354,11 @@ begin
begin begin
FSelected := Item; FSelected := Item;
Include(FFlags,lffSelectedValid); Include(FFlags,lffSelectedValid);
if OwnerData then FSelectedIdx:=nm^.iItem; if OwnerData then
begin
if (MultiSelect and (FSelectedIdx = -1)) or not MultiSelect then
FSelectedIdx:=nm^.iItem;
end;
//DebugLn('TCustomListView.CNNotify FSelected=',dbgs(FSelected)); //DebugLn('TCustomListView.CNNotify FSelected=',dbgs(FSelected));
DoSelectItem(Item, True); DoSelectItem(Item, True);
end; end;
@ -1351,17 +1355,19 @@ begin
if (AValue < -1) or (AValue >= Items.Count) then if (AValue < -1) or (AValue >= Items.Count) then
raise Exception.CreateFmt(rsListIndexExceedsBounds,[AValue]); raise Exception.CreateFmt(rsListIndexExceedsBounds,[AValue]);
if OwnerData then
FSelectedIdx := AValue;
if AValue = -1 then if AValue = -1 then
begin Selected := nil
Selected := nil; else
end else
begin begin
// trigger ws selection update, it'll update Selected too // trigger ws selection update, it'll update Selected too
if OwnerData then if OwnerData then
Items.Item[AValue].Selected := True begin
else // clean selection when itemindex is changed. issue #19825
if MultiSelect then
Selected := nil;
FSelectedIdx := AValue;
Items.Item[AValue].Selected := True;
end else
Selected := Items.Item[AValue]; Selected := Items.Item[AValue];
end; end;
end; end;
@ -1377,8 +1383,10 @@ begin
raise Exception.Create('Item does not belong to this listview'); raise Exception.Create('Item does not belong to this listview');
if FSelected = AValue then Exit; if FSelected = AValue then Exit;
//DebugLn('TCustomListView.SetSelection FSelected=',dbgs(FSelected)); //DebugLn('TCustomListView.SetSelection FSelected=',dbgs(FSelected));
if AValue = nil then begin if AValue = nil then
if MultiSelect then begin begin
if MultiSelect then
begin
BeginUpdate; BeginUpdate;
try try
for i:=0 to Items.Count-1 do for i:=0 to Items.Count-1 do
@ -1388,17 +1396,16 @@ begin
finally finally
EndUpdate; EndUpdate;
end; end;
end end else
else
FSelected.Selected := False; FSelected.Selected := False;
FSelected := nil; FSelected := nil;
Include(FFlags,lffSelectedValid); Include(FFlags,lffSelectedValid);
end end else
else begin begin
FSelected := AValue; FSelected := AValue;
if HandleAllocated then if HandleAllocated then
TWSCustomListViewClass(WidgetSetClass).ItemSetState(Self, FSelected.Index, TWSCustomListViewClass(WidgetSetClass).ItemSetState(Self, FSelected.Index,
FSelected, lisSelected, True); FSelected, lisSelected, True);
end; end;
end; end;

View File

@ -727,9 +727,10 @@ begin
if (AState in FStates) = AIsSet then Exit; if (AState in FStates) = AIsSet then Exit;
if AIsSet if AIsSet then
then Include(FStates, AState) Include(FStates, AState)
else Exclude(FStates, AState); else
Exclude(FStates, AState);
if not WSUpdateAllowed and not IsOwnerData then Exit; if not WSUpdateAllowed and not IsOwnerData then Exit;
LV := FOwner.FOwner; LV := FOwner.FOwner;