1 {
2  *****************************************************************************
3   See the file COPYING.modifiedLGPL.txt, included in this distribution,
4   for details about the license.
5  *****************************************************************************
6 
7   Author: Mattias Gaertner
8 
9   Abstract:
10     IDE interface to the items in the new dialog.
11 }
12 unit NewItemIntf;
13 
14 {$mode objfpc}{$H+}
15 
16 interface
17 
18 uses
19   Classes, SysUtils;
20 
21 type
22   // Flags/Options for the items
23   TNewIDEItemFlag = (
24     niifCopy,       // default
25     niifInherited,
26     niifUse
27     );
28   TNewIDEItemFlags = set of TNewIDEItemFlag;
29 
30   TNewIDEItemTemplate = class;
31 
32 
33   { TNewIDEItemCategory }
34 
35   TNewIDEItemCategory = class
36   private
37     FVisibleInNewDialog: boolean;
38   protected
39     FName: string;
40     FItems: TFPList;
GetCountnull41     function GetCount: integer; virtual;
GetItemsnull42     function GetItems(Index: integer): TNewIDEItemTemplate; virtual;
43   public
44     constructor Create(const AName: string); virtual;
45     destructor Destroy; override;
46     procedure Clear; virtual;
47     procedure Add(ATemplate: TNewIDEItemTemplate); virtual;
LocalizedNamenull48     function LocalizedName: string;  virtual;
Descriptionnull49     function Description: string;  virtual;
IndexOfTemplatenull50     function IndexOfTemplate(const TemplateName: string): integer; virtual;
FindTemplateByNamenull51     function FindTemplateByName(const TemplateName: string): TNewIDEItemTemplate; virtual;
IndexOfCategorynull52     function IndexOfCategory(const {%H-}CategoryName: string): integer; virtual;
FindCategoryByNamenull53     function FindCategoryByName(const CategoryName: string): TNewIDEItemCategory; virtual;
54   public
55     property Count: integer read GetCount;
56     property Items[Index: integer]: TNewIDEItemTemplate read GetItems; default;
57     property Name: string read FName;
58     property VisibleInNewDialog: boolean read FVisibleInNewDialog write FVisibleInNewDialog;
59   end;
60 
61 
62   { TNewIDEItemCategories }
63 
64   TNewIDEItemCategories = class
65   protected
GetItemsnull66     function GetItems(Index: integer): TNewIDEItemCategory; virtual; abstract;
67     procedure SetItems(Index: integer; const AValue: TNewIDEItemCategory); virtual; abstract;
68   public
69     procedure Clear; virtual; abstract;
70     procedure Add(ACategory: TNewIDEItemCategory); virtual; abstract;
Countnull71     function Count: integer; virtual; abstract;
IndexOfnull72     function IndexOf(const CategoryName: string): integer; virtual; abstract;
FindByNamenull73     function FindByName(const CategoryName: string): TNewIDEItemCategory; virtual; abstract;
74     procedure RegisterItem(const Paths: string; NewItem: TNewIDEItemTemplate); virtual; abstract;
75     procedure UnregisterItem(NewItem: TNewIDEItemTemplate); virtual; abstract;
FindCategoryByPathnull76     function FindCategoryByPath(const Path: string;
77                                 ErrorOnNotFound: boolean): TNewIDEItemCategory; virtual; abstract;
78   public
79     property Items[Index: integer]: TNewIDEItemCategory
80                                           read GetItems write SetItems; default;
81   end;
82 
83   { TNewIDEItemTemplate }
84 
85   TNewIDEItemTemplate = class(TPersistent)
86   private
87     fCategory: TNewIDEItemCategory;
88     FVisibleInNewDialog: boolean;
89     FIsInherited: boolean;
90   protected
91     FAllowedFlags: TNewIDEItemFlags;
92     FDefaultFlag: TNewIDEItemFlag;
93     FName: string;
94   public
95     constructor Create(const AName: string;
96                        ADefaultFlag: TNewIDEItemFlag = niifCopy;
97                        TheAllowedFlags: TNewIDEItemFlags = [niifCopy]);
LocalizedNamenull98     function LocalizedName: string; virtual;
Descriptionnull99     function Description: string; virtual;
CreateCopynull100     function CreateCopy: TNewIDEItemTemplate; virtual;
101     procedure Assign(Source: TPersistent); override;
102   public
103     property DefaultFlag: TNewIDEItemFlag read FDefaultFlag;
104     property AllowedFlags: TNewIDEItemFlags read FAllowedFlags;
105     property Name: string read FName;
106     property Category: TNewIDEItemCategory read fCategory write fCategory; // main category
107     property VisibleInNewDialog: boolean read FVisibleInNewDialog write FVisibleInNewDialog;
108     property IsInheritedItem: boolean read FIsInherited write FIsInherited;
109   end;
110   TNewIDEItemTemplateClass = class of TNewIDEItemTemplate;
111 
112 var
113   NewIDEItems: TNewIDEItemCategories;// will be set by the IDE
114 
115 procedure RegisterNewDialogItem(const Paths: string;
116   NewItem: TNewIDEItemTemplate);
117 procedure UnregisterNewDialogItem(NewItem: TNewIDEItemTemplate);
118 
119 procedure RegisterNewItemCategory(ACategory: TNewIDEItemCategory);
120 
121 
122 implementation
123 
124 
125 procedure RegisterNewItemCategory(ACategory: TNewIDEItemCategory);
126 begin
127   NewIdeItems.Add(ACategory);
128 end;
129 
130 procedure RegisterNewDialogItem(const Paths: string; NewItem: TNewIDEItemTemplate);
131 begin
132   if NewIDEItems=nil then
133     raise Exception.Create('RegisterNewDialogItem NewIDEItems=nil');
134   NewIDEItems.RegisterItem(Paths,NewItem);
135 end;
136 
137 procedure UnregisterNewDialogItem(NewItem: TNewIDEItemTemplate);
138 begin
139   if NewIDEItems=nil then
140     raise Exception.Create('RegisterNewDialogItem NewIDEItems=nil');
141   NewIDEItems.UnregisterItem(NewItem);
142 end;
143 
144 { TNewIDEItemCategory }
145 
TNewIDEItemCategory.GetCountnull146 function TNewIDEItemCategory.GetCount: integer;
147 begin
148   Result:=FItems.Count;
149 end;
150 
TNewIDEItemCategory.GetItemsnull151 function TNewIDEItemCategory.GetItems(Index: integer): TNewIDEItemTemplate;
152 begin
153   Result:=TNewIDEItemTemplate(FItems[Index]);
154 end;
155 
156 constructor TNewIDEItemCategory.Create(const AName: string);
157 begin
158   FVisibleInNewDialog:=true;
159   FItems := TFPList.Create;
160   FName  := AName;
161 end;
162 
163 destructor TNewIDEItemCategory.Destroy;
164 begin
165   Clear;
166   FreeAndNil(FItems);
167   inherited Destroy;
168 end;
169 
170 procedure TNewIDEItemCategory.Clear;
171 var
172   i: Integer;
173 begin
174   for i := 0 to FItems.Count - 1 do
175     Items[i].Free;
176   FItems.Clear;
177 end;
178 
179 procedure TNewIDEItemCategory.Add(ATemplate: TNewIDEItemTemplate);
180 begin
181   FItems.Add(ATemplate);
182   ATemplate.Category := Self;
183 end;
184 
LocalizedNamenull185 function TNewIDEItemCategory.LocalizedName: string;
186 begin
187   Result:=Name;
188 end;
189 
Descriptionnull190 function TNewIDEItemCategory.Description: string;
191 begin
192   Result:='';
193 end;
194 
TNewIDEItemCategory.IndexOfTemplatenull195 function TNewIDEItemCategory.IndexOfTemplate(const TemplateName: string): integer;
196 begin
197   Result:=FItems.Count-1;
198   while (Result>=0) and (SysUtils.CompareText(Items[Result].Name,TemplateName)<>0) do
199     dec(Result);
200 end;
201 
FindTemplateByNamenull202 function TNewIDEItemCategory.FindTemplateByName(const TemplateName: string): TNewIDEItemTemplate;
203 var
204   i: LongInt;
205 begin
206   i := IndexOfTemplate(TemplateName);
207   if i >= 0 then
208     Result := Items[i]
209   else
210     Result := nil;
211 end;
212 
IndexOfCategorynull213 function TNewIDEItemCategory.IndexOfCategory(const CategoryName: string): integer;
214 begin
215   Result:=-1; // ToDo
216 end;
217 
TNewIDEItemCategory.FindCategoryByNamenull218 function TNewIDEItemCategory.FindCategoryByName(const CategoryName: string): TNewIDEItemCategory;
219 var
220   i: LongInt;
221 begin
222   i := IndexOfCategory(CategoryName);
223   if i >= 0 then
224     Result := nil // ToDo
225   else
226     Result := nil;
227 end;
228 
229 { TNewIDEItemTemplate }
230 
231 constructor TNewIDEItemTemplate.Create(const AName: string;
232   ADefaultFlag: TNewIDEItemFlag; TheAllowedFlags: TNewIDEItemFlags);
233 begin
234   FName:=AName;
235   FDefaultFlag:=ADefaultFlag;
236   FAllowedFlags:=TheAllowedFlags;
237   FVisibleInNewDialog:=true;
238   FIsInherited := False;
239   Include(FAllowedFlags,FDefaultFlag);
240 end;
241 
TNewIDEItemTemplate.LocalizedNamenull242 function TNewIDEItemTemplate.LocalizedName: string;
243 begin
244   Result:=Name;
245 end;
246 
Descriptionnull247 function TNewIDEItemTemplate.Description: string;
248 begin
249   Result:='<Description not set>';
250 end;
251 
TNewIDEItemTemplate.CreateCopynull252 function TNewIDEItemTemplate.CreateCopy: TNewIDEItemTemplate;
253 begin
254   Result:=TNewIDEItemTemplateClass(ClassType).Create(Name,DefaultFlag,AllowedFlags);
255   Result.Assign(Self);
256 end;
257 
258 procedure TNewIDEItemTemplate.Assign(Source: TPersistent);
259 var
260   Src: TNewIDEItemTemplate;
261 begin
262   if Source is TNewIDEItemTemplate then begin
263     Src:=TNewIDEItemTemplate(Source);
264     FName:=Src.Name;
265     FDefaultFlag:=Src.DefaultFlag;
266     FAllowedFlags:=Src.AllowedFlags;
267   end else
268     inherited Assign(Source);
269 end;
270 
271 end.
272 
273 
274