diff --git a/lcl/comctrls.pp b/lcl/comctrls.pp index dbd9569c4b..86d71aa0d8 100644 --- a/lcl/comctrls.pp +++ b/lcl/comctrls.pp @@ -655,6 +655,29 @@ type TDisplayCode = (drBounds, drIcon, drLabel, drSelectBounds); +{ TIconOptions } + + TIconArrangement = (iaTop, iaLeft); + + TIconOptions = class(TPersistent) + private + FListView: TCustomListView; + FArrangement: TIconArrangement; + function GetAutoArrange: Boolean; + function GetWrapText: Boolean; + procedure SetArrangement(Value: TIconArrangement); + procedure SetAutoArrange(Value: Boolean); + procedure SetWrapText(Value: Boolean); + protected + procedure AssignTo(Dest: TPersistent); override; + public + constructor Create(AOwner: TCustomListView); + published + property Arrangement: TIconArrangement read FArrangement write SetArrangement default iaTop; + property AutoArrange: Boolean read GetAutoArrange write SetAutoArrange default False; + property WrapText: Boolean read GetWrapText write SetWrapText default True; + end; + { TListItem } TListItem = class(TPersistent) @@ -930,6 +953,7 @@ type FCanvas: TCanvas; FDefaultItemHeight: integer; FHotTrackStyles: TListHotTrackStyles; + FIconOptions: TIconOptions; FOwnerData: Boolean; FOwnerDataItem: TOwnerDataListItem; FListItems: TListItems; @@ -984,6 +1008,7 @@ type procedure SetFocused(const AValue: TListItem); procedure SetHotTrackStyles(const AValue: TListHotTrackStyles); procedure SetHoverTime(const AValue: Integer); + procedure SetIconOptions(const AValue: TIconOptions); procedure SetImageList(const ALvilOrd: Integer; const AValue: TCustomImageList); procedure SetItems(const AValue : TListItems); procedure SetItemVisible(const AValue: TListItem; const APartialOK: Boolean); @@ -1079,6 +1104,7 @@ type property GridLines: Boolean index Ord(lvpGridLines) read GetProperty write SetProperty default False; property HotTrack: Boolean index Ord(lvpHotTrack) read GetProperty write SetProperty default False; property HotTrackStyles: TListHotTrackStyles read FHotTrackStyles write SetHotTrackStyles default []; + property IconOptions: TIconOptions read FIconOptions write SetIconOptions; property ItemFocused: TListItem read GetFocused write SetFocused; property Items: TListItems read FListItems write SetItems; // MultiSelect and ReadOnly should be protected, but can't because Carbon Interface @@ -1124,6 +1150,7 @@ type // property HotTrack; // property HotTrackStyles; // property HoverTime; + property IconOptions; property Items; property LargeImages; property MultiSelect; diff --git a/lcl/include/customlistview.inc b/lcl/include/customlistview.inc index 48834adaad..8140ba8ea0 100644 --- a/lcl/include/customlistview.inc +++ b/lcl/include/customlistview.inc @@ -13,6 +13,60 @@ * * ***************************************************************************** } + +{ TIconOptions } + +procedure TIconOptions.SetArrangement(Value: TIconArrangement); +begin + if FArrangement <> Value then + begin + FArrangement := Value; + if FListView.HandleAllocated then + TWSCustomListViewClass(FListView.WidgetSetClass).SetIconArrangement(FListView, Arrangement); + end; +end; + +function TIconOptions.GetAutoArrange: Boolean; +begin + Result := FListView.GetProperty(Ord(lvpAutoArrange)); +end; + +function TIconOptions.GetWrapText: Boolean; +begin + Result := FListView.GetProperty(Ord(lvpWrapText)); +end; + +procedure TIconOptions.SetAutoArrange(Value: Boolean); +begin + FListView.SetProperty(Ord(lvpAutoArrange), Value); +end; + +procedure TIconOptions.SetWrapText(Value: Boolean); +begin + FListView.SetProperty(Ord(lvpWrapText), Value); +end; + +procedure TIconOptions.AssignTo(Dest: TPersistent); +var + DestOptions: TIconOptions absolute Dest; +begin + if Dest is TIconOptions then + begin + DestOptions.Arrangement := Arrangement; + DestOptions.AutoArrange := AutoArrange; + DestOptions.WrapText := WrapText; + end + else + inherited AssignTo(Dest); +end; + +constructor TIconOptions.Create(AOwner: TCustomListView); +begin + inherited Create; + FListView := AOwner; + FArrangement := iaTop; +end; + {------------------------------------------------------------------------------ TCustomListView Constructor ------------------------------------------------------------------------------} @@ -22,8 +76,9 @@ var begin inherited Create(AOwner); ControlStyle := ControlStyle - [csCaptureMouse]; - FColumns := TListColumns.Create(self); - FListItems := TListItems.Create(self); + FIconOptions := TIconOptions.Create(Self); + FColumns := TListColumns.Create(Self); + FListItems := TListItems.Create(Self); BorderStyle := bsSingle; FScrollBars := ssBoth; FCompStyle := csListView; @@ -42,7 +97,7 @@ begin Color := clWindow; FCanvas := TControlCanvas.Create; TControlCanvas(FCanvas).Control := Self; - FProperties := [lvpColumnClick, lvpHideSelection, lvpShowColumnHeaders, lvpToolTips]; + FProperties := [lvpColumnClick, lvpHideSelection, lvpShowColumnHeaders, lvpToolTips, lvpWrapText]; FOwnerDataItem := TOwnerDataListItem.Create(FListItems); end; @@ -569,6 +624,7 @@ begin FreeAndNil(FImageChangeLinks[lvil]); FreeAndNil(FOwnerDataItem); FreeAndNil(FListItems); + FreeAndNil(FIconOptions); end; {------------------------------------------------------------------------------ @@ -814,6 +870,11 @@ begin TWSCustomListViewClass(WidgetSetClass).SetHoverTime(Self, FHoverTime); end; +procedure TCustomListView.SetIconOptions(const AValue: TIconOptions); +begin + FIconOptions.Assign(AValue); +end; + procedure TCustomListView.SetImageList(const ALvilOrd: Integer; const AValue: TCustomImageList); var lvil: TListViewImageList; diff --git a/lcl/interfaces/win32/win32wscomctrls.pp b/lcl/interfaces/win32/win32wscomctrls.pp index 48ee3e9e1d..3b0a5e6b9e 100644 --- a/lcl/interfaces/win32/win32wscomctrls.pp +++ b/lcl/interfaces/win32/win32wscomctrls.pp @@ -136,7 +136,7 @@ type class procedure SetFont(const AWinControl: TWinControl; const AFont: TFont); override; class procedure SetHotTrackStyles(const ALV: TCustomListView; const AValue: TListHotTrackStyles); override; class procedure SetHoverTime(const ALV: TCustomListView; const AValue: Integer); override; -// class procedure SetIconOptions(const ALV: TCustomListView; const AValue: TIconOptions); override; + class procedure SetIconArrangement(const ALV: TCustomListView; const AValue: TIconArrangement); override; class procedure SetImageList(const ALV: TCustomListView; const AList: TListViewImageList; const AValue: TCustomImageList); override; class procedure SetItemsCount(const ALV: TCustomListView; const AValue: Integer); override; class procedure SetOwnerData(const ALV: TCustomListView; const AValue: Boolean); override; diff --git a/lcl/interfaces/win32/win32wscustomlistview.inc b/lcl/interfaces/win32/win32wscustomlistview.inc index 3fd36b0ffa..de14f774b4 100644 --- a/lcl/interfaces/win32/win32wscustomlistview.inc +++ b/lcl/interfaces/win32/win32wscustomlistview.inc @@ -477,6 +477,7 @@ class function TWin32WSCustomListView.CreateHandle(const AWinControl: TWinContro const AParams: TCreateParams): HWND; const LISTVIEWSTYLES: array[TViewStyle] of DWORD = (LVS_ICON, LVS_SMALLICON, LVS_LIST, LVS_REPORT); + Arrangement: array[TIconArrangement] of DWord = (LVS_ALIGNTOP, LVS_ALIGNLEFT); var Params: TCreateWindowExParams; begin @@ -487,7 +488,9 @@ begin begin pClassName := WC_LISTVIEW; WindowTitle := StrCaption; - Flags := Flags or LISTVIEWSTYLES[TListView(AWinControl).ViewStyle] or LVS_SINGLESEL or LVS_SHAREIMAGELISTS; + Flags := Flags or LISTVIEWSTYLES[TListView(AWinControl).ViewStyle] or + LVS_SINGLESEL or LVS_SHAREIMAGELISTS or + Arrangement[TListView(AWinControl).IconOptions.Arrangement]; if TCustomListView(AWinControl).OwnerData then Flags := Flags or LVS_OWNERDATA; if TCustomListView(AWinControl).BorderStyle = bsSingle then @@ -746,6 +749,21 @@ begin SendMessage(ALV.Handle, LVM_SETHOVERTIME, 0, AValue); end; +class procedure TWin32WSCustomListView.SetIconArrangement( + const ALV: TCustomListView; const AValue: TIconArrangement); +const + ArrangementMap: array[TIconArrangement] of DWord = ( + { iaTop } LVS_ALIGNTOP, + { iaLeft } LVS_ALIGNLEFT + ); +begin + if not WSCheckHandleAllocated(ALV, 'SetIconArrangement') + then Exit; + + // LVM_ALIGN styles are not implemented in windows (according to w7 sdk) => change style + UpdateStyle(ALV.Handle, LVS_ALIGNMASK, ArrangementMap[AValue]); +end; + class procedure TWin32WSCustomListView.SetImageList(const ALV: TCustomListView; const AList: TListViewImageList; const AValue: TCustomImageList); const LIST_MAP: array[TListViewImageList] of WPARAM = ( diff --git a/lcl/widgetset/wscomctrls.pp b/lcl/widgetset/wscomctrls.pp index f35d32c50b..68a07382b4 100644 --- a/lcl/widgetset/wscomctrls.pp +++ b/lcl/widgetset/wscomctrls.pp @@ -128,7 +128,7 @@ type class procedure SetDefaultItemHeight(const ALV: TCustomListView; const AValue: Integer); virtual; class procedure SetHotTrackStyles(const ALV: TCustomListView; const AValue: TListHotTrackStyles); virtual; class procedure SetHoverTime(const ALV: TCustomListView; const AValue: Integer); virtual; -// class procedure SetIconOptions(const ALV: TCustomListView; const AValue: TIconOptions); virtual; + class procedure SetIconArrangement(const ALV: TCustomListView; const AValue: TIconArrangement); virtual; class procedure SetImageList(const ALV: TCustomListView; const AList: TListViewImageList; const AValue: TCustomImageList); virtual; class procedure SetItemsCount(const ALV: TCustomListView; const Avalue: Integer); virtual; class procedure SetOwnerData(const ALV: TCustomListView; const AValue: Boolean); virtual; @@ -454,6 +454,11 @@ class procedure TWSCustomListView.SetHoverTime(const ALV: TCustomListView; const begin end; +class procedure TWSCustomListView.SetIconArrangement( + const ALV: TCustomListView; const AValue: TIconArrangement); +begin +end; + class procedure TWSCustomListView.SetImageList(const ALV: TCustomListView; const AList: TListViewImageList; const AValue: TCustomImageList); begin end;