mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-30 17:22:42 +02:00
430 lines
9.8 KiB
ObjectPascal
430 lines
9.8 KiB
ObjectPascal
unit frmmain;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
// Define this if you want to use synapse.
|
|
{ $DEFINE USESYNAPSE}
|
|
|
|
// For 2.6.4, synapse is currently the only option.
|
|
// You will need to add lazsynapsewebclient to the requires list.
|
|
{$IFDEF VER2_6}
|
|
{$DEFINE USESYNAPSE}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
ComCtrls, ActnList, Menus, ListViewFilterEdit, restbase, googleclient,
|
|
googlediscovery, frmgenoptions, frmview;
|
|
|
|
type
|
|
|
|
{ TMainForm }
|
|
|
|
TMainForm = class(TForm)
|
|
APreViewRest: TAction;
|
|
AGenCode: TAction;
|
|
AViewHelp: TAction;
|
|
ASaveREST: TAction;
|
|
APreferredOnly: TAction;
|
|
AQuit: TAction;
|
|
AFetch: TAction;
|
|
ActionList1: TActionList;
|
|
EFilter: TEdit;
|
|
ILDiscovery: TImageList;
|
|
Label1: TLabel;
|
|
LVServices: TListView;
|
|
MainMenu1: TMainMenu;
|
|
MenuItem1: TMenuItem;
|
|
MenuItem2: TMenuItem;
|
|
MAPI: TMenuItem;
|
|
MenuItem3: TMenuItem;
|
|
MenuItem4: TMenuItem;
|
|
MenuItem5: TMenuItem;
|
|
MenuItem6: TMenuItem;
|
|
MIQuit: TMenuItem;
|
|
MIPreferredOnly: TMenuItem;
|
|
MServices: TMenuItem;
|
|
SDJSON: TSaveDialog;
|
|
SBDiscovery: TStatusBar;
|
|
ToolBar1: TToolBar;
|
|
ToolButton1: TToolButton;
|
|
ToolButton2: TToolButton;
|
|
ToolButton3: TToolButton;
|
|
ToolButton4: TToolButton;
|
|
ToolButton5: TToolButton;
|
|
ToolButton6: TToolButton;
|
|
procedure APreViewRestExecute(Sender: TObject);
|
|
procedure APreViewRestUpdate(Sender: TObject);
|
|
procedure ASaveRESTExecute(Sender: TObject);
|
|
procedure ASaveRESTUpdate(Sender: TObject);
|
|
procedure AGenCodeExecute(Sender: TObject);
|
|
procedure AGenCodeUpdate(Sender: TObject);
|
|
procedure AQuitExecute(Sender: TObject);
|
|
procedure AViewHelpExecute(Sender: TObject);
|
|
procedure AViewHelpUpdate(Sender: TObject);
|
|
procedure BFetchClick(Sender: TObject);
|
|
procedure CBPreferredOnlyChange(Sender: TObject);
|
|
procedure EFilterChange(Sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
FClient : TGoogleClient;
|
|
FDiscoveryAPI : TDiscoveryAPI;
|
|
FDirectory : TDirectoryList;
|
|
Function CurrentAPI : TDirectoryListTypeitemsItem;
|
|
procedure DoFetch;
|
|
procedure DownLoadRestAPI(Const AName,AURL: String);
|
|
procedure GenerateCode(const AName, AURL: String);
|
|
function HttpGetBinary(AURL: String; S: TStream): Boolean;
|
|
procedure ShowDiscovery(PreferredOnly: Boolean; FilterOn: String);
|
|
procedure UpdateCaption;
|
|
procedure ViewFile(AFileName: String);
|
|
procedure ViewFile(AStream: TStream; ASyntax: TSyntax; ACaption: String);
|
|
procedure ViewRestAPI(const AName, AURL: String);
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
MainForm: TMainForm;
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
uses
|
|
ssl_openssl,
|
|
jsonparser, // needed
|
|
fpoauth2, lclintf,
|
|
{$IFDEF USESYNAPSE}
|
|
synapsewebclient,
|
|
httpsend,
|
|
{$ELSE}
|
|
fphttpclient,
|
|
fphttpwebclient,
|
|
{$ENDIF}
|
|
googlediscoverytopas;
|
|
|
|
{ TMainForm }
|
|
|
|
procedure TMainForm.FormCreate(Sender: TObject);
|
|
begin
|
|
// set up communication.
|
|
FClient:=TGoogleClient.Create(Self);
|
|
{$IFDEF USESYNAPSE}
|
|
FClient.WebClient:=TSynapseWebClient.Create(Self);
|
|
{$ELSE}
|
|
FClient.WebClient:=TFPHTTPWebClient.Create(Self);
|
|
{$ENDIF}
|
|
// Register all classes so they can be streamed.
|
|
TDiscoveryAPI.RegisterAPIResources;
|
|
// create the API and hook it up to the google client.
|
|
FDiscoveryAPI:=TDiscoveryAPI.Create(Self);
|
|
FDiscoveryAPI.GoogleClient:=FClient;
|
|
// The code generator uses it's own objects.
|
|
TDiscoveryJSONToPas.RegisterAllObjects;
|
|
UpdateCaption;
|
|
end;
|
|
|
|
procedure TMainForm.BFetchClick(Sender: TObject);
|
|
|
|
begin
|
|
DoFetch;
|
|
end;
|
|
|
|
procedure TMainForm.AQuitExecute(Sender: TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TMainForm.AViewHelpExecute(Sender: TObject);
|
|
begin
|
|
OpenURL(CurrentAPI.DocumentationLink);
|
|
end;
|
|
|
|
procedure TMainForm.AViewHelpUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.documentationLink<>'');
|
|
end;
|
|
|
|
procedure TMainForm.ASaveRESTUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'');
|
|
end;
|
|
|
|
procedure TMainForm.AGenCodeExecute(Sender: TObject);
|
|
|
|
Var
|
|
DLI : TDirectoryListTypeitemsItem;
|
|
|
|
begin
|
|
DLI:=CurrentAPI;
|
|
GenerateCode(DLI.Name,DLI.DiscoveryRestUrl);
|
|
end;
|
|
|
|
procedure TMainForm.AGenCodeUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'')
|
|
end;
|
|
|
|
procedure TMainForm.ViewFile(AFileName : String);
|
|
|
|
begin
|
|
With TViewForm.Create(Nil) do
|
|
begin
|
|
Caption:='Viewing file: '+AFileName;
|
|
FileName:=AFileName;
|
|
Show;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ViewFile(AStream : TStream; ASyntax : TSyntax; ACaption : String);
|
|
|
|
begin
|
|
With TViewForm.Create(Nil) do
|
|
begin
|
|
AStream.POsition:=0;
|
|
Caption:='Viewing: '+ACaption;
|
|
Stream:=AStream;
|
|
Syntax:=ASyntax;
|
|
FreeStream:=True;
|
|
Show;
|
|
end;
|
|
end;
|
|
|
|
Function TMainForm.HttpGetBinary(AURL : String; S : TStream) : Boolean;
|
|
|
|
begin
|
|
{$IFDEF USESYNAPSE}
|
|
Result:=httpsend.HttpGetBinary(AURL,S);
|
|
{$ELSE}
|
|
try
|
|
TFPHTTPClient.SimpleGet(AURL,S);
|
|
S.Position:=0;
|
|
Result:=True;
|
|
except
|
|
Result:=False;
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
procedure TMainForm.GenerateCode(const AName, AURL: String);
|
|
|
|
Var
|
|
S : TMemoryStream;
|
|
FO : TGenCodeFormOptions;
|
|
DP : TDiscoveryJSONToPas;
|
|
|
|
begin
|
|
FO:=Nil;
|
|
DP:=Nil;
|
|
S:=TMemoryStream.Create;
|
|
try
|
|
if HttpGetBinary(AURL,S) then
|
|
begin
|
|
S.Position:=0;
|
|
FO:=TGenCodeFormOptions.Create(Self);
|
|
FO.UnitName:=AName;
|
|
If FO.ShowModal=mrOK then
|
|
begin
|
|
DP:=TDiscoveryJSONToPas.Create(Self);
|
|
DP.LoadFromStream(S);
|
|
DP.BaseClassName:=FO.BaseClass;
|
|
DP.OutputUnitName:=FO.UnitName;
|
|
DP.ExtraUnits:=FO.ExtraUnits;
|
|
DP.ClassPrefix:=FO.Prefix;
|
|
DP.SaveToFile(FO.FileName);
|
|
if FO.DoPreview then
|
|
ViewFile(FO.FileName);
|
|
end;
|
|
end;
|
|
Finally
|
|
FO.Free;
|
|
DP.Free;
|
|
S.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.DownLoadRestAPI(const AName, AURL: String);
|
|
|
|
Var
|
|
S : TMemoryStream;
|
|
|
|
begin
|
|
S:=TMemoryStream.Create;
|
|
try
|
|
if HttpGetBinary(AURL,S) then
|
|
begin
|
|
SDJSON.FileName:='google'+aname+'.json';
|
|
If SDJSON.Execute then
|
|
With TFileStream.Create(SDJSON.FileName,fmCreate) do
|
|
try
|
|
CopyFrom(S,0);
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
finally
|
|
S.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ViewRestAPI(const AName, AURL: String);
|
|
Var
|
|
S : TMemoryStream;
|
|
|
|
begin
|
|
S:=TMemoryStream.Create;
|
|
try
|
|
if HttpGetBinary(AURL,S) then
|
|
begin
|
|
ViewFile(S,sJSON,'REST discovery for '+AName);
|
|
S:=Nil;
|
|
end;
|
|
finally
|
|
S.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.ASaveRESTExecute(Sender: TObject);
|
|
|
|
Var
|
|
DLI : TDirectoryListTypeitemsItem;
|
|
begin
|
|
DLI:=CurrentAPI;
|
|
DownLoadRestAPI(DLI.Name,DLI.DiscoveryRestUrl);
|
|
end;
|
|
|
|
procedure TMainForm.APreViewRestUpdate(Sender: TObject);
|
|
begin
|
|
(Sender as TAction).Enabled:=Assigned(CurrentAPI) and (CurrentAPI.discoveryRestUrl<>'');
|
|
end;
|
|
|
|
procedure TMainForm.APreViewRestExecute(Sender: TObject);
|
|
|
|
Var
|
|
DLI : TDirectoryListTypeitemsItem;
|
|
|
|
begin
|
|
DLI:=CurrentAPI;
|
|
ViewRestAPI(DLI.Name,DLI.DiscoveryRestUrl);
|
|
end;
|
|
|
|
procedure TMainForm.CBPreferredOnlyChange(Sender: TObject);
|
|
begin
|
|
if (LVServices.Items.Count>0) then
|
|
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
|
|
end;
|
|
|
|
procedure TMainForm.EFilterChange(Sender: TObject);
|
|
begin
|
|
if (LVServices.Items.Count>0) then
|
|
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
|
|
end;
|
|
|
|
procedure TMainForm.UpdateCaption;
|
|
|
|
Var
|
|
C : Integer;
|
|
|
|
begin
|
|
C:=LVServices.Items.Count;
|
|
if (C=0) then
|
|
Caption:='Google Discovery Service Demo'
|
|
else
|
|
Caption:=Format('Google Discovery Service Demo (%d services)',[C]);
|
|
SBDiscovery.Panels[0].Text:=Format('%d items',[C]);
|
|
end;
|
|
|
|
function TMainForm.CurrentAPI: TDirectoryListTypeitemsItem;
|
|
begin
|
|
If Assigned(LVServices.Selected) and Assigned(LVServices.Selected.Data) then
|
|
Result:=TDirectoryListTypeitemsItem(LVServices.Selected.Data)
|
|
else
|
|
Result:=Nil;
|
|
end;
|
|
|
|
procedure TMainForm.ShowDiscovery(PreferredOnly : Boolean; FilterOn : String);
|
|
|
|
Function DoComma(S : TStringArray) : String;
|
|
Var
|
|
I : String;
|
|
begin
|
|
Result:='';
|
|
For I in S do
|
|
begin
|
|
if Result<>'' then
|
|
Result:=Result+',';
|
|
Result:=Result+I;
|
|
end;
|
|
end;
|
|
|
|
Function Contains(S: String) : Boolean; inline;
|
|
begin
|
|
Result:=Pos(FilterOn,LowerCase(S))<>0;
|
|
end;
|
|
|
|
Function ShowItem (DLI : TDirectoryListTypeitemsItem) : Boolean;
|
|
|
|
begin
|
|
Result:=DLI.Preferred or (Not PreferredOnly);
|
|
if Result and (FilterOn<>'') then
|
|
begin
|
|
Result:=Contains(DLI.Name)
|
|
or Contains(DLI.Title)
|
|
or Contains(DLI.kind)
|
|
or Contains(DLI.description)
|
|
or Contains(DoComma(DLI.Labels));
|
|
end;
|
|
end;
|
|
Var
|
|
DLI : TDirectoryListTypeitemsItem;
|
|
LI : TListItem;
|
|
|
|
begin
|
|
FilterOn:=LowerCase(Filteron);
|
|
LVServices.Items.BeginUpdate;
|
|
try
|
|
LVServices.Items.Clear;
|
|
LVServices.Column[1].Visible:=Not PreferredOnly;
|
|
For DLI in FDirectory.Items do
|
|
if ShowItem(DLI) then
|
|
begin
|
|
LI:=LVServices.Items.Add;
|
|
LI.Caption:=DLI.name;
|
|
LI.Data:=DLI;
|
|
With LI.SubItems,DLI do
|
|
begin
|
|
Add(BoolToStr(preferred,'True','False'));
|
|
Add(id);
|
|
Add(title);
|
|
Add(version);
|
|
Add(description);
|
|
Add(discoveryLink);
|
|
Add(discoveryRestUrl);
|
|
Add(documentationLink);
|
|
Add(icons.x16);
|
|
Add(icons.x32);
|
|
Add(DoComma(labels));
|
|
end;
|
|
end;
|
|
UpdateCaption;
|
|
finally
|
|
LVServices.Items.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TMainForm.DoFetch;
|
|
|
|
begin
|
|
// Free any previous list.
|
|
FreeAndNil(FDirectory);
|
|
// Get the new list using a default ApisResource.
|
|
FDirectory:=FDiscoveryAPI.ApisResource.List();
|
|
ShowDiscovery(MIPreferredOnly.Checked,EFilter.Text);
|
|
end;
|
|
|
|
end.
|
|
|