File: fpcodegenerator.pp

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (196 lines) | stat: -rw-r--r-- 4,601 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
unit fpcodegenerator;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LazUTF8, db, fpddCodegen, fpDataDict, Controls;
  
Type
  { TFPCodeGenerator }

  TFPCodeGenerator = Class(TComponent)
  Private
    FDataset : TDataset;
    FFieldDefs : TDDFieldDefs;
    FFileName: String;
    FGenerator : TDDCustomCodeGenerator;
    FShowResult: Boolean;
    FSQL: TStrings;
    FTableNameHint: String;
    function SelectGenerator: TCodeGeneratorItem;
    procedure SetDataset(const AValue: TDataset);
    procedure SetFieldDefs(const AValue: TDDFieldDefs);
    procedure SetSQL(const AValue: TStrings);
    function SetupGenerator : Boolean;
    procedure ShowCode(L: TStrings);
  public
    Constructor Create(AOWner : TComponent); override;
    Destructor Destroy; override;
    Function Execute : Boolean;
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  Published
    Property Dataset : TDataset Read FDataset Write SetDataset;
    Property DDFieldDefs : TDDFieldDefs Read FFieldDefs Write SetFieldDefs;
    Property SQL : TStrings Read FSQL Write SetSQL;
    Property ShowResult : Boolean Read FShowResult Write FShowResult default true;
    Property FileName : String Read FFileName Write FFileName;
    Property TableNameHint : String Read FTableNameHint Write FTableNameHint;
  end;

implementation

uses typinfo, forms, frmSelectCodeGenerator, frmgeneratedcode, frmBaseConfigCodeGenerator;

{ TFPCodeGenerator }

procedure TFPCodeGenerator.SetDataset(const AValue: TDataset);
begin
  If (AValue<>FDataset) then
    begin
    If Assigned(FDataset) then
      FDataset.RemoveFreeNotification(Self);
    FDataset:=AValue;
    If Assigned(FDataset) then
      FDataset.FreeNotification(Self);
    end;
end;

procedure TFPCodeGenerator.SetFieldDefs(const AValue: TDDFieldDefs);
begin
  FFieldDefs.Assign(AVAlue);
end;

procedure TFPCodeGenerator.SetSQL(const AValue: TStrings);
begin
  if FSQL=AValue then exit;
  FSQL.Assign(AValue);
end;

constructor TFPCodeGenerator.Create(AOWner: TComponent);
begin
  inherited Create(AOWner);
  FShowResult:=True;
  FFieldDefs:=TDDFieldDefs.Create('dummy');
  FSQL:=TStringList.Create;
  If (AOwner is TDataset) then
    Dataset:=AOwner as TDataset;
end;

destructor TFPCodeGenerator.Destroy;
begin
  FreeAndNil(FFieldDefs);
  FreeAndNil(FSQL);
  inherited Destroy;
end;

function TFPCodeGenerator.SelectGenerator : TCodeGeneratorItem;

begin
  Result:=Nil;
  With TSelectCodeGeneratorForm.Create(Application) do
    try
      HaveSQL:=SQL.Count<>0;
      HaveFields:=Self.Dataset<>Nil;
      If (ShowModal=mrOK) then
        Result:=SelectedGenerator;
    finally
      Free;
    end;
end;

Function TFPCodeGenerator.SetupGenerator : boolean;

Var
  FP : TFieldPropDefs;
  F : TBaseConfigGeneratorForm;

begin
  If FGenerator.NeedsFieldDefs then
    begin
    FP:=FGenerator.Fields;
    if Assigned(Dataset) then
      FP.FromDataSet(Dataset)
    else
      FP.FromDDFieldDefs(FFieldDefs);
    end;
  If FGenerator.NeedsSQL then
    FGenerator.SQL:=Self.SQL;
  If (TableNameHint<>'') and IsPublishedProp(FGenerator.CodeOptions,'TableName') then
    SetStrProp(FGenerator.CodeOptions,'TableName',TableNameHint);
  F:=TBaseConfigGeneratorForm.Create(Application);
  try
    F.ShowExtra:=True;
    F.FileName:=Self.FileName;
    F.ShowResult:=Self.ShowResult;
    F.Generator:=Self.FGenerator;
    Result:=(F.ShowModal=mrOK);
    If result then
      begin
      Self.FileName   := F.FileName;
      Self.ShowResult := F.ShowResult;
      end;
  finally
    F.Free
  end;
end;

Procedure TFPCodeGenerator.ShowCode(L : TStrings);

begin
  With TCodeForm.Create(Self) do
    try
      Code:=L;
      ShowModal;
    Finally
      Free;
    end;
end;


function TFPCodeGenerator.Execute: Boolean;

Var
  G : TCodeGeneratorItem;
  L : TStrings;

begin
  G:=SelectGenerator;
  Result:=(G<>Nil);
  If Result then
    begin
    FGenerator:=G.GeneratorClass.Create(Self);
    Try
      if SetupGenerator then
        begin
        L:=TStringList.Create;
        try
          FGenerator.GenerateCode(L);
          If (FFileName<>'') then
            L.SaveToFile(UTF8ToSys(FFileName));
          If ShowResult then
            ShowCode(L);
        finally
          L.Free;
        end;
        end;
    Finally
      FreeAndNil(FGenerator);
    end;
    end;
end;

procedure TFPCodeGenerator.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  If (Operation=opRemove) then
    begin
    If (AComponent=FDataset) then
      FDataset:=Nil;
    end;
end;

end.