mirror of
				https://gitlab.com/freepascal.org/lazarus/lazarus.git
				synced 2025-10-31 22:10:55 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			274 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
| {
 | |
|  *****************************************************************************
 | |
|   See the file COPYING.modifiedLGPL.txt, included in this distribution,
 | |
|   for details about the license.
 | |
|  *****************************************************************************
 | |
| 
 | |
|   Author: Mattias Gaertner
 | |
| 
 | |
|   Abstract:
 | |
|     IDE interface to the items in the new dialog.
 | |
| }
 | |
| unit NewItemIntf;
 | |
| 
 | |
| {$mode objfpc}{$H+}
 | |
| 
 | |
| interface
 | |
| 
 | |
| uses
 | |
|   Classes, SysUtils;
 | |
| 
 | |
| type
 | |
|   // Flags/Options for the items
 | |
|   TNewIDEItemFlag = (
 | |
|     niifCopy,       // default
 | |
|     niifInherited,
 | |
|     niifUse
 | |
|     );
 | |
|   TNewIDEItemFlags = set of TNewIDEItemFlag;
 | |
| 
 | |
|   TNewIDEItemTemplate = class;
 | |
| 
 | |
| 
 | |
|   { TNewIDEItemCategory }
 | |
| 
 | |
|   TNewIDEItemCategory = class
 | |
|   private
 | |
|     FVisibleInNewDialog: boolean;
 | |
|   protected
 | |
|     FName: string;
 | |
|     FItems: TFPList;
 | |
|     function GetCount: integer; virtual;
 | |
|     function GetItems(Index: integer): TNewIDEItemTemplate; virtual;
 | |
|   public
 | |
|     constructor Create(const AName: string); virtual;
 | |
|     destructor Destroy; override;
 | |
|     procedure Clear; virtual;
 | |
|     procedure Add(ATemplate: TNewIDEItemTemplate); virtual;
 | |
|     function LocalizedName: string;  virtual;
 | |
|     function Description: string;  virtual;
 | |
|     function IndexOfTemplate(const TemplateName: string): integer; virtual;
 | |
|     function FindTemplateByName(const TemplateName: string): TNewIDEItemTemplate; virtual;
 | |
|     function IndexOfCategory(const {%H-}CategoryName: string): integer; virtual;
 | |
|     function FindCategoryByName(const CategoryName: string): TNewIDEItemCategory; virtual;
 | |
|   public
 | |
|     property Count: integer read GetCount;
 | |
|     property Items[Index: integer]: TNewIDEItemTemplate read GetItems; default;
 | |
|     property Name: string read FName;
 | |
|     property VisibleInNewDialog: boolean read FVisibleInNewDialog write FVisibleInNewDialog;
 | |
|   end;
 | |
| 
 | |
| 
 | |
|   { TNewIDEItemCategories }
 | |
| 
 | |
|   TNewIDEItemCategories = class
 | |
|   protected
 | |
|     function GetItems(Index: integer): TNewIDEItemCategory; virtual; abstract;
 | |
|     procedure SetItems(Index: integer; const AValue: TNewIDEItemCategory); virtual; abstract;
 | |
|   public
 | |
|     procedure Clear; virtual; abstract;
 | |
|     procedure Add(ACategory: TNewIDEItemCategory); virtual; abstract;
 | |
|     function Count: integer; virtual; abstract;
 | |
|     function IndexOf(const CategoryName: string): integer; virtual; abstract;
 | |
|     function FindByName(const CategoryName: string): TNewIDEItemCategory; virtual; abstract;
 | |
|     procedure RegisterItem(const Paths: string; NewItem: TNewIDEItemTemplate); virtual; abstract;
 | |
|     procedure UnregisterItem(NewItem: TNewIDEItemTemplate); virtual; abstract;
 | |
|     function FindCategoryByPath(const Path: string;
 | |
|                                 ErrorOnNotFound: boolean): TNewIDEItemCategory; virtual; abstract;
 | |
|   public
 | |
