mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-01 16:03:39 +02:00
953 lines
25 KiB
ObjectPascal
953 lines
25 KiB
ObjectPascal
unit fraSQLDBRestSchemaEditor;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Forms, Controls, ExtCtrls, ComCtrls, StdCtrls, ActnList, PropertyStorage, sqldbschemaedittools, sqldbrestschema, sqldbrestbridge;
|
|
|
|
type
|
|
|
|
{ TSQLDBRestSchemaEditorFrame }
|
|
|
|
TSQLDBRestSchemaEditorFrame = class(TFrame)
|
|
AAddField: TAction;
|
|
ADeleteField: TAction;
|
|
AEditField: TAction;
|
|
AResourceEdit: TAction;
|
|
AResourceDelete: TAction;
|
|
AResourceAdd: TAction;
|
|
AShowConnections: TAction;
|
|
alResources: TActionList;
|
|
ILResources: TImageList;
|
|
LFrame: TLabel;
|
|
LResources: TLabel;
|
|
PDock: TPanel;
|
|
PResources: TPanel;
|
|
Splitter1: TSplitter;
|
|
TBResources: TToolBar;
|
|
TBShowConnectionsPane: TToolButton;
|
|
ToolButton1: TToolButton;
|
|
TBResourceAdd: TToolButton;
|
|
TBResourceEdit: TToolButton;
|
|
TBResourceDelete: TToolButton;
|
|
ToolButton2: TToolButton;
|
|
ToolButton3: TToolButton;
|
|
ToolButton4: TToolButton;
|
|
ToolButton5: TToolButton;
|
|
TVResources: TTreeView;
|
|
procedure AAddFieldExecute(Sender: TObject);
|
|
procedure AAddFieldUpdate(Sender: TObject);
|
|
procedure ADeleteFieldExecute(Sender: TObject);
|
|
procedure ADeleteFieldUpdate(Sender: TObject);
|
|
procedure AEditFieldExecute(Sender: TObject);
|
|
procedure AEditFieldUpdate(Sender: TObject);
|
|
procedure AResourceAddExecute(Sender: TObject);
|
|
procedure AResourceDeleteExecute(Sender: TObject);
|
|
procedure AResourceDeleteUpdate(Sender: TObject);
|
|
procedure AResourceEditExecute(Sender: TObject);
|
|
procedure AResourceEditUpdate(Sender: TObject);
|
|
procedure AShowConnectionsExecute(Sender: TObject);
|
|
procedure AShowConnectionsUpdate(Sender: TObject);
|
|
procedure TVResourcesChange(Sender: TObject; Node: TTreeNode);
|
|
procedure TVResourcesDblClick(Sender: TObject);
|
|
procedure TVResourcesDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
procedure TVResourcesDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
procedure TVResourcesEdited(Sender: TObject; Node: TTreeNode; var S: string);
|
|
procedure TVResourcesEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
|
|
private
|
|
FConnectionPane: TWinControl;
|
|
FConnections: TSQLDBRestConnectionList;
|
|
FOnChanged: TNotifyEvent;
|
|
FSchema: TMySQLDBRestSchema;
|
|
FImportOpts : TRestFieldOptions;
|
|
FCurrentFrame : TBaseEditFrame;
|
|
FSchemaNode : TTreeNode;
|
|
FModified : Boolean;
|
|
// Data handling
|
|
Procedure Changed;
|
|
procedure DoFieldListChanged(Sender: TObject);
|
|
function GetModified: Boolean;
|
|
Function SelectedResource : TMySQLDBRestResource;
|
|
Function SelectedField : TSQLDBRestField;
|
|
function AddFieldToResource(aResource: TMySQLDBRestResource): TSQLDBRestField;
|
|
function AddResource: TMySQLDBRestResource;
|
|
Procedure DeleteResource(R : TMySQLDBRestResource);
|
|
Procedure DeleteField(F : TSQLDBRestField);
|
|
Function ImportResource(aConnection: TMySQLDBRestConnection; const ATableName: UTF8String; AMinFieldOptions : TRestFieldOptions = []) : TTreeNode;
|
|
// Various editors
|
|
procedure ConfigFrame(F: TBaseEditFrame; aData: TObject);
|
|
procedure RemoveCurrentFrame(DoRefreshNode: Boolean=True);
|
|
procedure ShowFieldEditor(aField: TSQLDBRestField);
|
|
procedure ShowSchemaEditor(aSchema : TSQLDBRestSchema);
|
|
procedure ShowResourceEditor(aResource: TMySQLDBRestResource);
|
|
procedure ShowFieldsEditor(aResource: TMySQLDBRestResource);
|
|
// Various dialogs
|
|
procedure ShowDialogForObject(aData : TObject);
|
|
function ShowEditFrameInForm(aFrame: TBaseEditFrame; aData : TObject): Boolean;
|
|
procedure ShowResourceDialog(aResource: TMySQLDBRestResource);
|
|
procedure ShowFieldDialog(aField: TSQLDBRestField);
|
|
// Tree node handling/filling
|
|
procedure ChangeResourceName(R: TMySQLDBRestResource; Node: TTreeNode; var S: string);
|
|
procedure ChangeRestFieldName(F: TSQLDBRestField; Node: TTreeNode; var S: string);
|
|
procedure DoOnSelectResource(Sender: TObject);
|
|
procedure DoOnSelectField(Sender: TObject);
|
|
procedure RefreshNode(aData: TObject);
|
|
Function AddResourceToTree(Res: TMySQLDBRestResource) : TTreeNode;
|
|
function FindFieldNode(aResource: TSQLDBRestField): TTreeNode;
|
|
function FindResourceNode(aResource: TSQLDBRestResource): TTreeNode;
|
|
function FindResourceFieldsNode(aResource: TSQLDBRestResource): TTreeNode;
|
|
procedure ShowResource(aNode: TTreeNode; aResource: TMySQLDBRestResource);
|
|
procedure ShowResourceFields(aNode: TTreeNode; aResource: TMySQLDBRestResource);
|
|
procedure ShowRestField(aNode: TTreeNode; aField: TSQLDBRestField);
|
|
Function DoCheckSave : Boolean;
|
|
public
|
|
Constructor Create(aOwner : TComponent); override;
|
|
Destructor Destroy; override;
|
|
Procedure LoadSession(aStorage : TCustomPropertyStorage); virtual;
|
|
Procedure SaveSession(aStorage : TCustomPropertyStorage); virtual;
|
|
Procedure ClearSchema;
|
|
Function CheckSave : Boolean;
|
|
Property Modified : Boolean Read GetModified;
|
|
Procedure LoadFromFile(const aFileName : String);
|
|
Procedure SaveToFile(const aFileName : String);
|
|
Procedure ShowResources;
|
|
Property ImportOpts : TRestFieldOptions Read FImportOpts;
|
|
Property ConnectionPane : TWinControl Read FConnectionPane Write FConnectionPane;
|
|
Property Schema : TMySQLDBRestSchema Read FSchema;
|
|
Property Connections : TSQLDBRestConnectionList Read FConnections Write FConnections;
|
|
Property OnChanged : TNotifyEvent Read FOnChanged Write FOnChanged;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses typinfo,dialogs, dlgrestfieldoptions, frasqldbrestresourceedit, frasqldbresourcefields, frasqldbrestfieldedit, fraschematableseditor, frmeditframedialog;
|
|
|
|
{$R *.lfm}
|
|
|
|
|
|
|
|
{ TSQLDBRestSchemaEditorFrame }
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.RefreshNode(aData : TObject);
|
|
|
|
Var
|
|
R : TMySQLDBRestResource;
|
|
F : TSQLDBRestField;
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
if AData is TSQLDBRestSchema then
|
|
ShowResources
|
|
else if AData is TMySQLDBRestResource then
|
|
begin
|
|
R:=AData as TMySQLDBRestResource;
|
|
N:=FindResourceNode(R);
|
|
if Assigned(N) then
|
|
ShowResource(N,R);
|
|
end
|
|
else if (aData is TSQLDBRestField) then
|
|
begin
|
|
F:=aData as TSQLDBRestField;
|
|
N:=FindFieldNode(F);
|
|
If Assigned(N) then
|
|
ShowRestField(N,F);
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.RemoveCurrentFrame(DoRefreshNode : Boolean = True);
|
|
begin
|
|
// Dochecksave does no Changed, changed is called after node is refreshed
|
|
if DoCheckSave then
|
|
begin
|
|
if DoRefreshNode then
|
|
RefreshNode(FCurrentFrame.FrameData);
|
|
Changed;
|
|
end;
|
|
FreeAndNil(FCurrentFrame);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ConfigFrame(F: TBaseEditFrame; aData : TObject);
|
|
|
|
begin
|
|
if aData=Nil then
|
|
Raise ESQLDBRest.CreateFmt(0,'Internalerror : no data passed for frame %s',[F.ClassName]);
|
|
With F do
|
|
begin
|
|
Parent:=PDock;
|
|
Align:=alClient;
|
|
Connections:=Self.Connections;
|
|
FrameData:=aData;
|
|
MinFieldOptions:=ImportOpts;
|
|
LFrame.Caption:=F.FrameCaption;
|
|
end;
|
|
FCurrentFrame:=F;
|
|
end;
|
|
|
|
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowResourceEditor(aResource: TMySQLDBRestResource);
|
|
|
|
Var
|
|
F : TSQLDBRestResourceEditFrame;
|
|
|
|
begin
|
|
RemoveCurrentFrame;
|
|
F:=TSQLDBRestResourceEditFrame.Create(Self);
|
|
F.OnFieldsChanged:=@DoFieldListChanged;
|
|
F.OnSelectField:=@DoOnSelectField;
|
|
ConfigFrame(F,aResource);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowFieldsEditor(aResource: TMySQLDBRestResource);
|
|
|
|
Var
|
|
F : TResourceFieldsEditFrame;
|
|
|
|
begin
|
|
RemoveCurrentFrame;
|
|
F:=TResourceFieldsEditFrame.Create(Self);
|
|
F.OnSelectField:=@DoOnSelectField;
|
|
ConfigFrame(F,aResource);
|
|
end;
|
|
|
|
|
|
function TSQLDBRestSchemaEditorFrame.ShowEditFrameInForm(aFrame: TBaseEditFrame; aData : TObject): Boolean;
|
|
|
|
Var
|
|
Frm : TEditFrameForm;
|
|
|
|
begin
|
|
Frm:=TEditFrameForm.Create(Self);
|
|
try
|
|
AFrame.Connections:=Self.Connections;
|
|
AFrame.FrameData:=aData;
|
|
Frm.EditFrame:=aFrame;
|
|
Result:=frm.ShowModal=mrOK;
|
|
aFrame.Free;
|
|
finally
|
|
Frm.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowResourceDialog(aResource: TMySQLDBRestResource);
|
|
|
|
Var
|
|
F : TSQLDBRestResourceEditFrame;
|
|
N : TTreeNode;
|
|
begin
|
|
F:=TSQLDBRestResourceEditFrame.Create(Self);
|
|
if ShowEditFrameInForm(F,aResource) then
|
|
begin
|
|
N:=FindResourceNode(aResource);
|
|
if Assigned(N) then
|
|
begin
|
|
ShowResource(N,aResource);
|
|
TVResources.Selected:=N;
|
|
end;
|
|
Changed;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowFieldDialog(aField: TSQLDBRestField);
|
|
|
|
Var
|
|
F : TSQLDBRestFieldEditFrame;
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
F:=TSQLDBRestFieldEditFrame.Create(Self);
|
|
if ShowEditFrameInForm(F,aField) then // Frees frame;
|
|
begin
|
|
N:=FindFieldNode(aField);
|
|
if Assigned(N) then
|
|
begin
|
|
ShowRestField(N,aField);
|
|
TVResources.Selected:=N;
|
|
end;
|
|
Changed;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowFieldEditor(aField: TSQLDBRestField);
|
|
|
|
Var
|
|
F : TSQLDBRestFieldEditFrame;
|
|
|
|
begin
|
|
RemoveCurrentFrame;
|
|
F:=TSQLDBRestFieldEditFrame.Create(Self);
|
|
ConfigFrame(F,aField);
|
|
F.Field:=aField;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.FindResourceNode(
|
|
aResource: TSQLDBRestResource): TTreeNode;
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
N:=TVResources.Items.FindNodeWithData(aResource);
|
|
if Assigned(N) then
|
|
if N.ImageIndex<>idxTable then
|
|
N:=N.Parent;
|
|
Result:=N;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.FindResourceFieldsNode(aResource: TSQLDBRestResource): TTreeNode;
|
|
|
|
begin
|
|
Result:=FindResourceNode(aResource);
|
|
if Result<>Nil then
|
|
begin
|
|
Result:=Result.GetFirstChild;
|
|
While (Result<>Nil) and (Result.ImageIndex<>idxFields) do
|
|
Result:=Result.GetNextSibling;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.DoOnSelectResource(Sender : TObject);
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
if (Sender is TSQLDBRestResource) then
|
|
begin
|
|
N:=FindResourceNode(Sender as TSQLDBRestResource);
|
|
if Assigned(N) then
|
|
TVResources.Selected:=N;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.DoOnSelectField(Sender: TObject);
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
if (Sender is TSQLDBRestField) then
|
|
begin
|
|
N:=FindFieldNode(Sender as TSQLDBRestField);
|
|
if Assigned(N) then
|
|
TVResources.Selected:=N;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowSchemaEditor(aSchema: TSQLDBRestSchema);
|
|
Var
|
|
F : TSQLDBRestSchemaTablesEditFrame;
|
|
|
|
begin
|
|
RemoveCurrentFrame;
|
|
F:=TSQLDBRestSchemaTablesEditFrame.Create(Self);
|
|
ConfigFrame(F,aSchema);
|
|
F.OnSelectResource:=@DoOnSelectResource;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesChange(Sender: TObject; Node: TTreeNode);
|
|
begin
|
|
Case Node.ImageIndex of
|
|
idxConnection : ShowSchemaEditor(TSQLDBRestSchema(Node.Data));
|
|
idxTableInfo,
|
|
idxTable : ShowResourceEditor(TMySQLDBRestResource(Node.Data));
|
|
idxField : ShowFieldEditor(TSQLDBRestField(Node.Data));
|
|
idxFields : ShowFieldsEditor(TMySQLDBRestResource(Node.Data));
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowDialogForObject(aData : TObject);
|
|
|
|
begin
|
|
if aData is TMySQLDBRestResource then
|
|
ShowResourceDialog(aData as TMySQLDBRestResource)
|
|
else if aData is TSQLDBRestField then
|
|
ShowFieldDialog(aData as TSQLDBRestField);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesDblClick(Sender: TObject);
|
|
begin
|
|
if Assigned(TVResources.Selected) then
|
|
if Assigned(TVResources.Selected.Data) then
|
|
ShowDialogForObject(TObject(TVResources.Selected.Data));
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.ImportResource(
|
|
aConnection: TMySQLDBRestConnection; const ATableName: UTF8String;
|
|
AMinFieldOptions: TRestFieldOptions): TTreeNode;
|
|
|
|
Var
|
|
Res : TSQLDBRestResource;
|
|
N : String;
|
|
i : Integer;
|
|
|
|
begin
|
|
N:=aTableName;
|
|
I:=0;
|
|
Res:=Schema.Resources.FindResourceByName(N);
|
|
While Res<>Nil do
|
|
begin
|
|
Inc(i);
|
|
N:=aTableName+IntToStr(I);
|
|
Res:=Schema.Resources.FindResourceByName(N);
|
|
end;
|
|
Res:=Schema.Resources.AddResource(aTableName,N);
|
|
Schema.PopulateResourceFields(aConnection.MyConnection,Res,AMinFieldOptions);
|
|
Result:=AddResourceToTree(Res as TMySQLDBRestResource);
|
|
Changed;
|
|
end;
|
|
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
Var
|
|
I : Integer;
|
|
SDO : TStringsDragObject;
|
|
TN : TTreeNode;
|
|
|
|
begin
|
|
SDO:=Source as TStringsDragObject;
|
|
TN:=nil;
|
|
// FImportOpts so we reuse them
|
|
if GetRestFieldOptions(FimportOpts) then
|
|
For I:=SDO.Items.Count-1 downto 0 do
|
|
TN:=ImportResource(SDO.Items.Objects[i] as TMySQLDBRestConnection,SDO.Items[i],FimportOpts);
|
|
if TN<>Nil then
|
|
begin
|
|
TN.Expanded:=True;
|
|
TVResources.Selected:=TN;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesDragOver(Sender,
|
|
Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
|
|
begin
|
|
Accept:=(Source is TStringsDragObject) and (TStringsDragObject(Source).Items.Count>0);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ChangeResourceName(R : TMySQLDBRestResource; Node: TTreeNode; var S: string);
|
|
|
|
Var
|
|
DR : TMySQLDBRestResource;
|
|
|
|
begin
|
|
DR:=TMySQLDBRestResource(Schema.Resources.FindResourceByName(S));
|
|
if (DR<>Nil) and (DR<>R) then
|
|
begin
|
|
ShowMessage(Format(SErrDuplicateResource,[DR.ResourceName]));
|
|
S:=R.ResourceName;
|
|
end
|
|
else
|
|
begin
|
|
if FCurrentFrame is TSQLDBRestResourceEditFrame then
|
|
RemoveCurrentFrame(True);
|
|
R.ResourceName:=S;
|
|
ShowResourceEditor(R);
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ChangeRestFieldName(F : TSQLDBRestField; Node: TTreeNode; var S: string);
|
|
|
|
Var
|
|
DF : TSQLDBRestField;
|
|
|
|
begin
|
|
DF:=(F.Collection as TSQLDBRestFieldList).FindByPublicName(S);
|
|
if (DF<>Nil) and (DF<>F) then
|
|
begin
|
|
ShowMessage(Format(SErrDuplicateField,[DF.PublicName]));
|
|
S:=F.PublicName;
|
|
end
|
|
else
|
|
begin
|
|
if FCurrentFrame is TSQLDBRestFieldEditFrame then
|
|
RemoveCurrentFrame(True);
|
|
F.PublicName:=S;
|
|
ShowFieldEditor(F);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesEdited(Sender: TObject; Node: TTreeNode; var S: string);
|
|
|
|
begin
|
|
if TObject(Node.Data) is TMySQLDBRestResource then
|
|
ChangeResourceName(TMySQLDBRestResource(Node.Data),Node,S)
|
|
else if TObject(Node.Data) is TSQLDBRestField then
|
|
ChangeRestFieldName(TSQLDBRestField(Node.Data),Node,S)
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.TVResourcesEditing(Sender: TObject; Node: TTreeNode; var AllowEdit: Boolean);
|
|
begin
|
|
AllowEdit:=(Node.ImageIndex in [idxTable,idxField]);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.Changed;
|
|
begin
|
|
FModified:=True;
|
|
if Assigned(FOnChanged) then
|
|
FOnChanged(FSchema);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.DoFieldListChanged(Sender: TObject);
|
|
|
|
Var
|
|
N: TTreeNode;
|
|
R : TMySQLDBRestResource;
|
|
|
|
begin
|
|
// Sender is resource.
|
|
R:=Sender as TMySQLDBRestResource;
|
|
N:=FindResourceNode(R);
|
|
if Assigned(N) then
|
|
ShowResource(N,R);
|
|
end;
|
|
|
|
|
|
function TSQLDBRestSchemaEditorFrame.FindFieldNode(aResource: TSQLDBRestField): TTreeNode;
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
N:=TVResources.Items.FindNodeWithData(aResource);
|
|
if N.ImageIndex=idxField then
|
|
Result:=N
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.SelectedResource: TMySQLDBRestResource;
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
N:=TVResources.Selected;
|
|
While (N<>Nil) and (N.ImageIndex<>idxTable) do
|
|
N:=N.Parent;
|
|
if Assigned(N) and (TObject(N.Data) is TMySQLDBRestResource) then
|
|
Result:=TMySQLDBRestResource(N.Data)
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.GetModified: Boolean;
|
|
begin
|
|
Result:=FModified;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.SelectedField: TSQLDBRestField;
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
|
|
begin
|
|
N:=TVResources.Selected;
|
|
While (N<>Nil) and (N.ImageIndex<>idxField) do
|
|
N:=N.Parent;
|
|
if Assigned(N) and (TObject(N.Data) is TSQLDBRestField) then
|
|
Result:=TSQLDBRestField(N.Data)
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
|
|
constructor TSQLDBRestSchemaEditorFrame.Create(aOwner: TComponent);
|
|
begin
|
|
inherited Create(aOwner);
|
|
FSchema:=TMySQLDBRestSchema.Create(Self);
|
|
ShowResources;
|
|
FImportOpts:=[foInInsert,foInUpdate,foFilter,foOrderBy,foOrderByDesc];
|
|
end;
|
|
|
|
destructor TSQLDBRestSchemaEditorFrame.Destroy;
|
|
begin
|
|
FreeAndNil(FSchema);
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.LoadSession(aStorage: TCustomPropertyStorage);
|
|
|
|
Var
|
|
S : String;
|
|
i : Integer;
|
|
|
|
begin
|
|
With aStorage do
|
|
begin
|
|
PResources.Width:=ReadInteger('ResourceWidth',PResources.Width);
|
|
S:=ReadString('ResourceImportFieldOpts','');
|
|
if S<>'' then
|
|
Try
|
|
I:=StringToSet(PTypeInfo(TypeInfo(TRestFieldOptions)),S);
|
|
FImportOpts:=TRestFieldOptions(I);
|
|
except
|
|
On E : EPropertyError do
|
|
begin
|
|
// Silently Ignore this one
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.SaveSession(aStorage: TCustomPropertyStorage);
|
|
begin
|
|
With aStorage do
|
|
begin
|
|
WriteInteger('ResourceWidth',PResources.Width);
|
|
WriteString('ResourceImportFieldOpts',SetToString(PTypeInfo(TypeInfo(TRestFieldOptions)),Integer(FImportOpts),False));
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ClearSchema;
|
|
begin
|
|
RemoveCurrentFrame(False);
|
|
Schema.Resources.Clear;
|
|
ShowResources;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.CheckSave: Boolean;
|
|
begin
|
|
Result:=DoCheckSave;
|
|
if Result then
|
|
Changed;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.LoadFromFile(const aFileName: String);
|
|
begin
|
|
Schema.LoadFromFile(aFilename);
|
|
ShowResources;
|
|
FModified:=False;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.SaveToFile(const aFileName: String);
|
|
begin
|
|
Schema.SaveToFile(aFilename);
|
|
FModified:=False;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowRestField(aNode : TTreeNode; aField : TSQLDBRestField);
|
|
|
|
begin
|
|
aNode.DeleteChildren;
|
|
aNode.Text:=aField.PublicName;
|
|
aNode.ImageIndex:=idxField;
|
|
aNode.SelectedIndex:=idxField;
|
|
aNode.Data:=aField;
|
|
if (foInKey in aField.Options) then
|
|
aNode.StateIndex:=idxKeyField;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.DoCheckSave: Boolean;
|
|
begin
|
|
Result:=Assigned(FCurrentFrame) and FCurrentFrame.Modified;
|
|
if Result then
|
|
FCurrentFrame.SaveData;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowResourceFields(aNode : TTreeNode; aResource : TMySQLDBRestResource);
|
|
|
|
Var
|
|
FN,PN : TTreeNode;
|
|
F : TSQLDBRestField;
|
|
I : Integer;
|
|
|
|
begin
|
|
PN:=aNode.TreeNodes.AddChild(aNode,SFields);
|
|
PN.Data:=aResource;
|
|
PN.ImageIndex:=idxFields;
|
|
PN.SelectedIndex:=idxFields;
|
|
For I:=0 to aResource.Fields.Count-1 do
|
|
begin
|
|
F:=aResource.Fields[i];
|
|
FN:=PN.TreeNodes.AddChild(PN,F.PublicName);
|
|
ShowRestField(FN,F);
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowResource(aNode : TTreeNode; aResource : TMySQLDBRestResource);
|
|
|
|
Var
|
|
N : TTreeNode;
|
|
S : String;
|
|
|
|
begin
|
|
aNode.DeleteChildren;
|
|
aNode.Text:=aResource.ResourceName;
|
|
aNode.ImageIndex:=idxTable;
|
|
aNode.SelectedIndex:=idxTable;
|
|
aNode.Data:=aResource;
|
|
S:=Format(SPropTableName,[aResource.TableName]);
|
|
if (aResource.ConnectionName<>'') then
|
|
S:=S+', '+Format(SPropConnection,[aResource.ConnectionName]);
|
|
N:=aNode.TreeNodes.AddChild(aNode,S);
|
|
N.Data:=aResource;
|
|
N.ImageIndex:=idxTableInfo;
|
|
N.SelectedIndex:=idxTableInfo;
|
|
ShowResourceFields(aNode,aResource)
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.AddResourceToTree(Res: TMySQLDBRestResource): TTreeNode;
|
|
|
|
begin
|
|
Result:=TVResources.Items.AddChild(FSchemaNode,Res.ResourceName);
|
|
ShowResource(Result,Res);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ShowResources;
|
|
|
|
Var
|
|
I : integer;
|
|
S : String;
|
|
|
|
begin
|
|
RemoveCurrentFrame(False);
|
|
TVResources.Selected:=Nil; // Force refresh
|
|
With TVResources.Items do
|
|
try
|
|
BeginUpdate;
|
|
if FSchemaNode=Nil then
|
|
begin
|
|
S:=Schema.Name;
|
|
if S='' then
|
|
S:=SSchema;
|
|
FSchemaNode:=TVResources.Items.AddChild(Nil,SSchema);
|
|
FSchemaNode.Data:=Schema;
|
|
FSchemaNode.ImageIndex:=idxConnection;
|
|
end
|
|
else
|
|
FSchemaNode.DeleteChildren;
|
|
for I:=0 to Schema.Resources.Count-1 do
|
|
AddResourceToTree(Schema.Resources[i] as TMySQLDBRestResource);
|
|
FSchemaNode.Expand(False);
|
|
finally
|
|
EndUpdate;
|
|
end;
|
|
TVResources.Selected:=FSchemaNode;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AShowConnectionsUpdate(Sender: TObject);
|
|
begin
|
|
With (Sender as TAction) do
|
|
begin
|
|
Visible:=Assigned(ConnectionPane);
|
|
if Visible then
|
|
Enabled:=not ConnectionPane.Visible;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AShowConnectionsExecute(Sender: TObject);
|
|
begin
|
|
if Assigned(ConnectionPane) then
|
|
ConnectionPane.Visible:=True;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AResourceAddExecute(Sender: TObject);
|
|
|
|
begin
|
|
AddResource;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AAddFieldUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=(SelectedResource<>Nil)
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ADeleteFieldExecute(Sender: TObject);
|
|
Var
|
|
R : TMySQLDBRestResource;
|
|
F : TSQLDBRestField;
|
|
|
|
begin
|
|
F:=SelectedField;
|
|
R:=SelectedResource;
|
|
if Assigned(F) and (QuestionDlg(SDeleteFieldCaption, Format(SDeleteFieldMsg, [F.PublicName,R.ResourceName, LineEnding]),
|
|
mtWarning, [mrYes, SYesDelete, mrNo, SNoDoNotDelete], 0) = mrYes) then
|
|
DeleteField(F);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.ADeleteFieldUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as Taction).Enabled:=(SelectedField<>Nil)
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AEditFieldExecute(Sender: TObject);
|
|
|
|
Var
|
|
F : TSQLDBRestField;
|
|
|
|
|
|
begin
|
|
F:=SelectedField;
|
|
if (F<>Nil) then
|
|
ShowFieldDialog(F);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AEditFieldUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=(SelectedField<>Nil);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AAddFieldExecute(Sender: TObject);
|
|
begin
|
|
if (SelectedResource<>Nil) then
|
|
AddFieldToResource(SelectedResource);
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.AddFieldToResource(aResource: TMySQLDBRestResource): TSQLDBRestField;
|
|
|
|
Var
|
|
N : String;
|
|
F : TSQLDBRestField;
|
|
PN,FN : TTreeNode;
|
|
|
|
begin
|
|
N:='Field'+IntToStr(aResource.Fields.Count+1);
|
|
Repeat
|
|
F:=Nil;
|
|
// Maybe ask field name ?
|
|
If Not InputQuery(SNewField,Format(SNameForField,[aResource.ResourceName]),N) then
|
|
N:=''
|
|
else
|
|
begin
|
|
F:=aResource.Fields.FindByPublicName(N);
|
|
if F<>Nil then
|
|
ShowMessage(Format(SErrDuplicateField,[N]));
|
|
end;
|
|
Until (F=nil) or (N='');
|
|
if N='' then
|
|
exit;
|
|
Result:=aResource.Fields.AddField(N,rftString,FImportOpts);
|
|
PN:=FindResourceFieldsNode(aResource);
|
|
if Not assigned(PN) then
|
|
Raise ESQLDBRest.CreateFmt(0,'Internal error: Cannot find node for fields for resource %s',[aResource.ResourceName]);
|
|
FN:=TVResources.Items.AddChild(PN,Result.PublicName);
|
|
ShowRestField(FN,Result);
|
|
TVResources.Selected:=FN;
|
|
Changed;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AResourceDeleteExecute(Sender: TObject);
|
|
|
|
Var
|
|
R : TMySQLDBRestResource;
|
|
|
|
begin
|
|
R:=SelectedResource;
|
|
if Assigned(R) and (QuestionDlg(SDeleteResourceCaption, Format(SDeleteResourceMsg, [R.ResourceName, LineEnding]),
|
|
mtWarning, [mrYes, SYesDelete, mrNo, SNoDoNotDelete], 0) = mrYes) then
|
|
DeleteResource(R);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AResourceDeleteUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as Taction).Enabled:=(SelectedResource<>Nil)
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AResourceEditExecute(Sender: TObject);
|
|
|
|
Var
|
|
R : TMySQLDBRestResource;
|
|
|
|
begin
|
|
R:=SelectedResource;
|
|
if (R<>Nil) then
|
|
ShowResourceDialog(R);
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.AResourceEditUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as Taction).Enabled:=SelectedResource<>Nil;
|
|
end;
|
|
|
|
function TSQLDBRestSchemaEditorFrame.AddResource: TMySQLDBRestResource;
|
|
|
|
Var
|
|
N : String;
|
|
R : TSQLDBRestResource;
|
|
|
|
begin
|
|
N:='Resource'+IntToStr(Schema.Resources.Count+1);
|
|
Repeat
|
|
R:=Nil;
|
|
// Maybe ask table name ?
|
|
If Not InputQuery(SNewResource,SNameForResource,N) then
|
|
N:=''
|
|
else
|
|
begin
|
|
R:=Schema.Resources.FindResourceByName(N);
|
|
if R<>Nil then
|
|
ShowMessage(Format(SErrDuplicateResource,[N]));
|
|
end;
|
|
Until (R=nil) or (N='');
|
|
if N='' then
|
|
Result:=nil
|
|
else
|
|
begin
|
|
// Maybe check table name ?
|
|
Result:=Schema.Resources.AddResource(N,N) as TMySQLDBRestResource;
|
|
Changed;
|
|
TVResources.Selected:=AddResourceToTree(Result);
|
|
TVResources.Selected.Expanded:=True;
|
|
end;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.DeleteResource(R: TMySQLDBRestResource);
|
|
|
|
Var
|
|
NCurrent,NNext : TTreeNode;
|
|
|
|
begin
|
|
RemoveCurrentFrame(False);
|
|
NCurrent:=FindResourceNode(R);
|
|
if Assigned(NCurrent) then
|
|
begin
|
|
NNext:=NCurrent.GetNextSibling;
|
|
if NNext=Nil then
|
|
NNext:=NCurrent.GetPrevSibling;
|
|
end;
|
|
if NNext=Nil then
|
|
NNext:=FSchemaNode;
|
|
if Assigned(NCurrent) then
|
|
TVResources.Items.Delete(NCurrent);
|
|
TVResources.Selected:=NNext;
|
|
R.Free;
|
|
Changed;
|
|
end;
|
|
|
|
procedure TSQLDBRestSchemaEditorFrame.DeleteField(F: TSQLDBRestField);
|
|
|
|
Var
|
|
NCurrent,NNext : TTreeNode;
|
|
|
|
begin
|
|
RemoveCurrentFrame(False);
|
|
NCurrent:=FindFieldNode(F);
|
|
if Assigned(NCurrent) then
|
|
begin
|
|
NNext:=NCurrent.GetNextSibling;
|
|
if NNext=Nil then
|
|
NNext:=NCurrent.GetPrevSibling;
|
|
if NNext=Nil then
|
|
NNext:=NCurrent.Parent;
|
|
end;
|
|
if NNext=Nil then
|
|
begin
|
|
NNext:=TVResources.Selected;
|
|
While (NNext<>Nil) and Not(NNext.ImageIndex in [idxFields,idxTable]) do
|
|
NNext:=NNext.Parent;
|
|
if NNext=Nil then
|
|
NNext:=FSchemaNode;
|
|
end;
|
|
if Assigned(NCurrent) then
|
|
TVResources.Items.Delete(NCurrent);
|
|
TVResources.Selected:=NNext;
|
|
F.Free;
|
|
Changed;
|
|
end;
|
|
|
|
end.
|
|
|