You've already forked lazarus-ccr
* 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:
@ -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
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user