lazarus/components/sqldbrest/design/frasqldbrestschemaeditor.pp
2019-05-11 16:03:10 +00:00

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.