1 {
2  *****************************************************************************
3   See the file COPYING.modifiedLGPL.txt, included in this distribution,
4   for details about the license.
5  *****************************************************************************
6 }
7 unit ProjectResourcesIntf;
8 
9 {$mode objfpc}{$H+}
10 
11 interface
12 
13 uses
14   Classes, SysUtils, resource,
15   // IdeIntf
16   CompOptsIntf, ProjectIntf;
17 
18 type
19   TAbstractProjectResources = class;
20 
21   { TAbstractProjectResource }
22   TAbstractProjectResource = class
23   private
24     FModified: boolean;
25     FOnModified: TNotifyEvent;
26     procedure SetModified(const AValue: boolean);
27   protected
28     // This resource is used when reading project default options.
29     FIsDefaultOption: Boolean;
30   public
31     constructor Create; virtual;
32 
33     procedure DoAfterBuild({%H-}AResources: TAbstractProjectResources; {%H-}AReason: TCompileReason; {%H-}SaveToTestDir: boolean); virtual;
34     procedure DoBeforeBuild({%H-}AResources: TAbstractProjectResources; {%H-}AReason: TCompileReason; {%H-}SaveToTestDir: boolean); virtual;
UpdateResourcesnull35     function UpdateResources(AResources: TAbstractProjectResources; const MainFilename: string): Boolean; virtual; abstract;
36     procedure WriteToProjectFile(AConfig: {TXMLConfig}TObject; const Path: String); virtual; abstract;
37     procedure ReadFromProjectFile(AConfig: {TXMLConfig}TObject; const Path: String); virtual; abstract;
38 
39     property Modified: boolean read FModified write SetModified;
40     property OnModified: TNotifyEvent read FOnModified write FOnModified;
41     property IsDefaultOption: Boolean read FIsDefaultOption;
42   end;
43 
44   TAbstractProjectResourceClass = class of TAbstractProjectResource;
45 
46   { TAbstractProjectResources }
47 
48   TAbstractProjectResources = class
49   private
50     FProject: TLazProject;
51     FResourceType: TResourceType;
52   protected
53     FMessages: TStringList;
54     procedure SetResourceType(const AValue: TResourceType); virtual;
GetProjectResourcenull55     function GetProjectResource(AIndex: TAbstractProjectResourceClass): TAbstractProjectResource; virtual; abstract;
GetRegisteredResourcesnull56     class function GetRegisteredResources: TList;
57   public
58     constructor Create(AProject: TLazProject); virtual;
59     destructor Destroy; override;
60 
61     procedure AddSystemResource(AResource: TAbstractResource); virtual; abstract;
62     procedure AddLazarusResource(AResource: TStream;
63                    const AResourceName, AResourceType: String); virtual; abstract;
64 
65     property Messages: TStringList read FMessages;
66     property Project: TLazProject read FProject;
67     property ResourceType: TResourceType read FResourceType write SetResourceType;
68     property Resource[AIndex: TAbstractProjectResourceClass]: TAbstractProjectResource read GetProjectResource; default;
69   end;
70 
71 procedure RegisterProjectResource(AResource: TAbstractProjectResourceClass);
72 
73 implementation
74 
75 var
76   FRegisteredProjectResources: TList = nil;
77 
78 procedure RegisterProjectResource(AResource: TAbstractProjectResourceClass);
79 begin
80   if FRegisteredProjectResources = nil then
81     FRegisteredProjectResources := TList.Create;
82   FRegisteredProjectResources.Add(AResource);
83 end;
84 
85 { TAbstractProjectResource }
86 
87 procedure TAbstractProjectResource.SetModified(const AValue: boolean);
88 begin
89   if FModified=AValue then exit;
90   FModified:=AValue;
91   if Assigned(OnModified) then OnModified(Self);
92 end;
93 
94 constructor TAbstractProjectResource.Create;
95 begin
96   FModified := False;
97 end;
98 
99 procedure TAbstractProjectResource.DoAfterBuild(AResources: TAbstractProjectResources;
100   AReason: TCompileReason; SaveToTestDir: boolean);
101 begin
102   // nothing
103 end;
104 
105 procedure TAbstractProjectResource.DoBeforeBuild(AResources: TAbstractProjectResources;
106   AReason: TCompileReason; SaveToTestDir: boolean);
107 begin
108   // nothing
109 end;
110 
111 { TAbstractProjectResources }
112 
113 procedure TAbstractProjectResources.SetResourceType(const AValue: TResourceType);
114 begin
115   FResourceType := AValue;
116 end;
117 
TAbstractProjectResources.GetRegisteredResourcesnull118 class function TAbstractProjectResources.GetRegisteredResources: TList;
119 begin
120   Result := FRegisteredProjectResources;
121 end;
122 
123 constructor TAbstractProjectResources.Create(AProject: TLazProject);
124 begin
125   inherited Create;
126   FProject := AProject;
127   FMessages := TStringList.Create;
128 end;
129 
130 destructor TAbstractProjectResources.Destroy;
131 begin
132   FreeAndNil(FMessages);
133   inherited Destroy;
134 end;
135 
136 finalization
137   FRegisteredProjectResources.Free;
138 end.
139