lazarus/components/fpweb/weblazideintf.pp
blikblum 7018a816fe fpweb/ideintf:
* Add initialization keyword according to resource type: fix compilation of initial project.
 * Don't add LResources unit to uses section direct since inherited takes care of that.

git-svn-id: trunk@26785 -
2010-07-22 20:23:11 +00:00

662 lines
19 KiB
ObjectPascal

{
Copyright (C) 2007 Michael Van Canneyt
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Library General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
for more details.
You should have received a copy of the GNU Library General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
}
{$mode objfpc}
{$H+}
unit WebLazIDEIntf;
{$IFNDEF VER2_2}
{$DEFINE HasFastCGISupport}
{$ENDIF VER2_2}
interface
uses
Classes, SysUtils, fpWeb, fpHTML, fpdatasetform,
Controls, Dialogs, forms, LazIDEIntf, ProjectIntf;
type
{ TCGIApplicationDescriptor }
TCGIApplicationDescriptor = class(TProjectDescriptor)
public
constructor Create; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function InitProject(AProject: TLazProject): TModalResult; override;
function CreateStartFiles(AProject: TLazProject): TModalResult; override;
end;
{ TApacheApplicationDescriptor }
TApacheApplicationDescriptor = class(TProjectDescriptor)
public
constructor Create; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function InitProject(AProject: TLazProject): TModalResult; override;
function CreateStartFiles(AProject: TLazProject): TModalResult; override;
end;
{ TCustomCGIApplicationDescriptor }
TCustomCGIApplicationDescriptor = class(TProjectDescriptor)
public
constructor Create; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function InitProject(AProject: TLazProject): TModalResult; override;
function CreateStartFiles(AProject: TLazProject): TModalResult; override;
end;
{$IFDEF HasFastCGISupport}
{ TCustomFCGIApplicationDescriptor }
TCustomFCGIApplicationDescriptor = class(TProjectDescriptor)
public
constructor Create; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function InitProject(AProject: TLazProject): TModalResult; override;
function CreateStartFiles(AProject: TLazProject): TModalResult; override;
end;
{ TFCGIApplicationDescriptor }
TFCGIApplicationDescriptor = class(TProjectDescriptor)
public
constructor Create; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function InitProject(AProject: TLazProject): TModalResult; override;
function CreateStartFiles(AProject: TLazProject): TModalResult; override;
end;
{$ENDIF HasFastCGISupport}
{ TFileDescPascalUnitWithCGIDataModule }
TFileDescWebDataModule = class(TFileDescPascalUnitWithResource)
public
constructor Create; override;
function GetInterfaceUsesSection: string; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function GetImplementationSource(const Filename, SourceName, ResourceName: string): string;override;
end;
TFileDescHTMLModule = class(TFileDescPascalUnitWithResource)
public
constructor Create; override;
function GetInterfaceUsesSection: string; override;
function GetLocalizedName: string; override;
function GetLocalizedDescription: string; override;
function GetImplementationSource(const Filename, SourceName, ResourceName: string): string;override;
end;
var
ProjectDescriptorCustomCGIApplication: TCustomCGIApplicationDescriptor;
ProjectDescriptorCGIApplication: TCGIApplicationDescriptor;
ProjectDescriptorApacheApplication: TApacheApplicationDescriptor;
{$IFDEF HasFastCGISupport}
ProjectDescriptorCustomFCGIApplication: TCustomFCGIApplicationDescriptor;
ProjectDescriptorFCGIApplication: TFCGIApplicationDescriptor;
{$ENDIF HasFastCGISupport}
FileDescriptorHTMLModule: TFileDescHTMLModule;
FileDescriptorWebModule: TFileDescWebDataModule;
procedure Register;
resourcestring
rsCGIApplicati = 'CGI Application';
rsCGIApplicati2 = 'CGI Application%sA CGI (Common Gateway Interface) '
+'program in Free Pascal using webmodules. The program source is '
+'automatically maintained by Lazarus.';
rsCustomCGIApp = 'Custom CGI Application';
rsCustomCGIApp2 = 'Custom CGI Application%sA CGI (Common Gateway Interface) '
+'program in Free Pascal. The program source is automatically maintained '
+'by Lazarus.';
rsWebModule = 'Web Module';
rsWEBModuleADa = 'WEB Module%sA datamodule for WEB (HTTP) applications.';
rsHTMLWebModul = 'HTML Web Module';
rsHTMLWEBModul2 = 'HTML WEB Module%sA Web datamodule for producing strict '
+'HTML.';
rsApacheModule = 'Apache Module';
rsApacheModule2 = 'Apache module%sAn Apache loadable module in Free Pascal '
+'using webmodules. The main library file is automatically maintained by '
+'Lazarus.';
rsCustomFastCG = 'Custom FastCGI Application';
rsCustomFastCG2 = 'Custom FastCGI Application%sA FastCGI (Common Gateway '
+'Interface) program in Free Pascal. The program source is automatically '
+'maintained by Lazarus.';
rsFastCGIAppli = 'FastCGI Application';
rsFastCGIAppli2 = 'FastCGI Application%sA FastCGI (Common Gateway '
+'Interface) program in Free Pascal using webmodules. The program source '
+'is automatically maintained by Lazarus.';
implementation
uses LazarusPackageIntf,FormEditingIntf;
Const
fpWebTab = 'fpWeb';
Procedure RegisterHTMLComponents;
begin
RegisterComponents(fpWebTab,[THTMLDatasetContentProducer,
THTMLSelectProducer,
THTMLDatasetSelectProducer,
THTMLEntityProducer
{$IFNDEF VER2_2},THTMLPageProducer{$ENDIF}
])
end;
Procedure RegisterDatasetComponents;
begin
RegisterComponents(fpWebTab,[THTMLDataSetFormShowProducer,
THTMLDataSetFormEditProducer,
THTMLDataSetFormGridProducer]);
end;
Procedure RegisterComponents;
begin
RegisterUnit('fphtml',@RegisterHTMLComponents);
RegisterUnit('fpdatasetform',@RegisterdatasetComponents);
end;
procedure Register;
begin
RegisterComponents;
FileDescriptorWebModule:=TFileDescWebDataModule.Create;
RegisterProjectFileDescriptor(FileDescriptorWebModule);
ProjectDescriptorCGIApplication:=TCGIApplicationDescriptor.Create;
RegisterProjectDescriptor(ProjectDescriptorCGIApplication);
FileDescriptorHTMLModule:=TFileDescHTMLModule.Create;
RegisterProjectFileDescriptor(FileDescriptorHTMLModule);
ProjectDescriptorCustomCGIApplication:=TCustomCGIApplicationDescriptor.Create;
RegisterProjectDescriptor(ProjectDescriptorCustomCGIApplication);
ProjectDescriptorApacheApplication:=TApacheApplicationDescriptor.Create;
RegisterProjectDescriptor(ProjectDescriptorApacheApplication);
{$IFDEF HasFastCGISupport}
ProjectDescriptorFCGIApplication:=TFCGIApplicationDescriptor.Create;
RegisterProjectDescriptor(ProjectDescriptorFCGIApplication);
ProjectDescriptorCustomFCGIApplication:=TCustomFCGIApplicationDescriptor.Create;
RegisterProjectDescriptor(ProjectDescriptorCustomFCGIApplication);
{$ENDIF HasFastCGISupport}
FormEditingHook.RegisterDesignerBaseClass(TFPWebModule);
FormEditingHook.RegisterDesignerBaseClass(TFPHTMLModule);
end;
{ TCGIApplicationDescriptor }
constructor TCGIApplicationDescriptor.Create;
begin
inherited Create;
Name:='CGI Application';
end;
function TCGIApplicationDescriptor.GetLocalizedName: string;
begin
Result:=rsCGIApplicati;
end;
function TCGIApplicationDescriptor.GetLocalizedDescription: string;
begin
Result:=Format(rsCGIApplicati2, [#13#13]);
end;
function TCGIApplicationDescriptor.InitProject(AProject: TLazProject): TModalResult;
var
le: string;
NewSource: String;
MainFile: TLazProjectFile;
begin
inherited InitProject(AProject);
MainFile:=AProject.CreateProjectFile('cgiproject1.lpr');
MainFile.IsPartOfProject:=true;
AProject.AddFile(MainFile,false);
AProject.MainFileID:=0;
// create program source
le:=LineEnding;
NewSource:='program cgiproject1;'+le
+le
+'{$mode objfpc}{$H+}'+le
+le
+'uses'+le
+' fpCGI;'+le
+le
+'begin'+le
+' Application.Title:=''cgiproject1'';'+le
+' Application.Initialize;'+le
+' Application.Run;'+le
+'end.'+le
+le;
AProject.MainFile.SetSourceText(NewSource);
// add
AProject.AddPackageDependency('FCL');
AProject.AddPackageDependency('LCL');
AProject.AddPackageDependency('WebLaz');
// compiler options
AProject.LazCompilerOptions.Win32GraphicApp:=false;
AProject.Flags := AProject.Flags - [pfMainUnitHasCreateFormStatements];
AProject.Flags := AProject.Flags - [pfRunnable];
Result:= mrOK;
end;
function TCGIApplicationDescriptor.CreateStartFiles(AProject: TLazProject): TModalResult;
begin
LazarusIDE.DoNewEditorFile(FileDescriptorWebModule,'','',
[nfIsPartOfProject,nfOpenInEditor,nfCreateDefaultSrc]);
Result:= mrOK;
end;
{ TCustomCGIApplicationDescriptor }
constructor TCustomCGIApplicationDescriptor.Create;
begin
inherited Create;
Name:='Custom CGI Application';
end;
function TCustomCGIApplicationDescriptor.GetLocalizedName: string;
begin
Result:=rsCustomCGIApp;
end;
function TCustomCGIApplicationDescriptor.GetLocalizedDescription: string;
begin
Result:=Format(rsCustomCGIApp2, [#13#13]);
end;
function TCustomCGIApplicationDescriptor.InitProject(AProject: TLazProject): TModalResult;
var
le: string;
NewSource: String;
MainFile: TLazProjectFile;
begin
inherited InitProject(AProject);
MainFile:=AProject.CreateProjectFile('cgiproject1.lpr');
MainFile.IsPartOfProject:=true;
AProject.AddFile(MainFile,false);
AProject.MainFileID:=0;
// create program source
le:=LineEnding;
NewSource:='program cgiproject1;'+le
+le
+'{$mode objfpc}{$H+}'+le
+le
+'uses'+le
+' Classes,SysUtils,httpDefs,custcgi;'+le
+le
+'Type'+le
+' TCGIApp = Class(TCustomCGIApplication)'+le
+' Public'+le
+' Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override;'+le
+' end;'+le
+le
+'Procedure TCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse);'+le
+le
+'begin'+le
+' // Your code here'+le
+'end;'+le
+le
+'begin'+le
+' With TCGIApp.Create(Nil) do'+le
+' try'+le
+' Initialize;'+le
+' Run;'+le
+' finally'+le
+' Free;'+le
+' end;'+le
+'end.'+le;
AProject.MainFile.SetSourceText(NewSource);
// add
AProject.AddPackageDependency('FCL');
AProject.AddPackageDependency('WebLaz');
// compiler options
AProject.LazCompilerOptions.Win32GraphicApp:=false;
AProject.Flags := AProject.Flags - [pfMainUnitHasCreateFormStatements];
AProject.Flags := AProject.Flags - [pfRunnable];
Result:= mrOK;
end;
function TCustomCGIApplicationDescriptor.CreateStartFiles(AProject: TLazProject): TModalResult;
begin
Result:= mrOK;
end;
{ TFileDescWebDataModule }
constructor TFileDescWebDataModule.Create;
begin
inherited Create;
Name:='Web Module';
ResourceClass:=TFPWebModule;
UseCreateFormStatements:=true;
end;
function TFileDescWebDataModule.GetInterfaceUsesSection: string;
begin
Result:=inherited GetInterfaceUsesSection;
Result:=Result+',HTTPDefs, websession, fpHTTP,fpWeb';
end;
function TFileDescWebDataModule.GetLocalizedName: string;
begin
Result:=rsWebModule;
end;
function TFileDescWebDataModule.GetLocalizedDescription: string;
begin
Result:=Format(rsWEBModuleADa, [#13]);
end;
function TFileDescWebDataModule.GetImplementationSource(const Filename, SourceName, ResourceName: string): string;
begin
Result:=Inherited GetImplementationSource(FileName,SourceName,ResourceName);
if GetResourceType = rtRes then
Result:=Result+'initialization'+LineEnding;
Result:=Result+' RegisterHTTPModule(''T'+ResourceName+''',T'+ResourceName+');'+LineEnding;
end;
{ TFileDescHTMLModule }
constructor TFileDescHTMLModule.Create;
begin
inherited Create;
Name:='HTML Module';
ResourceClass:=TFPHTMLModule;
UseCreateFormStatements:=true;
end;
function TFileDescHTMLModule.GetInterfaceUsesSection: string;
begin
Result:=inherited GetInterfaceUsesSection;
Result:=Result+',HTTPDefs,websession,fpHTTP,htmlwriter,htmlelements,fphtml';
end;
function TFileDescHTMLModule.GetLocalizedName: string;
begin
Result:=rsHTMLWebModul;
end;
function TFileDescHTMLModule.GetLocalizedDescription: string;
begin
Result:=Format(rsHTMLWEBModul2, [#13]);
end;
function TFileDescHTMLModule.GetImplementationSource(const Filename, SourceName, ResourceName: string): string;
begin
Result:=Inherited GetImplementationSource(FileName,SourceName,ResourceName);
if GetResourceType = rtRes then
Result:=Result+'initialization'+LineEnding;
Result:=Result+' RegisterHTTPModule(''T'+ResourceName+''',T'+ResourceName+');'+LineEnding;
end;
{ TApacheApplicationDescriptor }
constructor TApacheApplicationDescriptor.Create;
begin
inherited Create;
Name:='Apache Module';
end;
function TApacheApplicationDescriptor.GetLocalizedName: string;
begin
Result:=rsApacheModule;
end;
function TApacheApplicationDescriptor.GetLocalizedDescription: string;
begin
Result:=Format(rsApacheModule2, [#13#13]);
end;
function TApacheApplicationDescriptor.InitProject(AProject: TLazProject): TModalResult;
var
le: string;
NewSource: String;
MainFile: TLazProjectFile;
begin
inherited InitProject(AProject);
MainFile:=AProject.CreateProjectFile('mod_apache1.lpr');
MainFile.IsPartOfProject:=true;
AProject.AddFile(MainFile,false);
AProject.MainFileID:=0;
// create program source
le:=LineEnding;
NewSource:='Library mod_apache1;'+le
+le
+'{$mode objfpc}{$H+}'+le
+le
+'Uses'+le
+'{$ifdef unix}'+le
+' cthreads,'+le
+'{$endif}'+le
+' httpd,fpApache;'+le
+le
+'Const'+le
+le
+'{ The following constant is used to export the module record. It must '+le
+' always match the name in the LoadModule statement in the apache'+le
+' configuration file(s). It is case sensitive !}'+le
+' ModuleName=''mod_apache1'';'+le
+le
+'{ The following constant is used to determine whether the module will'+le
+' handle a request. It should match the name in the SetHandler statement'+le
+' in the apache configuration file(s). It is not case sensitive. }'+le
+le
+' HandlerName=ModuleName;'+le
+le
+'Var'+le
+' DefaultModule : module; {$ifdef unix} public name ModuleName;{$endif unix}'+le
+le
+'Exports defaultmodule name ModuleName;'+le
+le
+'begin'+le
+' Application.Title:=''mod_apache1'';'+le
+' Application.ModuleName:=ModuleName;'+le
+' Application.HandlerName:=HandlerName;'+le
+' Application.SetModuleRecord(DefaultModule);'+le
+' Application.Initialize;'+le
+'end.'+le
+le;
AProject.MainFile.SetSourceText(NewSource);
// add
AProject.AddPackageDependency('WebLaz');
// compiler options
AProject.LazCompilerOptions.Win32GraphicApp:=false;
AProject.ExecutableType:=petLibrary;
AProject.Flags := AProject.Flags - [pfMainUnitHasCreateFormStatements];
AProject.Flags := AProject.Flags - [pfRunnable];
Result:= mrOK;
end;
function TApacheApplicationDescriptor.CreateStartFiles(AProject: TLazProject): TModalResult;
begin
LazarusIDE.DoNewEditorFile(FileDescriptorWebModule,'','',
[nfIsPartOfProject,nfOpenInEditor,nfCreateDefaultSrc]);
Result:= mrOK;
end;
{$IFDEF HasFastCGISupport}
{ TCustomFCGIApplicationDescriptor }
constructor TCustomFCGIApplicationDescriptor.Create;
begin
inherited Create;
Name:='Custom FastCGI Application';
end;
function TCustomFCGIApplicationDescriptor.GetLocalizedName: string;
begin
Result:=rsCustomFastCG;
end;
function TCustomFCGIApplicationDescriptor.GetLocalizedDescription: string;
begin
Result:=Format(rsCustomFastCG2, [#13#13]);
end;
function TCustomFCGIApplicationDescriptor.InitProject(AProject: TLazProject
): TModalResult;
var
le: string;
NewSource: String;
MainFile: TLazProjectFile;
begin
inherited InitProject(AProject);
MainFile:=AProject.CreateProjectFile('fcgiproject1.lpr');
MainFile.IsPartOfProject:=true;
AProject.AddFile(MainFile,false);
AProject.MainFileID:=0;
// create program source
le:=LineEnding;
NewSource:='program fcgiproject1;'+le
+le
+'{$mode objfpc}{$H+}'+le
+le
+'uses'+le
+' Classes,SysUtils,httpDefs,custfcgi;'+le
+le
+'Type'+le
+' TFCGIApp = Class(TCustomFCGIApplication)'+le
+' Public'+le
+' Procedure HandleRequest(ARequest : Trequest; AResponse : TResponse); override;'+le
+' end;'+le
+le
+'Procedure TFCGIApp.HandleRequest(ARequest : Trequest; AResponse : TResponse);'+le
+le
+'begin'+le
+' // Your code here'+le
+'end;'+le
+le
+'begin'+le
+' With TFCGIApp.Create(Nil) do'+le
+' try'+le
+' Initialize;'+le
+' Run;'+le
+' finally'+le
+' Free;'+le
+' end;'+le
+'end.'+le;
AProject.MainFile.SetSourceText(NewSource);
// add
AProject.AddPackageDependency('FCL');
AProject.AddPackageDependency('WebLaz');
// compiler options
AProject.LazCompilerOptions.Win32GraphicApp:=false;
AProject.Flags := AProject.Flags - [pfMainUnitHasCreateFormStatements];
AProject.Flags := AProject.Flags - [pfRunnable];
Result:= mrOK;
end;
function TCustomFCGIApplicationDescriptor.CreateStartFiles(AProject: TLazProject
): TModalResult;
begin
Result:= mrOK;
end;
{ TFCGIApplicationDescriptor }
constructor TFCGIApplicationDescriptor.Create;
begin
inherited Create;
Name:='FastCGI Application';
end;
function TFCGIApplicationDescriptor.GetLocalizedName: string;
begin
Result:=rsFastCGIAppli;
end;
function TFCGIApplicationDescriptor.GetLocalizedDescription: string;
begin
Result:=Format(rsFastCGIAppli2, [#13#13]);
end;
function TFCGIApplicationDescriptor.InitProject(AProject: TLazProject
): TModalResult;
var
le: string;
NewSource: String;
MainFile: TLazProjectFile;
begin
inherited InitProject(AProject);
MainFile:=AProject.CreateProjectFile('fcgiproject1.lpr');
MainFile.IsPartOfProject:=true;
AProject.AddFile(MainFile,false);
AProject.MainFileID:=0;
// create program source
le:=LineEnding;
NewSource:='program fcgiproject1;'+le
+le
+'{$mode objfpc}{$H+}'+le
+le
+'uses'+le
+' fpFCGI;'+le
+le
+'begin'+le
+' Application.Title:=''fcgiproject1'';'+le
+' Application.Initialize;'+le
+' Application.Run;'+le
+'end.'+le
+le;
AProject.MainFile.SetSourceText(NewSource);
// add
AProject.AddPackageDependency('FCL');
AProject.AddPackageDependency('LCL');
AProject.AddPackageDependency('WebLaz');
// compiler options
AProject.LazCompilerOptions.Win32GraphicApp:=false;
AProject.Flags := AProject.Flags - [pfMainUnitHasCreateFormStatements];
AProject.Flags := AProject.Flags - [pfRunnable];
Result:= mrOK;
end;
function TFCGIApplicationDescriptor.CreateStartFiles(AProject: TLazProject
): TModalResult;
begin
LazarusIDE.DoNewEditorFile(FileDescriptorWebModule,'','',
[nfIsPartOfProject,nfOpenInEditor,nfCreateDefaultSrc]);
Result:= mrOK;
end;
{$ENDIF HasFastCGISupport}
end.