254 lines
7.6 KiB
ObjectPascal
254 lines
7.6 KiB
ObjectPascal
|
{******************************************}
|
||
|
{ }
|
||
|
{ FastReport VCL }
|
||
|
{ Table Object Editors }
|
||
|
{ }
|
||
|
{ Copyright (c) 1998-2021 }
|
||
|
{ by Fast Reports Inc. }
|
||
|
{ }
|
||
|
{******************************************}
|
||
|
|
||
|
unit frxTableObjectEditor;
|
||
|
|
||
|
interface
|
||
|
|
||
|
{$I frx.inc}
|
||
|
|
||
|
uses
|
||
|
SysUtils, Types, Classes, Variants, Controls,
|
||
|
frxClass, frxDsgnIntf;
|
||
|
|
||
|
type
|
||
|
TfrxTableCellEditor = class(TfrxComponentEditor)
|
||
|
public
|
||
|
procedure GetMenuItems; override;
|
||
|
function Execute(Tag: Integer; Checked: Boolean): Boolean; override;
|
||
|
function Edit: Boolean; override;
|
||
|
function HasEditor: Boolean; override;
|
||
|
end;
|
||
|
|
||
|
TfrxTableRowColumnEditor = class(TfrxComponentEditor)
|
||
|
public
|
||
|
procedure GetMenuItems; override;
|
||
|
function Execute(Tag: Integer; Checked: Boolean): Boolean; override;
|
||
|
end;
|
||
|
|
||
|
TfrxDragDropRowColumnEditor = class(TfrxInPlaceEditor)
|
||
|
public
|
||
|
function DoCustomDragOver(Source: TObject; X, Y: Integer; State: TDragState;
|
||
|
var Accept: Boolean; var EventParams: TfrxInteractiveEventsParams): Boolean; override;
|
||
|
function DoCustomDragDrop(Source: TObject; X, Y: Integer; var EventParams: TfrxInteractiveEventsParams): Boolean;
|
||
|
override;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses Math, frxDesgnEditors, frxRes, frxTableObject, frxEditMemo,
|
||
|
frxInPlaceEditors, ComCtrls;
|
||
|
|
||
|
const
|
||
|
ClipboardPrefix: String = '#FR6 clipboard#table#';
|
||
|
|
||
|
type
|
||
|
THackTableObject = class(TfrxTableObject);
|
||
|
{ TfrxTableCellEditor }
|
||
|
|
||
|
function TfrxTableCellEditor.Edit: Boolean;
|
||
|
begin
|
||
|
with TfrxMemoEditorForm.Create(Designer) do
|
||
|
begin
|
||
|
MemoView := TfrxMemoView(Component);
|
||
|
Result := ShowModal = mrOk;
|
||
|
if Result then
|
||
|
begin
|
||
|
MemoView.Text := Text;
|
||
|
MemoView.DataField := '';
|
||
|
end;
|
||
|
Free;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
function TfrxTableCellEditor.Execute(Tag: Integer; Checked: Boolean): Boolean;
|
||
|
begin
|
||
|
Result := inherited Execute(Tag, Checked);
|
||
|
if (Designer.SelectedObjects.Count > 0) and not (TObject(Designer.SelectedObjects[0]) is TfrxTableCell) then Exit;
|
||
|
case Tag of
|
||
|
0: TfrxTableCell(Designer.SelectedObjects[0]).ParentTable.JoinSelection;
|
||
|
1: TfrxTableCell(Designer.SelectedObjects[0]).ParentTable.SplitCell(TfrxTableCell(Designer.SelectedObjects[0]));
|
||
|
end;
|
||
|
Designer.SelectedObjects.Clear;
|
||
|
Designer.Invalidate;
|
||
|
Result := True;
|
||
|
end;
|
||
|
|
||
|
|
||
|
procedure TfrxTableCellEditor.GetMenuItems;
|
||
|
var
|
||
|
i: Integer;
|
||
|
bAddItem: Boolean;
|
||
|
begin
|
||
|
bAddItem := (Designer.SelectedObjects.Count > 1);
|
||
|
for i := 0 to Designer.SelectedObjects.Count - 1 do
|
||
|
if not(TObject(Designer.SelectedObjects[i]) is TfrxTableCell) then
|
||
|
begin
|
||
|
bAddItem := False;
|
||
|
break;
|
||
|
end;
|
||
|
|
||
|
if bAddItem then
|
||
|
AddItem(frxGet(6607), 0);
|
||
|
|
||
|
bAddItem := (Designer.SelectedObjects.Count = 1) and
|
||
|
(TObject(Designer.SelectedObjects[0]) is TfrxTableCell) and
|
||
|
((TfrxTableCell(Designer.SelectedObjects[0]).RowSpan > 1) or (TfrxTableCell(Designer.SelectedObjects[0]).ColSpan > 1));
|
||
|
if bAddItem then
|
||
|
AddItem(frxGet(6608), 1);
|
||
|
AddItem('-', -1);
|
||
|
inherited;
|
||
|
end;
|
||
|
|
||
|
function TfrxTableCellEditor.HasEditor: Boolean;
|
||
|
begin
|
||
|
Result := True;
|
||
|
end;
|
||
|
|
||
|
{ TfrxTableRowColumnEditor }
|
||
|
|
||
|
function TfrxTableRowColumnEditor.Execute(Tag: Integer;
|
||
|
Checked: Boolean): Boolean;
|
||
|
var
|
||
|
i: Integer;
|
||
|
c: TfrxComponent;
|
||
|
rc: TfrxTableRowColumnBase;
|
||
|
t: TfrxTableObject;
|
||
|
begin
|
||
|
Result := inherited Execute(Tag, Checked);
|
||
|
for i := 0 to Designer.SelectedObjects.Count - 1 do
|
||
|
begin
|
||
|
c := Designer.SelectedObjects[i];
|
||
|
if (c is TfrxTableRowColumnBase) and not (rfDontModify in c.Restrictions) then
|
||
|
begin
|
||
|
rc := TfrxTableRowColumnBase(c);
|
||
|
t := rc.ParentTable;
|
||
|
case Tag of
|
||
|
0: rc.AutoSize := Checked;
|
||
|
1: t.CreateNewRow(rc.Index).CreateUniqueNames;
|
||
|
2: t.CreateNewRow(rc.Index + 1).CreateUniqueNames;
|
||
|
3: t.CreateNewColumn(rc.Index).CreateUniqueNames;
|
||
|
4: t.CreateNewColumn(rc.Index + 1).CreateUniqueNames;
|
||
|
end;
|
||
|
Result := True;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
procedure TfrxTableRowColumnEditor.GetMenuItems;
|
||
|
var
|
||
|
r: TfrxTableRowColumnBase;
|
||
|
begin
|
||
|
r := TfrxTableRowColumnBase(Component);
|
||
|
inherited;
|
||
|
AddItem(frxResources.Get('pvAutoSize'), 0, r.AutoSize);
|
||
|
if r is TfrxTableRow then
|
||
|
begin
|
||
|
AddItem(frxGet(6603), 1);
|
||
|
AddItem(frxGet(6604), 2);
|
||
|
end
|
||
|
else if r is TfrxTableColumn then
|
||
|
begin
|
||
|
AddItem(frxGet(6605), 3);
|
||
|
AddItem(frxGet(6606), 4);
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
{ TfrxDragDropRowColumnEditor }
|
||
|
|
||
|
function TfrxDragDropRowColumnEditor.DoCustomDragDrop(Source: TObject; X,
|
||
|
Y: Integer; var EventParams: TfrxInteractiveEventsParams): Boolean;
|
||
|
var
|
||
|
Node: TTreeNode;
|
||
|
i, nCount: Integer;
|
||
|
s: String;
|
||
|
aTable: TfrxTableObject;
|
||
|
cell: TfrxTableCell;
|
||
|
rc: TfrxTableRowColumnBase;
|
||
|
begin
|
||
|
rc := TfrxTableRowColumnBase(FComponent);
|
||
|
Result := False;
|
||
|
if rc = nil then
|
||
|
Exit;
|
||
|
aTable := rc.ParentTable;
|
||
|
if aTable = nil then
|
||
|
Exit;
|
||
|
if rc Is TfrxTableRow then
|
||
|
nCount := aTable.ColumnCount
|
||
|
else
|
||
|
nCount := aTable.RowCount;
|
||
|
if (Source is TTreeView) then
|
||
|
|
||
|
for i := 0 to TTreeView(Source).SelectionCount - 1 do
|
||
|
begin
|
||
|
if i >= nCount then
|
||
|
break;
|
||
|
|
||
|
Node := TTreeView(Source).Selections[i];
|
||
|
s := '';
|
||
|
if (Node <> nil) and (Node.Data <> nil) then
|
||
|
s := rc.Report.GetAlias(TfrxDataSet(Node.Data));
|
||
|
if s <> '' then
|
||
|
begin
|
||
|
Result := True;
|
||
|
if rc Is TfrxTableRow then
|
||
|
cell := aTable.Cells[i, rc.Index]
|
||
|
else
|
||
|
cell := aTable.Cells[rc.Index, i];
|
||
|
cell.Text := '[' + s + '."' + Node.Text + '"]';
|
||
|
cell.DataSet := nil;
|
||
|
cell.DataField := '';
|
||
|
EventParams.Refresh := True;
|
||
|
EventParams.Modified := True;
|
||
|
end;
|
||
|
end;
|
||
|
end;
|
||
|
|
||
|
|
||
|
function TfrxDragDropRowColumnEditor.DoCustomDragOver(Source: TObject; X,
|
||
|
Y: Integer; State: TDragState; var Accept: Boolean;
|
||
|
var EventParams: TfrxInteractiveEventsParams): Boolean;
|
||
|
var
|
||
|
aTable: TfrxTableObject;
|
||
|
begin
|
||
|
Result := False;
|
||
|
aTable := TfrxTableRowColumnBase(FComponent).ParentTable;
|
||
|
if aTable = nil then Exit;
|
||
|
Accept := (Source is TControl and (TControl(Source).Name = 'DataTree'));
|
||
|
EventParams.Refresh := Accept;
|
||
|
if Accept then
|
||
|
THackTableObject(aTable).FSelectedRowCol := TfrxTableRowColumnBase(FComponent);
|
||
|
end;
|
||
|
|
||
|
initialization
|
||
|
frxComponentEditors.Register(TfrxTableCell, TfrxTableCellEditor);
|
||
|
frxComponentEditors.Register(TfrxTableRowColumnBase, TfrxTableRowColumnEditor);
|
||
|
frxRegEditorsClasses.Register(TfrxTableRow, [TfrxDragDropRowColumnEditor], [[evDesigner]]);
|
||
|
frxRegEditorsClasses.Register(TfrxTableColumn, [TfrxDragDropRowColumnEditor], [[evDesigner]]);
|
||
|
frxObjects.RegisterObject1(TfrxTableObject, nil, '', '', 0, 67);
|
||
|
// prevent adding these items to the Objects toolbar
|
||
|
frxObjects.RegisterObject1(TfrxTableRow, nil, '', '', 0, 73, [ctNone]);
|
||
|
frxObjects.RegisterObject1(TfrxTableColumn, nil, '', '', 0, 72, [ctNone]);
|
||
|
frxObjects.RegisterObject1(TfrxTableCell, nil, '', '', 0, 71, [ctNone]);
|
||
|
frxRegEditorsClasses.Register(TfrxTableCell, [TfrxInPlaceDataFiledEditor, TfrxInPlaceMemoEditor], [[evDesigner], [evDesigner, evPreview]]);
|
||
|
frxHideProperties(TfrxTableCell, 'Visible;ShiftMode;StretchMode');
|
||
|
|
||
|
finalization
|
||
|
frxObjects.UnRegister(TfrxTableObject);
|
||
|
frxObjects.UnRegister(TfrxTableRow);
|
||
|
frxObjects.UnRegister(TfrxTableColumn);
|
||
|
frxObjects.UnRegister(TfrxTableCell);
|
||
|
frxUnregisterEditorsClass(TfrxTableRow, TfrxDragDropRowColumnEditor);
|
||
|
frxUnregisterEditorsClass(TfrxTableColumn, TfrxDragDropRowColumnEditor);
|
||
|
frxUnregisterEditorsClass(TfrxTableCell, TfrxInPlaceDataFiledEditor);
|
||
|
frxUnregisterEditorsClass(TfrxTableCell, TfrxInPlaceMemoEditor);
|
||
|
|
||
|
end.
|