FastReport_FMX_2.8.12/LibD28x64/FMX.frxCrossEditor.pas
2024-07-06 22:41:12 +02:00

1030 lines
36 KiB
ObjectPascal

{******************************************}
{ }
{ FastReport v4.0 }
{ Cross editor }
{ }
{ Copyright (c) 1998-2008 }
{ by Alexander Tzyganenko, }
{ Fast Reports Inc. }
{ }
{******************************************}
unit FMX.frxCrossEditor;
interface
{$I frx.inc}
uses
System.SysUtils, System.Classes, System.UITypes, System.UIConsts, System.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
FMX.Types, FMX.Objects, FMX.Edit, FMX.ListBox, FMX.Layouts, FMX.Menus, FMX.ExtCtrls,
FMX.frxCross, FMX.frxClass, FMX.frxCtrls, FMX.frxCustomEditors, System.Variants,
FMX.frxFMX
{$IFDEF LINUX}
,FMX.frxBaseModalForm
{$ENDIF}
{$IFDEF DELPHI18}
,FMX.StdCtrls
{$ENDIF}
{$IFDEF DELPHI19}
, FMX.Graphics
{$ENDIF}
{$IFDEF DELPHI28}
, FMX.BaseTypeAliases, FMX.FormTypeAliases
{$ENDIF};
type
TfrxCrossEditor = class(TfrxViewEditor)
public
function Edit: Boolean; override;
function HasEditor: Boolean; override;
end;
{$IFDEF LINUX}
TfrxCrossEditorForm = class(TfrxForm)
{$ELSE}
TfrxCrossEditorForm = class(TForm)
{$ENDIF}
FuncPopup: TPopupMenu;
SortPopup: TPopupMenu;
DatasetL: TGroupBox;
DatasetCB: TComboBox;
FieldsLB: TfrxListBox;
DimensionsL: TGroupBox;
RowsL: TLabel;
RowsE: TEdit;
ColumnsL: TLabel;
ColumnsE: TEdit;
CellsL: TLabel;
CellsE: TEdit;
StructureL: TGroupBox;
Shape1: TLine;
Shape2: TLine;
SwapB: TSpeedButton;
RowsLB: TfrxListBox;
ColumnsLB: TfrxListBox;
CellsLB: TfrxListBox;
OptionsL: TGroupBox;
RowHeaderCB: TCheckBox;
ColumnHeaderCB: TCheckBox;
RowTotalCB: TCheckBox;
ColumnTotalCB: TCheckBox;
TitleCB: TCheckBox;
CornerCB: TCheckBox;
AutoSizeCB: TCheckBox;
BorderCB: TCheckBox;
DownAcrossCB: TCheckBox;
PlainCB: TCheckBox;
JoinCB: TCheckBox;
Box: TScrollBox;
PaintBox: TPaintBox;
OkB: TButton;
CancelB: TButton;
RepeatCB: TCheckBox;
StylePopup: TPopupMenu;
Sep1: TMenuItem;
SaveStyleMI: TMenuItem;
ToolBar: TToolBar;
StyleB: TfrxToolButton;
procedure FormCreate(Sender: TObject);
procedure CancelBClick(Sender: TObject);
procedure OkBClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DatasetCBClick(Sender: TObject);
// procedure DatasetCBDrawItem(Control: TWinControl; Index: Integer;
// ARect: TRect; State: TOwnerDrawState);
// procedure FieldsLBDrawItem(Control: TWinControl; Index: Integer;
// ARect: TRect; State: TOwnerDrawState);
// procedure LBDrawItem(Control: TWinControl; Index: Integer;
// ARect: TRect; State: TOwnerDrawState);
// procedure CellsLBDrawItem(Control: TWinControl; Index: Integer;
// ARect: TRect; State: TOwnerDrawState);
procedure LBDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; {$IFNDEF DELPHI20}var Accept: Boolean{$ELSE} var Operation: TDragOperation{$ENDIF});
procedure LBDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
procedure LBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure LBClick(Sender: TObject);
procedure CBClick(Sender: TObject);
procedure FuncMIClick(Sender: TObject);
procedure SortMIClick(Sender: TObject);
procedure SwapBClick(Sender: TObject);
procedure DimensionsChange(Sender: TObject);
procedure LBDblClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
procedure PaintBoxPaint(Sender: TObject; Canvas: TCanvas);
procedure SaveStyleMIClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure RowsLBDragEnter(Sender: TObject; const Data: TDragObject;
const Point: TPointF);
procedure RowsLBDragLeave(Sender: TObject);
procedure StyleBClick(Sender: TObject);
private
FCross: TfrxCustomCrossView;
FCurList: TfrxListBox;
FSortMenuList: TList;
FFuncMenuList: TList;
FFuncNames: array[TfrxCrossFunction] of String;
FImages: TfrxImageList;
FSortNames: array[TfrxCrossSortOrder] of String;
FStyleSheet: TfrxStyleSheet;
FTempCross: TfrxDBCrossView;
FUpdating: Boolean;
FItemAdded: Boolean;
procedure ReflectChanges(ChangesFrom: TObject; UpdateText: Boolean = True);
procedure CreateStyleMenu;
procedure StyleClick(Sender: TObject);
procedure UpdateCheckBoxes(aListBox: TfrxListBox);
procedure LBButtonClick(Sender: TObject; aButton: TObject; aItem: TfrxListBoxItem);
procedure LBCheckChange(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
property Cross: TfrxCustomCrossView read FCross write FCross;
end;
implementation
{$R *.FMX}
uses
FMX.frxDsgnIntf, FMX.frxEditFormat, FMX.frxEditHighlight, FMX.frxEditMemo,
FMX.frxEditFrame, FMX.frxDesgnCtrls, FMX.frxRes, FMX.frxUtils, FMX.frxXML;
const
CrossStyles =
'<?xml version="1.0" encoding="utf-8" standalone="no"?>' +
'<stylesheet>' +
'<style Name="White">' +
'<item Name="cellheader" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Typ="15"/>' +
'<item Name="cell" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Typ="15"/>' +
'<item Name="column" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-1" Font.Color="-16777216" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-1" Font.Color="-16777216" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="row" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-1" Font.Color="-16777216" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-1" Font.Color="-16777216" Font.Style="1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Gray">' +
'<item Name="cellheader" Color="-2565928" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-986896" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-2565928" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-2565928" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-2565928" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-2565928" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-2565928" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-2565928" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-2565928" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Orange">' +
'<item Name="cellheader" Color="-9658" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-5221" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-9658" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-9658" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-9658" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-9658" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-9658" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-9658" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-9658" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Green">' +
'<item Name="cellheader" Color="-8674304" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-6368768" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-8674304" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-8674304" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-8674304" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-8674304" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-8674304" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-8674304" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-8674304" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Green and Orange">' +
'<item Name="cellheader" Color="-6763520" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-13312" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-6763520" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-6763520" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-6763520" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-6763520" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-6763520" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-6763520" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-6763520" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Blue">' +
'<item Name="cellheader" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-4533250" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Blue and White">' +
'<item Name="cellheader" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Color="-2565928" Frame.Typ="15"/>' +
'<item Name="column" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Gray and Orange">' +
'<item Name="cellheader" Color="-8355712" Font.Color="-1" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-13312" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-8355712" Font.Color="-1" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-8355712" Font.Color="-1" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-8355712" Font.Color="-1" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-8355712" Font.Color="-1" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-8355712" Font.Color="-1" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-8355712" Font.Color="-1" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-8355712" Font.Color="-1" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Blue and Orange">' +
'<item Name="cellheader" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-12438" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="column" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-6832643" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-6832643" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'<style Name="Orange and White">' +
'<item Name="cellheader" Color="-12438" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="cell" Color="-1" Font.Color="-16777216" Font.Style="0" Frame.Color="-2565928" Frame.Typ="15"/>' +
'<item Name="column" Color="-12438" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="colgrand" Color="-12438" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="coltotal" Color="-12438" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="row" Color="-12438" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowgrand" Color="-12438" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="rowtotal" Color="-12438" Font.Color="-16777216" Font.Style="1" Frame.Color="-1" Frame.Typ="15"/>' +
'<item Name="corner" Color="-12438" Font.Color="-16777216" Font.Style="0" Frame.Color="-1" Frame.Typ="15"/>' +
'</style>' +
'</stylesheet>';
type
THackControl = class(TControl);
THackListBoxItem = class(TfrxListBoxItem);
{ TfrxCrossEditor }
function TfrxCrossEditor.Edit: Boolean;
begin
with TfrxCrossEditorForm.Create(Designer) do
begin
Cross := TfrxCustomCrossView(Component);
FormShow(Self);
Result := ShowModal = mrOk;
Free;
end;
end;
function TfrxCrossEditor.HasEditor: Boolean;
begin
Result := True;
end;
{ TfrxCrossEditorForm }
constructor TfrxCrossEditorForm.Create(AOwner: TComponent);
var
TempStream: TStringStream;
begin
inherited;
FSortMenuList := TList.Create;
FFuncMenuList := TList.Create;
FStyleSheet := TfrxStyleSheet.Create;
if FileExists(ExtractFilePath(ParamStr(0)) + 'crossstyles.xml') then
FStyleSheet.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'crossstyles.xml')
else
begin
TempStream := TStringStream.Create(CrossStyles, TEncoding.UTF8);
FStyleSheet.LoadFromStream(TempStream);
TempStream.Free;
end;
FImages := TfrxImageList.Create(nil);
FTempCross := TfrxDBCrossView.Create(nil);
FFuncNames[cfNone] := frxResources.Get('crNone');
FFuncNames[cfSum] := frxResources.Get('crSum');
FFuncNames[cfMin] := frxResources.Get('crMin');
FFuncNames[cfMax] := frxResources.Get('crMax');
FFuncNames[cfAvg] := frxResources.Get('crAvg');
FFuncNames[cfCount] := frxResources.Get('crCount');
FSortNames[soAscending] := frxResources.Get('crAsc');
FSortNames[soDescending] := frxResources.Get('crDesc');
FSortNames[soNone] := frxResources.Get('crNone');
FSortNames[soGrouping] := frxResources.Get('crGroup');
end;
destructor TfrxCrossEditorForm.Destroy;
begin
FImages.Free;
FStyleSheet.Free;
FTempCross.Free;
FSortMenuList.Free;
FFuncMenuList.Free;
inherited;
end;
procedure TfrxCrossEditorForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
if ModalResult = mrCancel then
FCross.Assign(FTempCross);
end;
procedure TfrxCrossEditorForm.FormCreate(Sender: TObject);
var
i: Integer;
m: TMenuItem;
begin
CellsLB.ShowCheckboxes := False;
CellsLB.ShowButtons := True;
RowsLB.ShowCheckboxes := True;
RowsLB.ShowButtons := True;
ColumnsLB.ShowCheckboxes := True;
ColumnsLB.ShowButtons := True;
{$IFDEF DELPHI18}
ColumnsLB.DragMode := TDragMode.dmManual;
RowsLB.DragMode := TDragMode.dmManual;
CellsLB.DragMode := TDragMode.dmManual;
FieldsLB.DragMode := TDragMode.dmManual;
CellsLB.ManualDragAndDrop := True;
RowsLB.ManualDragAndDrop := True;
ColumnsLB.ManualDragAndDrop := True;
FieldsLB.ManualDragAndDrop := True;
{$ENDIF}
// compatibility XE2- XE6
for i := 0 to 3 do
begin
m := TMenuItem.Create(SortPopup);
case i of
0: m.Text := frxGet(4328);
1: m.Text := frxGet(4329);
2: m.Text := frxGet(4330);
3: m.Text := frxGet(4331);
end;
m.OnClick := SortMIClick;
m.Tag := i;
SortPopup.AddObject(m);
FSortMenuList.Add(Pointer(m));
end;
for i := 0 to 5 do
begin
m := TMenuItem.Create(FuncPopup);
case i of
0: m.Text := frxGet(4322);
1: m.Text := frxGet(4323);
2: m.Text := frxGet(4324);
3: m.Text := frxGet(4325);
4: m.Text := frxGet(4326);
5: m.Text := frxGet(4327);
end;
m.OnClick := FuncMIClick;
m.Tag := i;
FuncPopup.AddObject(m);
FFuncMenuList.Add(Pointer(m));
end;
Caption := frxGet(4300);
DatasetL.Text := frxGet(4301);
DimensionsL.Text := frxGet(4302);
RowsL.Text := frxGet(4303);
ColumnsL.Text := frxGet(4304);
CellsL.Text := frxGet(4305);
StructureL.Text := frxGet(4306);
RowHeaderCB.Text := frxGet(4307);
ColumnHeaderCB.Text := frxGet(4308);
RowTotalCB.Text := frxGet(4309);
ColumnTotalCB.Text := frxGet(4310);
//SwapB.Hint := frxGet(4311);
TitleCB.Text := frxGet(4314);
CornerCB.Text := frxGet(4315);
AutoSizeCB.Text := frxGet(4317);
BorderCB.Text := frxGet(4318);
DownAcrossCB.Text := frxGet(4319);
RepeatCB.Text := frxGet(4316);
PlainCB.Text := frxGet(4320);
JoinCB.Text := frxGet(4321);
StyleB.Text := frxGet(4312);
StyleB.OnClick := StyleBClick;
SaveStyleMI.Text := frxGet(4313);
OkB.Text := frxGet(1);
CancelB.Text := frxGet(2);
FItemAdded := False;
CreateStyleMenu;
CellsLB.CheckBoxText := frxResources.Get('crSubtotal');
RowsLB.CheckBoxText := frxResources.Get('crSubtotal');
ColumnsLB.CheckBoxText := frxResources.Get('crSubtotal');
CellsLB.ButtonText := 'Func';
CellsLB.OnButtonClick := LBButtonClick;
RowsLB.ButtonText := 'A-Z';
RowsLB.OnButtonClick := LBButtonClick;
RowsLB.OnChangeCheck := LBCheckChange;
ColumnsLB.ButtonText := 'A-Z';
ColumnsLB.OnButtonClick := LBButtonClick;
ColumnsLB.OnChangeCheck := LBCheckChange;
end;
procedure TfrxCrossEditorForm.FormShow(Sender: TObject);
procedure SelectDataset;
begin
DatasetCB.ItemIndex := DatasetCB.Items.IndexOfObject(FCross.DataSet);
if DatasetCB.ItemIndex = -1 then
DatasetCB.ItemIndex := 0;
DatasetCBClick(nil);
end;
procedure SelectFields;
var
i: Integer;
Item: TfrxListBoxItem;
begin
for i := 0 to FCross.RowFields.Count - 1 do
begin
Item := RowsLB.ListItems[RowsLB.Count - 1] as TfrxListBoxItem;
if Item <> nil then
begin
Item.CheckVisible := True;
Item.IsChecked := FCross.RowTotalMemos[THackListBoxItem(Item).Index + 1].Visible;
end;
RowsLB.Items.Add(FCross.RowFields[i]);
end;
for i := 0 to FCross.ColumnFields.Count - 1 do
begin
Item := ColumnsLB.ListItems[ColumnsLB.Count - 1] as TfrxListBoxItem;
if Item <> nil then
begin
Item.CheckVisible := True;
Item.IsChecked := FCross.ColumnTotalMemos[THackListBoxItem(Item).Index + 1].Visible;
end;
ColumnsLB.Items.Add(FCross.ColumnFields[i]);
end;
CellsLB.Items := FCross.CellFields;
end;
begin
FUpdating := True;
FTempCross.Assign(FCross);
FCross.Report.GetDataSetList(DatasetCB.Items);
SelectDataset;
SelectFields;
if FCross is TfrxCrossView then
begin
SwapB.Visible := False;
DimensionsL.Visible := True;
RowsE.Text := IntToStr(FCross.RowLevels);
ColumnsE.Text := IntToStr(FCross.ColumnLevels);
CellsE.Text := IntToStr(FCross.CellLevels);
end
else
DatasetL.Visible := True;
TitleCB.IsChecked := FCross.ShowTitle;
CornerCB.IsChecked := FCross.ShowCorner;
ColumnHeaderCB.IsChecked := FCross.ShowColumnHeader;
RowHeaderCB.IsChecked := FCross.ShowRowHeader;
ColumnTotalCB.IsChecked := FCross.ShowColumnTotal;
RowTotalCB.IsChecked := FCross.ShowRowTotal;
AutoSizeCB.IsChecked := FCross.AutoSize;
BorderCB.IsChecked := FCross.Border;
DownAcrossCB.IsChecked := FCross.DownThenAcross;
RepeatCB.IsChecked := FCross.RepeatHeaders;
PlainCB.IsChecked := FCross.PlainCells;
JoinCB.IsChecked := FCross.JoinEqualCells;
StyleB.Visible := not FCross.DotMatrix;
FUpdating := False;
end;
procedure TfrxCrossEditorForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
begin
if Key = VKF1 then
frxResources.Help(Self);
end;
procedure TfrxCrossEditorForm.CreateStyleMenu;
var
i: Integer;
sl: TStringList;
m: TMenuItem;
b: TBitmap;
Style: TfrxStyles;
begin
sl := TStringList.Create;
FStyleSheet.GetList(sl);
FImages.Clear;
b := TBitmap.Create(16, 16);
//frxResources.MainButtonImages.Draw(b.Canvas, 0, 0, 2);
//FImages.Add(b, nil);
{ create thumbnail images for each style }
for i := 0 to sl.Count - 1 do
begin
Style := FStyleSheet[i];
with b.Canvas do
begin
Fill.Color := Style.Find('column').Color;
if Fill.Color = claNull then
Fill.Color := claWhite;
FillRect(RectF(0, 0, 16, 8), 1, 1, AllCorners, 1, TCornerType.ctBevel);
Fill.Color := Style.Find('cell').Color;
if Fill.Color = claNull then
Fill.Color := claWhite;
FillRect(RectF(0, 8, 16, 16), 1, 1, AllCorners, 1, TCornerType.ctBevel);
Stroke.Color := claSilver;
Fill.Kind := TBrushKind.bkNone;
DrawRect(RectF(0, 0, 16, 16), 1, 1, AllCorners, 1, TCornerType.ctBevel);
end;
//FImages.Add(b, nil);
end;
//while StylePopup.Items[0] <> Sep1 do
// StylePopup.Items[0].Free;
for i := sl.Count - 1 downto 0 do
begin
m := TMenuItem.Create(StylePopup);
m.Text := sl[i];
//m.ImageIndex := i + 1;
m.OnClick := StyleClick;
StylePopup.AddObject(m);
//StylePopup.Items.Insert(0, m);
end;
b.Free;
sl.Free;
end;
procedure TfrxCrossEditorForm.ReflectChanges(ChangesFrom: TObject; UpdateText: Boolean);
var
i, j: Integer;
s: String;
begin
if (DatasetCB.ItemIndex = -1) or (DatasetCB.Items.Count = 0) then
FCross.DataSet := nil else
FCross.DataSet := TfrxCustomDBDataSet(DatasetCB.Items.Objects[DatasetCB.ItemIndex]);
if FCross is TfrxDBCrossView then
begin
FCross.RowFields := RowsLB.Items;
FCross.ColumnFields := ColumnsLB.Items;
FCross.CellFields := CellsLB.Items;
end;
FCross.RowLevels := FCross.RowFields.Count;
FCross.ColumnLevels := FCross.ColumnFields.Count;
FCross.CellLevels := FCross.CellFields.Count;
if ChangesFrom = nil then // change all
begin
if FCross.CellLevels = 1 then
if UpdateText then
FCross.CornerMemos[0].Text := FCross.CellFields[0]
else
begin
FCross.CornerMemos[0].Text := '';
FCross.CornerMemos[2].Text := 'Data';
end;
if UpdateText then
for i := 0 to FCross.RowLevels do
for j := 0 to FCross.CellLevels - 1 do
FCross.CellHeaderMemos[i * FCross.CellLevels + j].Text := FCross.CellFields[j];
s := '';
for i := 0 to FCross.ColumnLevels - 1 do
s := s + FCross.ColumnFields[i] + ', ';
if s <> '' then
SetLength(s, Length(s) - 2);
if UpdateText then
FCross.CornerMemos[1].Text := s;
if UpdateText then
for i := 0 to FCross.RowLevels - 1 do
FCross.CornerMemos[i + 3].Text := FCross.RowFields[i];
end
else if (ChangesFrom = RowsLB) or (ChangesFrom = RowsE) then
begin
if UpdateText then
for i := 0 to FCross.RowLevels do
for j := 0 to FCross.CellLevels - 1 do
FCross.CellHeaderMemos[i * FCross.CellLevels + j].Text := FCross.CellFields[j];
if UpdateText then
for i := 0 to FCross.RowLevels - 1 do
FCross.CornerMemos[i + 3].Text := FCross.RowFields[i];
end
else if (ChangesFrom = ColumnsLB) or (ChangesFrom = ColumnsE) then
begin
s := '';
for i := 0 to FCross.ColumnLevels - 1 do
s := s + FCross.ColumnFields[i] + ', ';
if s <> '' then
SetLength(s, Length(s) - 2);
if UpdateText then
FCross.CornerMemos[1].Text := s;
end
else if (ChangesFrom = CellsLB) or (ChangesFrom = CellsE) then
begin
if FCross.CellLevels = 1 then
if UpdateText then
FCross.CornerMemos[0].Text := FCross.CellFields[0]
else
begin
FCross.CornerMemos[0].Text := '';
FCross.CornerMemos[2].Text := 'Data';
end;
if UpdateText then
for i := 0 to FCross.RowLevels do
for j := 0 to FCross.CellLevels - 1 do
FCross.CellHeaderMemos[i * FCross.CellLevels + j].Text := FCross.CellFields[j];
end;
PaintBox.InvalidateRect(PaintBox.BoundsRect);
// PaintBoxPaint(nil, PaintBox.Canvas);
end;
procedure TfrxCrossEditorForm.RowsLBDragEnter(Sender: TObject;
const Data: TDragObject; const Point: TPointF);
begin
if (Data.Source is TfrxListBox) and (TfrxListBox(Sender).Count = 0) then
begin
FItemAdded := True;
TfrxListBox(Sender).Items.Add('');// add fake item
end;
TfrxListBox(Sender).ItemIndex := 0;
end;
procedure TfrxCrossEditorForm.RowsLBDragLeave(Sender: TObject);
begin
if FItemAdded then
begin
TfrxListBox(Sender).Items.Delete(0);
FItemAdded := False;
end;
end;
procedure TfrxCrossEditorForm.DatasetCBClick(Sender: TObject);
var
ds: TfrxCustomDBDataSet;
begin
if (DatasetCB.ItemIndex = -1) or (DatasetCB.Items.Count = 0) then Exit;
ds := TfrxCustomDBDataSet(DatasetCB.Items.Objects[DatasetCB.ItemIndex]);
ds.GetFieldList(FieldsLB.Items);
RowsLB.Clear;
ColumnsLB.Clear;
CellsLB.Clear;
if (Sender <> nil) and not FUpdating then
ReflectChanges(nil);
end;
procedure TfrxCrossEditorForm.LBDragOver(Sender: TObject; const Data: TDragObject; const Point: TPointF; {$IFNDEF DELPHI20}var Accept: Boolean{$ELSE} var Operation: TDragOperation{$ENDIF});
{$IFDEF DELPHI20}
var
Accept: Boolean;
{$ENDIF}
begin
Accept := (Data.Source is TfrxListBox) and (TfrxListBox(Data.Source).Items.Count > 0);
if not Accept then
Accept := (Data.Source is TListBoxItem);
{$IFDEF DELPHI20}
if Accept then
Operation := TDragOperation.Copy;
{$ENDIF}
end;
procedure TfrxCrossEditorForm.UpdateCheckBoxes(aListBox: TfrxListBox);
var
i: Integer;
item2: TfrxListBoxItem;
begin
FUpdating := True;
if aListBox.ShowCheckboxes then
for i := 0 to aListBox.Items.Count - 1 do
begin
item2 := aListBox.ListItems[i] as TfrxListBoxItem;
if item2 <> nil then
begin
item2.CheckVisible := (aListBox.Items.Count - 1 <> i);
if item2.CheckVisible then
if aListBox = ColumnsLB then
item2.IsChecked := FCross.ColumnTotalMemos[i].Visible
else if aListBox = RowsLB then
item2.IsChecked := FCross.RowTotalMemos[i].Visible;
end;
end;
FUpdating := False;
end;
procedure TfrxCrossEditorForm.LBDragDrop(Sender: TObject; const Data: TDragObject; const Point: TPointF);
var
s: String;
i: Integer;
item: TListBoxItem;
SourceLB, SenderLB: TfrxListBox;
begin
SourceLB := nil;
//there are two ways to drag an item select and drag list box or drag item
if Data.Source is TfrxListBoxItem then
SourceLB := TfrxListBox(THackListBoxItem(Data.Source).ListBox)
else if Data.Source is TfrxListBox then
SourceLB := TfrxListBox(Data.Source);
if SourceLB = nil then Exit;
SenderLB := TfrxListBox(Sender);
if FItemAdded then
begin
TfrxListBox(Sender).Items.Delete(0);
FItemAdded := False;
end;
if (SourceLB.ItemIndex = -1) or (SourceLB.Count = 0) then Exit;
if (Data.Source = Sender) and (Data.Source <> FieldsLB) then
begin
item := SourceLB.ItemByPoint(Point.X, Point.Y);
i := -1;
if item <> nil then i := item.Index;
if i = -1 then
i := SourceLB.Items.Count - 1;
SourceLB.Items.Exchange(SourceLB.ItemIndex, i);
end
else if SourceLB <> Sender then
begin
s := SourceLB.Items[SourceLB.ItemIndex];
if SourceLB <> FieldsLB then
SourceLB.Items.Delete(SourceLB.Items.IndexOf(s));
if Sender <> FieldsLB then
SenderLB.Items.Add(s);
end;
UpdateCheckBoxes(SourceLB);
UpdateCheckBoxes(SenderLB);
ReflectChanges(Data.Source);
ReflectChanges(Sender);
end;
procedure TfrxCrossEditorForm.LBButtonClick(Sender, aButton: TObject;
aItem: TfrxListBoxItem);
var
sort: TfrxCrossSortOrder;
f: TfrxCrossFunction;
i: Integer;
pt: TPointF;
m : TMenuItem;
//Button: TButton;
begin
FCurList := TfrxListBox(Sender);
//Button := aButton as TButton;
if (Sender = RowsLB) or (Sender = ColumnsLB) then
begin
if Sender = RowsLB then
sort := FCross.RowSort[THackListBoxItem(aItem).Index] else
sort := FCross.ColumnSort[THackListBoxItem(aItem).Index];
for i := 0 to FSortMenuList.Count - 1 do
begin
m := TMenuItem(FSortMenuList[i]);
if m.Tag = Integer(sort) then
m.IsChecked := True
else
m.IsChecked := False;
end;
pt := aItem.LocalToAbsolute(PointF(aItem.Position.X + aItem.Width, 0));
pt := Self.ClientToScreen(pt);
SortPopup.Popup(pt.X, pt.Y);
end
else if (Sender = CellsLB) then
begin
if CellsLB.ItemIndex = -1 then Exit;
f := FCross.CellFunctions[CellsLB.ItemIndex];
for i := 0 to FFuncMenuList.Count - 1 do
begin
m := TMenuItem(FFuncMenuList[i]);
if m.Tag = Integer(f) then
m.IsChecked := True
else
m.IsChecked := False;
end;
pt := aItem.LocalToAbsolute(PointF(aItem.Position.X + aItem.Width, 0));
pt := Self.ClientToScreen(pt);
FuncPopup.Popup(pt.X, pt.Y);
end;
end;
procedure TfrxCrossEditorForm.LBCheckChange(Sender: TObject);
var
FCurItem: TfrxListBoxItem;
Memo: TfrxCustomMemoView;
begin
FCurItem := Sender as TfrxListBoxItem;
if (FCurItem = nil) or FUpdating then Exit;
FCurList := TfrxListBox(THackListBoxItem(FCurItem).ListBox);
if THackListBoxItem(FCurItem).ListBox = RowsLB then
Memo := FCross.RowTotalMemos[THackListBoxItem(FCurItem).Index + 1] else
Memo := FCross.ColumnTotalMemos[THackListBoxItem(FCurItem).Index + 1];
Memo.Visible := FCurItem.IsChecked;
PaintBox.InvalidateRect(PaintBox.BoundsRect);
end;
procedure TfrxCrossEditorForm.LBClick(Sender: TObject);
begin
if Sender <> FieldsLB then
FieldsLB.ItemIndex := -1;
if Sender <> RowsLB then
RowsLB.ItemIndex := -1;
if Sender <> ColumnsLB then
ColumnsLB.ItemIndex := -1;
if Sender <> CellsLB then
CellsLB.ItemIndex := -1;
end;
procedure TfrxCrossEditorForm.LBDblClick(Sender: TObject);
var
lb: TfrxListBox;
s: String;
begin
lb := TfrxListBox(Sender);
if lb.ItemIndex = -1 then
exit;
s := Cross.Report.Designer.InsertExpression(lb.Items[lb.ItemIndex]);
if s <> '' then
begin
lb.Items[lb.ItemIndex] := s;
ReflectChanges(Sender);
end;
end;
procedure TfrxCrossEditorForm.CancelBClick(Sender: TObject);
begin
ModalResult := mrCancel;
end;
procedure TfrxCrossEditorForm.OkBClick(Sender: TObject);
begin
ModalResult := mrOk;
end;
procedure TfrxCrossEditorForm.LBMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
FCurList := TfrxListBox(Sender);
FCurList.Repaint;
ReflectChanges(Sender, False);
end;
procedure TfrxCrossEditorForm.CBClick(Sender: TObject);
begin
if FUpdating then Exit;
FCross.ShowTitle := TitleCB.IsChecked;
FCross.ShowCorner := CornerCB.IsChecked;
FCross.ShowColumnHeader := ColumnHeaderCB.IsChecked;
FCross.ShowRowHeader := RowHeaderCB.IsChecked;
FCross.ShowColumnTotal := ColumnTotalCB.IsChecked;
FCross.ShowRowTotal := RowTotalCB.IsChecked;
FCross.AutoSize := AutoSizeCB.IsChecked;
FCross.Border := BorderCB.IsChecked;
FCross.DownThenAcross := DownAcrossCB.IsChecked;
FCross.RepeatHeaders := RepeatCB.IsChecked;
FCross.PlainCells := PlainCB.IsChecked;
FCross.JoinEqualCells := JoinCB.IsChecked;
ReflectChanges(Sender, False);
end;
procedure TfrxCrossEditorForm.DimensionsChange(Sender: TObject);
begin
if FUpdating then Exit;
case TControl(Sender).Tag of
0: FCross.RowLevels := StrToInt(RowsE.Text);
1: FCross.ColumnLevels := StrToInt(ColumnsE.Text);
2: FCross.CellLevels := StrToInt(CellsE.Text);
end;
RowsLB.Items := FCross.RowFields;
ColumnsLB.Items := FCross.ColumnFields;
CellsLB.Items := FCross.CellFields;
ReflectChanges(Sender);
end;
procedure TfrxCrossEditorForm.FuncMIClick(Sender: TObject);
begin
if CellsLB.ItemIndex = -1 then Exit;
FCross.CellFunctions[CellsLB.ItemIndex] := TfrxCrossFunction(TControl(Sender).Tag);
CellsLB.Repaint;
THackControl(CellsLB).DragEnd;
end;
procedure TfrxCrossEditorForm.SortMIClick(Sender: TObject);
begin
if FCurList.ItemIndex = -1 then Exit;
if FCurList = ColumnsLB then
FCross.ColumnSort[FCurList.ItemIndex] := TfrxCrossSortOrder(TControl(Sender).Tag) else
FCross.RowSort[FCurList.ItemIndex] := TfrxCrossSortOrder(TControl(Sender).Tag);
FCurList.Repaint;
THackControl(FCurList).DragEnd;
end;
procedure TfrxCrossEditorForm.SwapBClick(Sender: TObject);
var
sl: TStrings;
begin
sl := TStringList.Create;
sl.Assign(RowsLB.Items);
FUpdating := True;
RowsLB.Items := ColumnsLB.Items;
ColumnsLB.Items := sl;
sl.Free;
FUpdating := False;
UpdateCheckBoxes(RowsLB);
UpdateCheckBoxes(ColumnsLB);
ReflectChanges(nil);
RowsLB.Repaint;
ColumnsLB.Repaint;
end;
procedure TfrxCrossEditorForm.StyleBClick(Sender: TObject);
var
pt: TPointF;
begin
pt := PaintBox.LocalToAbsolute(PointF(StyleB.Position.X, StyleB.Position.Y + ToolBar.Height));
StylePopup.Popup(Self.Left + pt.X, Self.Top + pt.Y );
end;
procedure TfrxCrossEditorForm.StyleClick(Sender: TObject);
var
Style: TfrxStyles;
begin
Style := FStyleSheet.Find(TMenuItem(Sender).Text);
if Style <> nil then
FCross.ApplyStyle(Style);
PaintBox.InvalidateRect(PaintBox.BoundsRect);
end;
procedure TfrxCrossEditorForm.SaveStyleMIClick(Sender: TObject);
var
s: String;
Style: TfrxStyles;
begin
s := '';
s := InputBox(frxGet(4313), frxResources.Get('crStName'), s);
if s <> '' then
begin
Style := FStyleSheet.Find(s);
if Style = nil then
Style := FStyleSheet.Add;
Style.Name := s;
FCross.GetStyle(Style);
FStyleSheet.SaveToFile(ExtractFilePath(ParamStr(0)) + 'crossstyles.xml');
CreateStyleMenu;
end;
end;
procedure TfrxCrossEditorForm.PaintBoxPaint(Sender: TObject; Canvas: TCanvas);
begin
with Canvas do
begin
Fill.Color := claWhite;
FillRect(RectF(0, 0, PaintBox.Width, PaintBox.Height), 1, 1, AllCorners, 1, TCornerType.ctBevel);
end;
FCross.DrawCross(PaintBox.Canvas, 1, 1, 0, 0);
end;
initialization
frxComponentEditors.Register(TfrxCrossView, TfrxCrossEditor);
frxComponentEditors.Register(TfrxDBCrossView, TfrxCrossEditor);
end.