FastReport_2022_VCL/LibD28/frxTableObjectEditor.pas
2024-01-01 16:13:08 +01:00

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.