* Allow custom menu items in VTHeaderPopupMenu

* Dont show column images in VTHeaderPopupMenu since it will hide the checkmark

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@3421 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
blikblum
2014-08-04 02:51:22 +00:00
parent f0b57845bb
commit 3d82a35d56
2 changed files with 60 additions and 76 deletions

View File

@ -58,18 +58,15 @@ unit VTHeaderPopup;
// //
// Modified 17 Feb 2002 by Jim Kueneman <jimdk@mindspring.com>. // Modified 17 Feb 2002 by Jim Kueneman <jimdk@mindspring.com>.
// - Added the event to filter the items as they are added to the menu. // - Added the event to filter the items as they are added to the menu.
// 2014
// - Adapted and improved for LCL by Luiz Américo Pereira Câmara
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
{$mode delphi} {$mode delphi}
interface interface
uses uses
{$ifdef TNT} Menus, VirtualTrees;
TntMenus,
{$else}
Menus,
{$endif TNT}
VirtualTrees;
type type
TVTHeaderPopupOption = ( TVTHeaderPopupOption = (
@ -88,22 +85,11 @@ type
var Cmd: TAddPopupItemType) of object; var Cmd: TAddPopupItemType) of object;
TColumnChangeEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; Visible: Boolean) of object; TColumnChangeEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; Visible: Boolean) of object;
{$ifdef TNT}
TVTMenuItem = TTntMenuItem;
{$else}
TVTMenuItem = TMenuItem;
{$endif}
{$ifdef TNT}
TVTHeaderPopupMenu = class(TTntPopupMenu)
{$else}
TVTHeaderPopupMenu = class(TPopupMenu) TVTHeaderPopupMenu = class(TPopupMenu)
{$endif}
private private
FOptions: TVTHeaderPopupOptions;
FOnAddHeaderPopupItem: TAddHeaderPopupItemEvent; FOnAddHeaderPopupItem: TAddHeaderPopupItemEvent;
FOnColumnChange: TColumnChangeEvent; FOnColumnChange: TColumnChangeEvent;
FOptions: TVTHeaderPopupOptions;
protected protected
procedure DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); virtual; procedure DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); virtual;
procedure DoColumnChange(Column: TColumnIndex; Visible: Boolean); virtual; procedure DoColumnChange(Column: TColumnIndex; Visible: Boolean); virtual;
@ -122,14 +108,12 @@ type
implementation implementation
uses uses
{$ifdef TNT} Classes;
TnTClasses
{$else}
Classes
{$endif TNT};
type type
TVirtualTreeCast = class(TBaseVirtualTree); // Necessary to make the header accessible. TVirtualTreeCast = class(TBaseVirtualTree); // Necessary to make the header accessible.
TVTMenuItem = class(TMenuItem)
end;
//----------------- TVTHeaderPopupMenu --------------------------------------------------------------------------------- //----------------- TVTHeaderPopupMenu ---------------------------------------------------------------------------------
@ -155,7 +139,8 @@ end;
procedure TVTHeaderPopupMenu.OnMenuItemClick(Sender: TObject); procedure TVTHeaderPopupMenu.OnMenuItemClick(Sender: TObject);
begin begin
if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then if PopupComponent is TBaseVirtualTree then
begin
with TVTMenuItem(Sender), with TVTMenuItem(Sender),
TVirtualTreeCast(PopupComponent).Header.Columns.Items[Tag] do TVirtualTreeCast(PopupComponent).Header.Columns.Items[Tag] do
begin begin
@ -167,13 +152,13 @@ begin
DoColumnChange(TVTMenuItem(Sender).Tag, not Checked); DoColumnChange(TVTMenuItem(Sender).Tag, not Checked);
end; end;
end; end;
end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
procedure TVTHeaderPopupMenu.Popup(x, y: Integer); procedure TVTHeaderPopupMenu.Popup(x, y: Integer);
var var
I: Integer;
ColPos: TColumnPosition; ColPos: TColumnPosition;
ColIdx: TColumnIndex; ColIdx: TColumnIndex;
@ -183,27 +168,35 @@ var
VisibleCounter: Cardinal; VisibleCounter: Cardinal;
VisibleItem: TVTMenuItem; VisibleItem: TVTMenuItem;
CurrentMenuItem: TMenuItem;
begin begin
if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then if PopupComponent is TBaseVirtualTree then
begin begin
// Delete existing menu items. // Delete existing VT menu items. Keep normal ones
I := Items.Count; while Items.Count > 0 do
while I > 0 do
begin begin
Dec(I); CurrentMenuItem := Items[Items.Count - 1];
Items[I].Free; if CurrentMenuItem is TVTMenuItem then
CurrentMenuItem.Free
else
break;
end; end;
// Add column menu items. // Add column menu items.
with TVirtualTreeCast(PopupComponent).Header do with TVirtualTreeCast(PopupComponent).Header do
begin begin
if hoShowImages in Options then if Columns.Count = 0 then
Self.Images := Images Exit;
else
// Remove a possible reference to image list of another tree previously assigned.
Self.Images := nil;
VisibleItem := nil; VisibleItem := nil;
VisibleCounter := 0; VisibleCounter := 0;
//add separator if necessary
if Items.Count > 0 then
begin
NewMenuItem := TVTMenuItem.Create(Self);
NewMenuItem.Caption := cLineCaption;
Items.Add(NewMenuItem);
end;
for ColPos := 0 to Columns.Count - 1 do for ColPos := 0 to Columns.Count - 1 do
begin begin
if poOriginalOrder in FOptions then if poOriginalOrder in FOptions then
@ -222,7 +215,6 @@ begin
NewMenuItem.Tag := ColIdx; NewMenuItem.Tag := ColIdx;
NewMenuItem.Caption := Text; NewMenuItem.Caption := Text;
NewMenuItem.Hint := Hint; NewMenuItem.Hint := Hint;
NewMenuItem.ImageIndex := ImageIndex;
NewMenuItem.Checked := coVisible in Options; NewMenuItem.Checked := coVisible in Options;
NewMenuItem.OnClick := OnMenuItemClick; NewMenuItem.OnClick := OnMenuItemClick;
if Cmd = apDisabled then if Cmd = apDisabled then