|     property Items[Index: integer]: TNewIDEItemCategory
 | |
|                                           read GetItems write SetItems; default;
 | |
|   end;
 | |
| 
 | |
|   { TNewIDEItemTemplate }
 | |
| 
 | |
|   TNewIDEItemTemplate = class(TPersistent)
 | |
|   private
 | |
|     fCategory: TNewIDEItemCategory;
 | |
|     FVisibleInNewDialog: boolean;
 | |
|     FIsInherited: boolean;
 | |
|   protected
 | |
|     FAllowedFlags: TNewIDEItemFlags;
 | |
|     FDefaultFlag: TNewIDEItemFlag;
 | |
|     FName: string;
 | |
|   public
 | |
|     constructor Create(const AName: string;
 | |
|                        ADefaultFlag: TNewIDEItemFlag = niifCopy;
 | |
|                        TheAllowedFlags: TNewIDEItemFlags = [niifCopy]);
 | |
|     function LocalizedName: string; virtual;
 | |
|     function Description: string; virtual;
 | |
|     function CreateCopy: TNewIDEItemTemplate; virtual;
 | |
|     procedure Assign(Source: TPersistent); override;
 | |
|   public
 | |
|     property DefaultFlag: TNewIDEItemFlag read FDefaultFlag;
 | |
|     property AllowedFlags: TNewIDEItemFlags read FAllowedFlags;
 | |
|     property Name: string read FName;
 | |
|     property Category: TNewIDEItemCategory read fCategory write fCategory; // main category
 | |
|     property VisibleInNewDialog: boolean read FVisibleInNewDialog write FVisibleInNewDialog;
 | |
|     property IsInheritedItem: boolean read FIsInherited write FIsInherited;
 | |
|   end;
 | |
|   TNewIDEItemTemplateClass = class of TNewIDEItemTemplate;
 | |
|   
 | |
| var
 | |
|   NewIDEItems: TNewIDEItemCategories;// will be set by the IDE
 | |
| 
 | |
| procedure RegisterNewDialogItem(const Paths: string;
 | |
|   NewItem: TNewIDEItemTemplate);
 | |
| procedure UnregisterNewDialogItem(NewItem: TNewIDEItemTemplate);
 | |
| 
 | |
| procedure RegisterNewItemCategory(ACategory: TNewIDEItemCategory);
 | |
| 
 | |
| 
 | |
| implementation
 | |
| 
 | |
| 
 | |
| procedure RegisterNewItemCategory(ACategory: TNewIDEItemCategory);
 | |
| begin
 | |
|   NewIdeItems.Add(ACategory);
 | |
| end;
 | |
| 
 | |
| procedure RegisterNewDialogItem(const Paths: string; NewItem: TNewIDEItemTemplate);
 | |
| begin
 | |
|   if NewIDEItems=nil then
 | |
|     raise Exception.Create('RegisterNewDialogItem NewIDEItems=nil');
 | |
|   NewIDEItems.RegisterItem(Paths,NewItem);
 | |
| end;
 | |
| 
 | |
| procedure UnregisterNewDialogItem(NewItem: TNewIDEItemTemplate);
 | |
| begin
 | |
|   if NewIDEItems=nil then
 | |
|     raise Exception.Create('RegisterNewDialogItem NewIDEItems=nil');
 | |
|   NewIDEItems.UnregisterItem(NewItem);
 | |
| end;
 | |
| 
 | |
| { TNewIDEItemCategory }
 | |
| 
 | |
| function TNewIDEItemCategory.GetCount: integer;
 | |
| begin
 | |
|   Result:=FItems.Count;
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.GetItems(Index: integer): TNewIDEItemTemplate;
 | |
| begin
 | |
|   Result:=TNewIDEItemTemplate(FItems[Index]);
 | |
| end;
 | |
| 
 | |
| constructor TNewIDEItemCategory.Create(const AName: string);
 | |
| begin
 | |
|   FVisibleInNewDialog:=true;
 | |
|   FItems := TFPList.Create;
 | |
|   FName  := AName;
 | |
