LCL: TCustomListView: implemented OnItemChecked. fixes #17042

git-svn-id: trunk@27975 -
This commit is contained in:
zeljko 2010-10-30 12:51:58 +00:00
parent ca5d59ca59
commit 612440d648
3 changed files with 56 additions and 22 deletions

View File

@ -950,6 +950,7 @@ type
TLVDeletedEvent = procedure(Sender: TObject; Item: TListItem) of object;
TLVInsertEvent = TLVDeletedEvent;
TLVDataEvent = TLVDeletedEvent;
TLVCheckedItemEvent = procedure (Sender: TObject; Item: TListItem) of object;
TLVSelectItemEvent = procedure(Sender: TObject; Item: TListItem;
Selected: Boolean) of object;
TLVCustomDrawEvent = procedure(Sender: TCustomListView; const ARect: TRect;
@ -1034,6 +1035,7 @@ type
FOnData: TLVDataEvent;
FOnDeletion: TLVDeletedEvent;
FOnInsert: TLVInsertEvent;
FOnItemChecked: TLVCheckedItemEvent;
FOnSelectItem: TLVSelectItemEvent;
FOnCustomDraw: TLVCustomDrawEvent;
FOnCustomDrawItem: TLVCustomDrawItemEvent;
@ -1100,6 +1102,7 @@ type
procedure Delete(Item : TListItem);
procedure DoDeletion(AItem: TListItem); virtual;
procedure DoInsert(AItem: TListItem); virtual;
procedure DoItemChecked(AItem: TListItem);
procedure DoSelectItem(AItem: TListItem; ASelected: Boolean); virtual;
procedure InsertItem(Item : TListItem);
procedure ImageChanged(Sender : TObject);
@ -1137,6 +1140,7 @@ type
property OnData: TLVDataEvent read FOnData write FOnData;
property OnDeletion: TLVDeletedEvent read FOnDeletion write FOnDeletion;
property OnInsert: TLVInsertEvent read FOnInsert write FOnInsert;
property OnItemChecked: TLVCheckedItemEvent read FOnItemChecked write FOnItemChecked;
property OnSelectItem: TLVSelectItemEvent read FOnSelectItem write FOnSelectItem;
property OnCustomDraw: TLVCustomDrawEvent read FOnCustomDraw write FOnCustomDraw;
property OnCustomDrawItem: TLVCustomDrawItemEvent read FOnCustomDrawItem write FOnCustomDrawItem;
@ -1260,6 +1264,7 @@ type
property OnEndDrag;
property OnEnter;
property OnExit;
property OnItemChecked;
property OnKeyDown;
property OnKeyPress;
property OnKeyUp;

View File

@ -231,47 +231,57 @@ begin
LVN_ITEMCHANGING: begin
//Check
end;
LVN_ITEMCHANGED: begin
LVN_ITEMCHANGED:
begin
Item := Items[nm^.iItem];
//DebugLn('TCustomListView.CNNotify Count=',dbgs(Items.Count),' nm^.iItem=',dbgs(nm^.iItem),' destroying=',dbgs(lifDestroying in Item.FFlags));
if (Item <> nil) and (not OwnerData) and (lifDestroying in Item.FFlags) then begin
if (Item <> nil) and (not OwnerData) and (lifDestroying in Item.FFlags) then
begin
if Item=FFocused then
FFocused:=nil;
if Item=FSelected then
InvalidateSelected;
end else begin
end else
begin
// owner data
Change(Item, nm^.uChanged);
if (nm^.uChanged = LVIF_STATE)
then begin
if (nm^.uChanged = LVIF_STATE) then
begin
// checkbox
if Checkboxes then
DoItemChecked(Item);
// focus
if (nm^.uOldState and LVIS_FOCUSED) <> (nm^.uNewState and LVIS_FOCUSED)
then begin
if (nm^.uOldState and LVIS_FOCUSED) <>
(nm^.uNewState and LVIS_FOCUSED) then
begin
// focus state changed
if (nm^.uNewState and LVIS_FOCUSED) = 0
then begin
if FFocused = Item
then FFocused := nil;
end
else begin
if (nm^.uNewState and LVIS_FOCUSED) = 0 then
begin
if FFocused = Item then
FFocused := nil;
end else
begin
FFocused := Item;
end;
end;
// select
if (nm^.uOldState and LVIS_SELECTED) <> (nm^.uNewState and LVIS_SELECTED)
then begin
if (nm^.uOldState and LVIS_SELECTED) <>
(nm^.uNewState and LVIS_SELECTED) then
begin
// select state changed
if (nm^.uNewState and LVIS_SELECTED) = 0
then begin
if (nm^.uNewState and LVIS_SELECTED) = 0 then
begin
if not OwnerData and (FSelected = Item) then
InvalidateSelected
else if OwnerData and (nm^.iItem=FSelectedIdx) then begin
else if OwnerData and (nm^.iItem=FSelectedIdx) then
begin
FSelectedIdx:=-1;
InvalidateSelected;
end;
DoSelectItem(Item, False);
end
else begin
end else
begin
FSelected := Item;
Include(FFlags,lffSelectedValid);
if OwnerData then FSelectedIdx:=nm^.iItem;
@ -391,6 +401,24 @@ begin
if Assigned(FOnInsert) then FOnInsert(Self, AItem);
end;
{------------------------------------------------------------------------------}
{ TCustomListView DoItemChecked }
{------------------------------------------------------------------------------}
procedure TCustomListView.DoItemChecked(AItem: TListItem);
var
B: Boolean;
begin
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
B := TWSCustomListViewClass(WidgetSetClass).ItemGetChecked(Self,
AItem.Index, AItem);
if B <> AItem.GetCheckedInternal then
begin
AItem.Checked := B;
if Assigned(FOnItemChecked) then
FOnItemChecked(Self, AItem);
end;
end;
{------------------------------------------------------------------------------}
{ TCustomListView DoSelectItem }
{------------------------------------------------------------------------------}

View File

@ -648,8 +648,9 @@ var
begin
LV := FOwner.FOwner;
FChecked := AValue;
if LV.Checkboxes and WSUpdateAllowed
then TWSCustomListViewClass(LV.WidgetSetClass).ItemSetChecked(LV, GetIndex, Self, AValue);
if LV.Checkboxes and WSUpdateAllowed then
TWSCustomListViewClass(LV.WidgetSetClass).ItemSetChecked(LV, GetIndex,
Self, AValue);
end;
{------------------------------------------------------------------------------}