MG: TListView now works handleless and SetSelection implemented

git-svn-id: trunk@3312 -
This commit is contained in:
lazarus 2002-09-10 10:00:27 +00:00
parent 385cd1efb4
commit fc518c76b8
3 changed files with 72 additions and 27 deletions

View File

@ -253,6 +253,9 @@ type
TLVColumnClickEvent = procedure(Sender: TObject; Column: TListColumn) of object;
TLVColumnRClickEvent = procedure(Sender: TObject; Column: TListColumn; Point: TPoint) of object;
TLVSelectItemEvent = procedure(Sender: TObject; Item: TListItem; Selected: Boolean) of object;
TListViewState = (lvMultiSelect, lvUpdateNeeded);
TListViewStates = set of TListViewState;
TCustomListView = class(TWinControl)
private
@ -265,7 +268,6 @@ type
FViewStyle : TViewStyle;
FSortType: TSortType;
FSortColumn : Integer;
FMultiSelect: Boolean;
FImageChangeLink : TChangeLink;
FScrollBars: TScrollStyle;
FScrolledLeft: integer; // horizontal scrolled pixels (hidden pixels at top)
@ -274,10 +276,11 @@ type
FLastHorzScrollInfo: TScrollInfo;
FLastVertScrollInfo: TScrollInfo;
FUpdateCount: integer;
FUpdateNeeded: boolean;
FOnChange: TLVChangeEvent;
FOnColumnClick: TLVColumnClickEvent;
FOnSelectItem: TLVSelectItemEvent;
FStates: TListViewStates;
function GetMultiSelect: Boolean;
function GetSelection: TListItem;
procedure SetColumns(const AValue: TListColumns);
procedure SetDefaultItemHeight(AValue: integer);
@ -296,6 +299,7 @@ type
procedure DoUpdate;
protected
ParentWindow : TScrolledWindow;
procedure InitializeWnd; override;
procedure Change(AItem: TListItem; AChange: Integer); dynamic;
procedure ColClick(AColumn: TListColumn); dynamic;
procedure Delete(Item : TListItem);
@ -316,7 +320,7 @@ type
property DefaultItemHeight: integer read FDefItemHeight write SetDefaultItemHeight;
// property HideSelection: Boolean read FHideSelection write SetHideSelection default True;
property Items: TListItems read FListItems write SetItems;
property MultiSelect: Boolean read FMultiSelect write SetMultiSelect default False;
property MultiSelect: Boolean read GetMultiSelect write SetMultiSelect default False;
// property ReadOnly: Boolean read FReadOnly write SetReadOnly;
// property RowSelect: Boolean read FRowSelect write SetRowSelect default False;
property ScrolledLeft: integer read FScrolledLeft write SetScrolledLeft;
@ -1594,6 +1598,9 @@ end.
{ =============================================================================
$Log$
Revision 1.43 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.42 2002/09/10 06:49:18 lazarus
MG: scrollingwincontrol from Andrew

View File

@ -13,9 +13,9 @@
* *
*****************************************************************************
}
{------------------------------------------------------------------------------}
{ TCustomListView Constructor }
{------------------------------------------------------------------------------}
{------------------------------------------------------------------------------
TCustomListView Constructor
------------------------------------------------------------------------------}
constructor TCustomListView.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
@ -40,7 +40,7 @@ end;
{------------------------------------------------------------------------------}
Procedure TCustomListView.ColumnsChanged;
Begin
FUpdateNeeded:=true;
Include(FStates,lvUpdateNeeded);
DoUpdate;
end;
@ -137,16 +137,25 @@ end;
procedure TCustomListView.DoUpdate;
begin
if FUpdateCount>0 then exit;
if not FUpdateNeeded then exit;
FUpdateNeeded:=false;
if not (lvUpdateNeeded in FStates) then exit;
if csDestroying in Componentstate Then Exit;
//TODO: Optimize implementation by invoking individual upadates instead of
// recreating window
//notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
Exclude(FStates,lvUpdateNeeded);
RecreateWnd;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
procedure TCustomListView.InitializeWnd;
begin
inherited InitializeWnd;
CNSendMessage(LM_SETPROPERTIES,self,nil);
if FSelected<>nil then
CNSendMessage(LM_LV_SELECTITEM,self,FSelected);
end;
{------------------------------------------------------------------------------}
{ TCustomListView DoSelectItem }
{------------------------------------------------------------------------------}
@ -162,10 +171,12 @@ Procedure TCustomListView.ItemChanged(Index : Integer); //called by TListItems
Begin
if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then
FUpdateNeeded:=true
else
Include(FStates,lvUpdateNeeded)
else begin
//notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_CHANGEITEM,self,@Index);
end;
End;
{------------------------------------------------------------------------------}
@ -175,23 +186,27 @@ Procedure TCustomListView.ItemDeleted(Index : Integer); //called by TListItems
Begin
if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then
FUpdateNeeded:=true
else
Include(FStates,lvUpdateNeeded)
else begin
//notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_DELETEITEM,self,@Index);
end;
End;
{------------------------------------------------------------------------------}
{ TCustomListView ItemAdded }
{ TCustomListView ItemAdded }
{------------------------------------------------------------------------------}
Procedure TCustomListView.ItemAdded;
Begin
if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then
FUpdateNeeded:=true
else
Include(FStates,lvUpdateNeeded)
else begin
//notify the interface....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_ADDITEM,self,nil);
end;
End;
{------------------------------------------------------------------------------}
@ -230,6 +245,7 @@ procedure TCustomListView.SetViewStyle(const AValue: TViewStyle);
begin
if FViewStyle = AValue then Exit;
FViewStyle := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
@ -241,6 +257,7 @@ procedure TCustomListView.SetSortType(const AValue: TSortType);
begin
if FSortType = AValue then Exit;
FSortType := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
@ -251,6 +268,7 @@ procedure TCustomListView.SetSortColumn(const AValue : Integer);
begin
if FSortColumn = AValue then Exit;
FSortColumn := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
@ -289,6 +307,11 @@ begin
DoUpdate;
end;
function TCustomListView.GetMultiSelect: Boolean;
begin
Result:=lvMultiSelect in FStates;
end;
{------------------------------------------------------------------------------}
{ TCustomListView GetSelection }
{------------------------------------------------------------------------------}
@ -303,19 +326,24 @@ end;
procedure TCustomListView.SetSelection(const AValue: TListItem);
begin
if FSelected=AValue then exit;
// ToDo: send message to interface
//FSelected := AValue;
FSelected := AValue;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_LV_SELECTITEM,self,FSelected);
//DoSelectItem(FSelected, True);
end;
procedure TCustomListView.SetMultiSelect(const AValue: Boolean);
begin
if FMultiSelect <> AValue then
Begin
FMultiSelect := AValue;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
if MultiSelect <> AValue then
Begin
if AValue then
Include(FStates,lvMultiSelect)
else
Exclude(FStates,lvMultiSelect);
if (not HandleAllocated) or (csLoading in ComponentState) then
Include(FStates,lvUpdateNeeded);
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
end;
procedure TCustomListView.SetSmallImages(const AValue: TCustomImageList);
@ -332,6 +360,7 @@ begin
FSmallImages.RegisterChanges(FImageChangeLink);
FSmallImages.FreeNotification(self);
end;
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
end;
@ -340,10 +369,12 @@ Procedure TCustomListView.ImageChanged(Sender : TObject);
begin
if csDestroying in Componentstate Then Exit;
if FUpdateCount>0 then
FUpdateNeeded:=true
else
Include(FStates,lvUpdateNeeded)
else begin
//image changed so redraw it all....
if (not HandleAllocated) or (csLoading in ComponentState) then exit;
CNSendMessage(LM_SETPROPERTIES,self,nil);
end;
end;
procedure TCustomListView.SetScrollBars(const Value: TScrollStyle);
@ -383,7 +414,7 @@ procedure TCustomListView.UpdateScrollbars;
var
ScrollInfo: TScrollInfo;
begin
writeln('TODO: TCustomListView.UpdateScrollbars');
writeln('TODO: TCustomListView.UpdateScrollbars');
exit;
if not HandleAllocated then exit
@ -497,6 +528,9 @@ end;
{ =============================================================================
$Log$
Revision 1.21 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.20 2002/08/28 10:44:45 lazarus
MG: implemented run param environment variables

View File

@ -126,6 +126,7 @@ const
LM_LV_ADDITEM = LM_LV_FIRST+1;
LM_LV_CHANGEITEM = LM_LV_FIRST+2;
LM_LV_DELETEITEM = LM_LV_FIRST+3;
LM_LV_SELECTITEM = LM_LV_FIRST+4;
LM_LV_LAST = LM_LV_FIRST+9; // LM_COMUSER+89
// TComboBox
@ -847,6 +848,9 @@ end.
{
$Log$
Revision 1.31 2002/09/10 10:00:27 lazarus
MG: TListView now works handleless and SetSelection implemented
Revision 1.30 2002/09/04 09:32:17 lazarus
MG: improved streaming error handling