View File

@ -58,18 +58,15 @@ unit VTHeaderPopup;
// //
// Modified 17 Feb 2002 by Jim Kueneman <jimdk@mindspring.com>. // Modified 17 Feb 2002 by Jim Kueneman <jimdk@mindspring.com>.
// - Added the event to filter the items as they are added to the menu. // - Added the event to filter the items as they are added to the menu.
// 2014
// - Adapted and improved for LCL by Luiz Américo Pereira Câmara
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
{$mode delphi} {$mode delphi}
interface interface
uses uses
{$ifdef TNT} Menus, VirtualTrees;
TntMenus,
{$else}
Menus,
{$endif TNT}
VirtualTrees;
type type
TVTHeaderPopupOption = ( TVTHeaderPopupOption = (
@ -88,22 +85,11 @@ type
var Cmd: TAddPopupItemType) of object; var Cmd: TAddPopupItemType) of object;
TColumnChangeEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; Visible: Boolean) of object; TColumnChangeEvent = procedure(const Sender: TBaseVirtualTree; const Column: TColumnIndex; Visible: Boolean) of object;
{$ifdef TNT}
TVTMenuItem = TTntMenuItem;
{$else}
TVTMenuItem = TMenuItem;
{$endif}
{$ifdef TNT}
TVTHeaderPopupMenu = class(TTntPopupMenu)
{$else}
TVTHeaderPopupMenu = class(TPopupMenu) TVTHeaderPopupMenu = class(TPopupMenu)
{$endif}
private private
FOptions: TVTHeaderPopupOptions;
FOnAddHeaderPopupItem: TAddHeaderPopupItemEvent; FOnAddHeaderPopupItem: TAddHeaderPopupItemEvent;
FOnColumnChange: TColumnChangeEvent; FOnColumnChange: TColumnChangeEvent;
FOptions: TVTHeaderPopupOptions;
protected protected
procedure DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); virtual; procedure DoAddHeaderPopupItem(const Column: TColumnIndex; out Cmd: TAddPopupItemType); virtual;
procedure DoColumnChange(Column: TColumnIndex; Visible: Boolean); virtual; procedure DoColumnChange(Column: TColumnIndex; Visible: Boolean); virtual;
@ -122,14 +108,12 @@ type
implementation implementation
uses uses
{$ifdef TNT} Classes;
TnTClasses
{$else}
Classes
{$endif TNT};
type type
TVirtualTreeCast = class(TBaseVirtualTree); // Necessary to make the header accessible. TVirtualTreeCast = class(TBaseVirtualTree); // Necessary to make the header accessible.
TVTMenuItem = class(TMenuItem)
end;
//----------------- TVTHeaderPopupMenu --------------------------------------------------------------------------------- //----------------- TVTHeaderPopupMenu ---------------------------------------------------------------------------------
@ -155,7 +139,8 @@ end;
procedure TVTHeaderPopupMenu.OnMenuItemClick(Sender: TObject); procedure TVTHeaderPopupMenu.OnMenuItemClick(Sender: TObject);
begin begin
if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then if PopupComponent is TBaseVirtualTree then
begin
with TVTMenuItem(Sender), with TVTMenuItem(Sender),
TVirtualTreeCast(PopupComponent).Header.Columns.Items[Tag] do TVirtualTreeCast(PopupComponent).Header.Columns.Items[Tag] do
begin begin
@ -167,13 +152,13 @@ begin
DoColumnChange(TVTMenuItem(Sender).Tag, not Checked); DoColumnChange(TVTMenuItem(Sender).Tag, not Checked);
end; end;
end; end;
end;
//---------------------------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------------------------
procedure TVTHeaderPopupMenu.Popup(x, y: Integer); procedure TVTHeaderPopupMenu.Popup(x, y: Integer);
var var
I: Integer;
ColPos: TColumnPosition; ColPos: TColumnPosition;
ColIdx: TColumnIndex; ColIdx: TColumnIndex;
@ -183,27 +168,35 @@ var
VisibleCounter: Cardinal; VisibleCounter: Cardinal;
VisibleItem: TVTMenuItem; VisibleItem: TVTMenuItem;
CurrentMenuItem: TMenuItem;
begin begin
if Assigned(PopupComponent) and (PopupComponent is TBaseVirtualTree) then if PopupComponent is TBaseVirtualTree then
begin begin
// Delete existing menu items. // Delete existing VT menu items. Keep normal ones
I := Items.Count; while Items.Count > 0 do
while I > 0 do
begin begin
Dec(I); CurrentMenuItem := Items[Items.Count - 1];
Items[I].Free; if CurrentMenuItem is TVTMenuItem then
CurrentMenuItem.Free
else
break;
end; end;
// Add column menu items. // Add column menu items.
with TVirtualTreeCast(PopupComponent).Header do with TVirtualTreeCast(PopupComponent).Header do
begin begin
if hoShowImages in Options then if Columns.Count = 0 then
Self.Images := Images Exit;
else
// Remove a possible reference to image list of another tree previously assigned.
Self.Images := nil;
VisibleItem := nil; VisibleItem := nil;
VisibleCounter := 0; VisibleCounter := 0;
//add separator if necessary
if Items.Count > 0 then
begin
NewMenuItem := TVTMenuItem.Create(Self);
NewMenuItem.Caption := cLineCaption;
Items.Add(NewMenuItem);
end;
for ColPos := 0 to Columns.Count - 1 do for ColPos := 0 to Columns.Count - 1 do
begin begin
if poOriginalOrder in FOptions then if poOriginalOrder in FOptions then
@ -222,7 +215,6 @@ begin
NewMenuItem.Tag := ColIdx; NewMenuItem.Tag := ColIdx;
NewMenuItem.Caption := Text; NewMenuItem.Caption := Text;
NewMenuItem.Hint := Hint; NewMenuItem.Hint := Hint;
NewMenuItem.ImageIndex := ImageIndex;
NewMenuItem.Checked := coVisible in Options; NewMenuItem.Checked := coVisible in Options;
NewMenuItem.OnClick := OnMenuItemClick; NewMenuItem.OnClick := OnMenuItemClick;
if Cmd = apDisabled then if Cmd = apDisabled then