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