| end;
 | |
| 
 | |
| destructor TNewIDEItemCategory.Destroy;
 | |
| begin
 | |
|   Clear;
 | |
|   FreeAndNil(FItems);
 | |
|   inherited Destroy;
 | |
| end;
 | |
| 
 | |
| procedure TNewIDEItemCategory.Clear;
 | |
| var
 | |
|   i: Integer;
 | |
| begin
 | |
|   for i := 0 to FItems.Count - 1 do
 | |
|     Items[i].Free;
 | |
|   FItems.Clear;
 | |
| end;
 | |
| 
 | |
| procedure TNewIDEItemCategory.Add(ATemplate: TNewIDEItemTemplate);
 | |
| begin
 | |
|   FItems.Add(ATemplate);
 | |
|   ATemplate.Category := Self;
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.LocalizedName: string;
 | |
| begin
 | |
|   Result:=Name;
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.Description: string;
 | |
| begin
 | |
|   Result:='';
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.IndexOfTemplate(const TemplateName: string): integer;
 | |
| begin
 | |
|   Result:=FItems.Count-1;
 | |
|   while (Result>=0) and (SysUtils.CompareText(Items[Result].Name,TemplateName)<>0) do
 | |
|     dec(Result);
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.FindTemplateByName(const TemplateName: string): TNewIDEItemTemplate;
 | |
| var
 | |
|   i: LongInt;
 | |
| begin
 | |
|   i := IndexOfTemplate(TemplateName);
 | |
|   if i >= 0 then
 | |
|     Result := Items[i]
 | |
|   else
 | |
|     Result := nil;
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.IndexOfCategory(const CategoryName: string): integer;
 | |
| begin
 | |
|   Result:=-1; // ToDo
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemCategory.FindCategoryByName(const CategoryName: string): TNewIDEItemCategory;
 | |
| var
 | |
|   i: LongInt;
 | |
| begin
 | |
|   i := IndexOfCategory(CategoryName);
 | |
|   if i >= 0 then
 | |
|     Result := nil // ToDo
 | |
|   else
 | |
|     Result := nil;
 | |
| end;
 | |
| 
 | |
| { TNewIDEItemTemplate }
 | |
| 
 | |
| constructor TNewIDEItemTemplate.Create(const AName: string;
 | |
|   ADefaultFlag: TNewIDEItemFlag; TheAllowedFlags: TNewIDEItemFlags);
 | |
| begin
 | |
|   FName:=AName;
 | |
|   FDefaultFlag:=ADefaultFlag;
 | |
|   FAllowedFlags:=TheAllowedFlags;
 | |
|   FVisibleInNewDialog:=true;
 | |
|   FIsInherited := False;
 | |
|   Include(FAllowedFlags,FDefaultFlag);
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemTemplate.LocalizedName: string;
 | |
| begin
 | |
|   Result:=Name;
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemTemplate.Description: string;
 | |
| begin
 | |
|   Result:='<Description not set>';
 | |
| end;
 | |
| 
 | |
| function TNewIDEItemTemplate.CreateCopy: TNewIDEItemTemplate;
 | |
| begin
 | |
|   Result:=TNewIDEItemTemplateClass(ClassType).Create(Name,DefaultFlag,AllowedFlags);
 | |
|   Result.Assign(Self);
 | |
| end;
 | |
| 
 | |
| procedure TNewIDEItemTemplate.Assign(Source: TPersistent);
 | |
| var
 | |
|   Src: TNewIDEItemTemplate;
 | |
| begin
 | |
|   if Source is TNewIDEItemTemplate then begin
 | |
|     Src:=TNewIDEItemTemplate(Source);
 | |
|     FName:=Src.Name;
 | |
|     FDefaultFlag:=Src.DefaultFlag;
 | |
|     FAllowedFlags:=Src.AllowedFlags;
 | |
|   end else
 | |
|     inherited Assign(Source);
 | |
| end;
 | |
| 
 | |
| end.
 | |
| 
 | |
| 
 | 
