LCL: TCustomListView: Implemented OwnerDraw & OnDrawItem for delphi compatibility. Widgetsets are responsible to trigger OnDrawItem via CN_DRAWITEM message.Part of issue #25149

git-svn-id: trunk@43115 -
This commit is contained in:
zeljko 2013-10-06 11:36:42 +00:00
parent 5f3d3ef662
commit a439dbcfb6
2 changed files with 51 additions and 3 deletions

View File

@ -1253,6 +1253,8 @@ type
TLVCustomDrawSubItemEvent=procedure(Sender: TCustomListView; Item: TListItem; TLVCustomDrawSubItemEvent=procedure(Sender: TCustomListView; Item: TListItem;
SubItem: Integer; State: TCustomDrawState; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean) of object; var DefaultDraw: Boolean) of object;
TLVDrawItemEvent = procedure(Sender: TCustomListView; AItem: TListItem; ARect: TRect;
AState: TOwnerDrawState) of object;
TLVAdvancedCustomDrawEvent = procedure(Sender: TCustomListView; const ARect: TRect; TLVAdvancedCustomDrawEvent = procedure(Sender: TCustomListView; const ARect: TRect;
Stage: TCustomDrawStage; var DefaultDraw: Boolean) of object; Stage: TCustomDrawStage; var DefaultDraw: Boolean) of object;
TLVAdvancedCustomDrawItemEvent = procedure(Sender: TCustomListView; Item: TListItem; TLVAdvancedCustomDrawItemEvent = procedure(Sender: TCustomListView; Item: TListItem;
@ -1407,9 +1409,11 @@ type
procedure SetViewStyle(const Avalue: TViewStyle); procedure SetViewStyle(const Avalue: TViewStyle);
procedure UpdateScrollbars; procedure UpdateScrollbars;
procedure CNNotify(var AMessage: TLMNotify); message CN_NOTIFY; procedure CNNotify(var AMessage: TLMNotify); message CN_NOTIFY;
procedure CNDrawItem(var Message: TLMDrawListItem); message CN_DRAWITEM;
procedure InvalidateSelected; procedure InvalidateSelected;
private private
FOnCreateItemClass: TLVCreateItemClassEvent; FOnCreateItemClass: TLVCreateItemClassEvent;
FOnDrawItem: TLVDrawItemEvent;
procedure HideEditor; procedure HideEditor;
procedure ShowEditor; procedure ShowEditor;
procedure WMHScroll(var message : TLMHScroll); message LM_HSCROLL; procedure WMHScroll(var message : TLMHScroll); message LM_HSCROLL;
@ -1454,6 +1458,7 @@ type
function CustomDrawSubItem(AItem: TListItem; ASubItem: Integer; AState: TCustomDrawState; AStage: TCustomDrawStage): Boolean; virtual; // function CustomDrawSubItem(AItem: TListItem; ASubItem: Integer; AState: TCustomDrawState; AStage: TCustomDrawStage): Boolean; virtual; //
function IntfCustomDraw(ATarget: TCustomDrawTarget; AStage: TCustomDrawStage; AItem, ASubItem: Integer; AState: TCustomDrawState; const ARect: PRect): TCustomDrawResult; function IntfCustomDraw(ATarget: TCustomDrawTarget; AStage: TCustomDrawStage; AItem, ASubItem: Integer; AState: TCustomDrawState; const ARect: PRect): TCustomDrawResult;
function GetUpdateCount: Integer; function GetUpdateCount: Integer;
procedure DrawItem(AItem: TListItem; ARect: TRect; AState: TOwnerDrawState);
procedure DoGetOwnerData(Item: TListItem); virtual; procedure DoGetOwnerData(Item: TListItem); virtual;
function DoOwnerDataHint(AStartIndex, AEndIndex: Integer): Boolean; virtual; function DoOwnerDataHint(AStartIndex, AEndIndex: Integer): Boolean; virtual;
@ -1500,6 +1505,7 @@ type
property OnCustomDraw: TLVCustomDrawEvent read FOnCustomDraw write FOnCustomDraw; property OnCustomDraw: TLVCustomDrawEvent read FOnCustomDraw write FOnCustomDraw;
property OnCustomDrawItem: TLVCustomDrawItemEvent read FOnCustomDrawItem write FOnCustomDrawItem; property OnCustomDrawItem: TLVCustomDrawItemEvent read FOnCustomDrawItem write FOnCustomDrawItem;
property OnCustomDrawSubItem: TLVCustomDrawSubItemEvent read FOnCustomDrawSubItem write FOnCustomDrawSubItem; property OnCustomDrawSubItem: TLVCustomDrawSubItemEvent read FOnCustomDrawSubItem write FOnCustomDrawSubItem;
property OnDrawItem: TLVDrawItemEvent read FOnDrawItem write FOnDrawItem; // Owner drawn item.Event triggers only when OwnerDraw=True and ListStyle=vsReport
property OnAdvancedCustomDraw: TLVAdvancedCustomDrawEvent read FOnAdvancedCustomDraw write FOnAdvancedCustomDraw; property OnAdvancedCustomDraw: TLVAdvancedCustomDrawEvent read FOnAdvancedCustomDraw write FOnAdvancedCustomDraw;
property OnAdvancedCustomDrawItem: TLVAdvancedCustomDrawItemEvent read FOnAdvancedCustomDrawItem write FOnAdvancedCustomDrawItem; property OnAdvancedCustomDrawItem: TLVAdvancedCustomDrawItemEvent read FOnAdvancedCustomDrawItem write FOnAdvancedCustomDrawItem;
property OnAdvancedCustomDrawSubItem: TLVAdvancedCustomDrawSubItemEvent read FOnAdvancedCustomDrawSubItem write FOnAdvancedCustomDrawSubItem; property OnAdvancedCustomDrawSubItem: TLVAdvancedCustomDrawSubItemEvent read FOnAdvancedCustomDrawSubItem write FOnAdvancedCustomDrawSubItem;
@ -1600,7 +1606,7 @@ type
property LargeImages; property LargeImages;
property MultiSelect; property MultiSelect;
property OwnerData; property OwnerData;
// property OwnerDraw; property OwnerDraw; // should pass OnDrawItem only when ListStyle=vsReport and OwnerDraw=True
property ParentColor default False; property ParentColor default False;
property ParentFont; property ParentFont;
property ParentShowHint; property ParentShowHint;
@ -1641,6 +1647,7 @@ type
property OnDeletion; property OnDeletion;
property OnDragDrop; property OnDragDrop;
property OnDragOver; property OnDragOver;
property OnDrawItem;
property OnEdited; property OnEdited;
property OnEditing; property OnEditing;
property OnEndDock; property OnEndDock;

View File

@ -368,6 +368,47 @@ begin
end; end;
end; end;
procedure TCustomListView.DrawItem(AItem: TListItem; ARect: TRect;
AState: TOwnerDrawState);
begin
if Assigned(FOnDrawItem) then FOnDrawItem(Self, AItem, ARect, AState)
else
begin
FCanvas.FillRect(ARect);
FCanvas.TextOut(ARect.Left + 2, ARect.Top, AItem.Caption);
end;
end;
procedure TCustomListView.CNDrawItem(var Message: TLMDrawListItem);
var
State: TOwnerDrawState;
SaveIndex: Integer;
begin
if Assigned(FCanvas) then
begin
with Message.DrawListItemStruct^ do
begin
State := ItemState;
SaveIndex := SaveDC(DC);
FCanvas.Lock;
try
FCanvas.Handle := DC;
FCanvas.Font := Font;
FCanvas.Brush := Brush;
if itemID = DWORD(-1) then
FCanvas.FillRect(Area)
else
DrawItem(Items[itemID], Area, State);
finally
FCanvas.Handle := 0;
FCanvas.Unlock;
RestoreDC(DC, SaveIndex);
end;
end;
Message.Result := 1;
end;
end;
procedure TCustomListView.InvalidateSelected; procedure TCustomListView.InvalidateSelected;
begin begin
FSelected:=nil; FSelected:=nil;
@ -787,7 +828,7 @@ end;
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
{ TCustomListView SetViewStyle } { TCustomListView SetViewStyle }
{------------------------------------------------------------------------------} {------------------------------------------------------------------------------}
procedure TCustomListView.SetViewStyle(const AValue: TViewStyle); procedure TCustomListView.SetViewStyle(const Avalue: TViewStyle);
begin begin
if FViewStyle = AValue then Exit; if FViewStyle = AValue then Exit;
FViewStyle := AValue; FViewStyle := AValue;
@ -1123,7 +1164,7 @@ begin
Result := TWSCustomListViewClass(WidgetSetClass).GetHitTestInfoAt( Self, X, Y ); Result := TWSCustomListViewClass(WidgetSetClass).GetHitTestInfoAt( Self, X, Y );
end; end;
function TCustomListView.GetItemAt(x,y: Integer): TListItem; function TCustomListView.GetItemAt(x, y: integer): TListItem;
var var
Item: Integer; Item: Integer;
begin begin