git-svn-id: https://192.168.0.254/svn/Componentes.Terceros.DevExpressVCL@38 05c56307-c608-d34a-929d-697000501d7a
375 lines
12 KiB
ObjectPascal
375 lines
12 KiB
ObjectPascal
{********************************************************************}
|
|
{ }
|
|
{ Developer Express Visual Component Library }
|
|
{ ExpressQuantumGrid Utils }
|
|
{ }
|
|
{ Copyright (c) 1998-2009 Developer Express Inc. }
|
|
{ ALL RIGHTS RESERVED }
|
|
{ }
|
|
{ The entire contents of this file is protected by U.S. and }
|
|
{ International Copyright Laws. Unauthorized reproduction, }
|
|
{ reverse-engineering, and distribution of all or any portion of }
|
|
{ the code contained in this file is strictly prohibited and may }
|
|
{ result in severe civil and criminal penalties and will be }
|
|
{ prosecuted to the maximum extent possible under the law. }
|
|
{ }
|
|
{ RESTRICTIONS }
|
|
{ }
|
|
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
|
|
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
|
|
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
|
|
{ LICENSED TO DISTRIBUTE THE EXPRESSQUANTUMGRID AND ALL }
|
|
{ ACCOMPANYING VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
|
|
{ }
|
|
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
|
|
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
|
|
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
|
|
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
|
|
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
|
|
{ }
|
|
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
|
|
{ ADDITIONAL RESTRICTIONS. }
|
|
{ }
|
|
{********************************************************************}
|
|
|
|
unit cxGridFooterPopupMenuItems;
|
|
|
|
{$I cxVer.inc}
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows,
|
|
{$IFDEF DELPHI6}
|
|
Types,
|
|
{$ENDIF}
|
|
Dialogs, Classes, SysUtils, cxGridTableView,
|
|
cxGridCustomPopupMenu, cxGridMenuOperations, cxCustomData;
|
|
type
|
|
|
|
TcxGridFooterPopupMenuOperation = class(TcxGridTablePopupMenuOperation)
|
|
public
|
|
class function GetPopupMenuClass: TcxPopupMenuClass; override;
|
|
end;
|
|
|
|
TcxGridFooterMenuItem = class(TcxGridFooterPopupMenuOperation)
|
|
private
|
|
function GetKind: TcxSummaryKind;
|
|
function GetGroupSummaryItemsByGroupedColumn: TcxDataSummaryItems;
|
|
procedure AddSummaryItem(ASummaryItems: TcxDataSummaryItems);
|
|
protected
|
|
procedure DoFooter(Sender: TObject); virtual;
|
|
function GetDown: Boolean; override;
|
|
function GetEnabled: Boolean; override;
|
|
end;
|
|
|
|
TcxGridSumMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
TcxGridMinMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
TcxGridMaxMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
TcxGridCountMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
TcxGridAvgMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
TcxGridNoneMenuItem = class(TcxGridFooterMenuItem)
|
|
public
|
|
constructor Create(const AMenuItem: TComponent); override;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
Controls, cxGridPopupMenu, cxGridDBTableView, DB, cxDBData,
|
|
cxGridCustomTableView, cxGridDBDataDefinitions, cxGridStdPopupMenu,
|
|
cxGridCustomView, cxLookupEdit, cxClasses, cxGridPopupMenuConsts,
|
|
cxDataStorage;
|
|
|
|
const
|
|
AImageName = 'FtrImg';
|
|
|
|
{ TcxGridFooterPopupMenuOperation }
|
|
|
|
class function TcxGridFooterPopupMenuOperation.GetPopupMenuClass: TcxPopupMenuClass;
|
|
begin
|
|
Result := TcxGridStdFooterMenu;
|
|
end;
|
|
|
|
{ TcxGridFooterMenuItem }
|
|
|
|
procedure TcxGridFooterMenuItem.DoFooter(Sender: TObject);
|
|
var
|
|
AHitType: TcxGridViewHitType;
|
|
ASummary: TcxDataSummary;
|
|
ASummaryItems: TcxDataSummaryItems;
|
|
begin
|
|
ASummary := GridPopupMenu.HitGridView.DataController.Summary;
|
|
AHitType := GridPopupMenu.HitType;
|
|
try
|
|
ASummary.BeginUpdate;
|
|
case AHitType of
|
|
gvhtFooterCell:
|
|
AddSummaryItem(ASummary.FooterSummaryItems);
|
|
gvhtGroupFooterCell:
|
|
begin
|
|
ASummaryItems := GetGroupSummaryItemsByGroupedColumn;
|
|
if not Assigned(ASummaryItems) then
|
|
ASummaryItems := ASummary.DefaultGroupSummaryItems;
|
|
AddSummaryItem(ASummaryItems);
|
|
end;
|
|
end;
|
|
finally
|
|
ASummary.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TcxGridFooterMenuItem.AddSummaryItem(ASummaryItems: TcxDataSummaryItems);
|
|
var
|
|
AItem: TcxDataSummaryItem;
|
|
|
|
function AddItem(ASummaryItems: TcxDataSummaryItems): TcxDataSummaryItem;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
for I := 0 to ASummaryItems.Count - 1 do
|
|
begin
|
|
Result := ASummaryItems[I];
|
|
if (Result.ItemLink = HitColumn) and (Result.Position = spFooter) then
|
|
Exit;
|
|
end;
|
|
if GetKind <> skNone then
|
|
begin
|
|
Result := ASummaryItems.Add;
|
|
Result.ItemLink := HitColumn;
|
|
Result.Position := spFooter;
|
|
end
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
begin
|
|
AItem := AddItem(ASummaryItems);
|
|
if AItem <> nil then
|
|
if (GetKind = skNone) and (AItem.Format = '') then
|
|
AItem.Free
|
|
else
|
|
begin
|
|
AItem.Kind := GetKind;
|
|
Params.Add(AItem);
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterMenuItem.GetDown: Boolean;
|
|
|
|
function GetDownBySummaryItems(ASummaryItems: TcxDataSummaryItems): Boolean;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
Result := False or (GetKind = skNone);
|
|
for I := 0 to ASummaryItems.Count - 1 do
|
|
If ASummaryItems[I].ItemLink = HitColumn then
|
|
begin
|
|
Result := False;
|
|
if (ASummaryItems[I].Kind = GetKind) and
|
|
(ASummaryItems[I].Position = spFooter) then
|
|
begin
|
|
Result := True;
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
AHitType: TcxGridViewHitType;
|
|
ASummary: TcxDataSummary;
|
|
ASummaryItems: TcxDataSummaryItems;
|
|
begin
|
|
AHitType := GridPopupMenu.HitType;
|
|
ASummary := GridPopupMenu.HitGridView.DataController.Summary;
|
|
case AHitType of
|
|
gvhtFooterCell:
|
|
Result := GetDownBySummaryItems(ASummary.FooterSummaryItems);
|
|
gvhtGroupFooterCell:
|
|
begin
|
|
ASummaryItems := GetGroupSummaryItemsByGroupedColumn;
|
|
if not Assigned(ASummaryItems) then
|
|
ASummaryItems := ASummary.DefaultGroupSummaryItems;
|
|
Result := GetDownBySummaryItems(ASummaryItems);
|
|
end
|
|
else
|
|
Result := False;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterMenuItem.GetEnabled: Boolean;
|
|
const
|
|
NumberFieldTypes =
|
|
[varSmallint, varInteger, varSmallint, varSingle, varByte,
|
|
varDouble, varCurrency, varDate
|
|
{$IFDEF DELPHI6}, varLongWord, varWord, varInt64, varShortInt{$ENDIF}];
|
|
TimeFieldTypes = [varDate];
|
|
var
|
|
AVarType: Integer;
|
|
{$IFDEF DELPHI6}
|
|
AFMTBcdValueType: Integer;
|
|
{$ENDIF}
|
|
begin
|
|
Result := HitColumn.DataBinding.ValueTypeClass <> nil;
|
|
if not Result then
|
|
Exit;
|
|
AVarType := HitColumn.DataBinding.ValueTypeClass.GetVarType;
|
|
{$IFDEF DELPHI6}
|
|
AFMTBcdValueType := TcxFMTBcdValueType.GetVarType;
|
|
{$ENDIF}
|
|
Result := {$IFDEF DELPHI6}(AVarType = AFMTBcdValueType) or {$ENDIF}
|
|
(AVarType in NumberFieldTypes);
|
|
if GetKind in [skSum, skAverage] then
|
|
Result := Result and not (AVarType in TimeFieldTypes);
|
|
if GetKind in [skCount, skNone] then Result := True;
|
|
if (HitColumn.PropertiesClass <> nil) and
|
|
(HitColumn.PropertiesClass.InheritsFrom(TcxCustomLookupEditProperties)) or
|
|
((HitColumn.RepositoryItem <> nil) and
|
|
(HitColumn.RepositoryItem.Properties.InheritsFrom(TcxCustomLookupEditProperties))) then
|
|
begin
|
|
if GetKind in [skCount, skNone] then
|
|
Result := True
|
|
else Result := False;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterMenuItem.GetKind: TcxSummaryKind;
|
|
begin
|
|
case Tag of
|
|
0: Result := skSum;
|
|
1: Result := skMin;
|
|
2: Result := skMax;
|
|
3: Result := skCount;
|
|
4: Result := skAverage;
|
|
else
|
|
Result := skNone;
|
|
end;
|
|
end;
|
|
|
|
function TcxGridFooterMenuItem.GetGroupSummaryItemsByGroupedColumn:
|
|
TcxDataSummaryItems;
|
|
var
|
|
ASummary: TcxDataSummary;
|
|
I,J: Integer;
|
|
ALink: TcxDataSummaryGroupItemLink;
|
|
AViewInfo: TcxCustomGridCellViewInfo;
|
|
AColumn: TcxGridColumn;
|
|
ADataControllerGroups: TcxDataControllerGroups;
|
|
begin
|
|
Result := nil;
|
|
AViewInfo := GridPopupMenu.HitTest.ViewInfo;
|
|
ASummary := GridPopupMenu.HitGridView.DataController.Summary;
|
|
ADataControllerGroups := GridPopupMenu.HitGridView.DataController.Groups;
|
|
AColumn := nil;
|
|
if AViewInfo is TcxGridRowFooterCellViewInfo then
|
|
begin
|
|
I := ADataControllerGroups.DataGroupIndexByRowIndex[
|
|
TcxGridRowFooterCellViewInfo(AViewInfo).GridRecord.Index];
|
|
I := ADataControllerGroups.Level[I];
|
|
I := ADataControllerGroups.GroupingItemIndex[I];
|
|
if GridPopupMenu.HitGridView is TcxGridTableView then
|
|
AColumn := TcxGridTableView(GridPopupMenu.HitGridView).Columns[I];
|
|
if Assigned(AColumn) then
|
|
for I := 0 to ASummary.SummaryGroups.Count - 1 do
|
|
for J := 0 to ASummary.SummaryGroups[I].Links.Count - 1 do
|
|
begin
|
|
ALink := ASummary.SummaryGroups[I].Links[J];
|
|
if ALink is TcxGridTableSummaryGroupItemLink then
|
|
if TcxGridTableSummaryGroupItemLink(ALink).Column = AColumn then
|
|
begin
|
|
Result := ASummary.SummaryGroups[I].SummaryItems;
|
|
break;
|
|
end;
|
|
end;
|
|
end
|
|
end;
|
|
|
|
{ TcxGridSumMenuItem }
|
|
|
|
constructor TcxGridSumMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter);
|
|
Tag := 0;
|
|
ResCaption := @cxSGridSumMenuItem;
|
|
end;
|
|
|
|
{ TcxGridMinMenuItem }
|
|
|
|
constructor TcxGridMinMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter);
|
|
Tag := 1;
|
|
ResCaption := @cxSGridMinMenuItem;
|
|
end;
|
|
|
|
{ TcxGridMaxMenuItem }
|
|
|
|
constructor TcxGridMaxMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter);
|
|
Tag := 2;
|
|
ResCaption := @cxSGridMaxMenuItem;
|
|
end;
|
|
|
|
{ TcxGridCountMenuItem }
|
|
|
|
constructor TcxGridCountMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter);
|
|
Tag := 3;
|
|
ResCaption := @cxSGridCountMenuItem;
|
|
end;
|
|
|
|
{ TcxGridAvgMenuItem }
|
|
|
|
constructor TcxGridAvgMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter);
|
|
Tag := 4;
|
|
ResCaption := @cxSGridAvgMenuItem;
|
|
end;
|
|
|
|
{ TcxGridNoneMenuItem }
|
|
|
|
constructor TcxGridNoneMenuItem.Create(const AMenuItem: TComponent);
|
|
begin
|
|
inherited Create(AMenuItem);
|
|
SetProperties(AMenuItem, DoFooter, True);
|
|
Tag := 5;
|
|
ResCaption := @cxSGridNoneMenuItem;
|
|
end;
|
|
|
|
Initialization
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridSumMenuItem, AImageName+'1');
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridMinMenuItem, AImageName+'2');
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridMaxMenuItem, AImageName+'3');
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridCountMenuItem, AImageName+'4');
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridAvgMenuItem, AImageName+'5');
|
|
cxGridPopupMenuOperations.RegisterOperation(TcxGridNoneMenuItem, '');
|
|
end.
|