mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-06 12:58:13 +02:00
project groups: options, open recent project groups
git-svn-id: trunk@50368 -
This commit is contained in:
parent
3087610579
commit
aa945f4ab6
@ -11,13 +11,13 @@ unit ProjectGroup;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, contnrs,
|
Classes, SysUtils, contnrs, Laz2_XMLCfg, Controls, Forms, Dialogs, LCLProc,
|
||||||
Laz2_XMLCfg,
|
LazFileUtils, LazFileCache, LazConfigStorage, PackageIntf, ProjectIntf,
|
||||||
Controls, Forms, Dialogs, LCLProc, LazFileUtils, LazFileCache,
|
MenuIntf, LazIDEIntf, IDEDialogs, CompOptsIntf, BaseIDEIntf, ProjectGroupIntf,
|
||||||
PackageIntf, ProjectIntf, MenuIntf,
|
|
||||||
LazIDEIntf, IDEDialogs, CompOptsIntf, ProjectGroupIntf,
|
|
||||||
ProjectGroupStrConst, FileProcs, CodeToolManager, CodeCache;
|
ProjectGroupStrConst, FileProcs, CodeToolManager, CodeCache;
|
||||||
|
|
||||||
|
const
|
||||||
|
PGOptionsFileName = 'projectgroupsoptions.xml';
|
||||||
|
|
||||||
type
|
type
|
||||||
{ TIDECompileTarget }
|
{ TIDECompileTarget }
|
||||||
@ -96,10 +96,35 @@ type
|
|||||||
property OnTargetsExchanged: TTargetExchangeEvent Read FOnTargetsExchanged Write FOnTargetsExchanged;
|
property OnTargetsExchanged: TTargetExchangeEvent Read FOnTargetsExchanged Write FOnTargetsExchanged;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TIDEProjectGroupOptions }
|
||||||
|
|
||||||
|
TIDEProjectGroupOptions = class
|
||||||
|
private
|
||||||
|
FChangeStamp: integer;
|
||||||
|
FLastSavedChangeStamp: integer;
|
||||||
|
FRecentProjectGroups: TStringList;
|
||||||
|
function GetModified: boolean;
|
||||||
|
procedure SetModified(AValue: boolean);
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure SaveSafe;
|
||||||
|
procedure LoadSafe;
|
||||||
|
procedure SaveToFile(aFilename: string);
|
||||||
|
procedure LoadFromFile(aFilename: string);
|
||||||
|
// recent project groups
|
||||||
|
property RecentProjectGroups: TStringList read FRecentProjectGroups;
|
||||||
|
procedure AddToRecentProjectGroups(aFilename: string);
|
||||||
|
procedure IncreaseChangeStamp;
|
||||||
|
property ChangeStamp: integer read FChangeStamp;
|
||||||
|
property Modified: boolean read GetModified write SetModified;
|
||||||
|
end;
|
||||||
|
|
||||||
{ TIDEProjectGroupManager }
|
{ TIDEProjectGroupManager }
|
||||||
|
|
||||||
TIDEProjectGroupManager = Class(TProjectGroupManager)
|
TIDEProjectGroupManager = Class(TProjectGroupManager)
|
||||||
private
|
private
|
||||||
|
FOptions: TIDEProjectGroupOptions;
|
||||||
function GetNewFileName: Boolean;
|
function GetNewFileName: Boolean;
|
||||||
protected
|
protected
|
||||||
FProjectGroup: TIDEProjectGroup;
|
FProjectGroup: TIDEProjectGroup;
|
||||||
@ -108,14 +133,20 @@ type
|
|||||||
function GetCurrentProjectGroup: TProjectGroup; override;
|
function GetCurrentProjectGroup: TProjectGroup; override;
|
||||||
function ShowProjectGroupEditor: Boolean;
|
function ShowProjectGroupEditor: Boolean;
|
||||||
public
|
public
|
||||||
|
constructor Create;
|
||||||
|
destructor Destroy; override;
|
||||||
|
procedure UpdateRecentProjectGroupMenu;
|
||||||
// Events for main menu
|
// Events for main menu
|
||||||
procedure DoNewClick(Sender: TObject); virtual;
|
procedure DoNewClick(Sender: TObject);
|
||||||
procedure DoOpenClick(Sender: TObject); virtual;
|
procedure DoOpenClick(Sender: TObject);
|
||||||
procedure DoSaveClick(Sender: TObject); virtual;
|
procedure DoOpenRecentClick(Sender: TObject);
|
||||||
procedure DoSaveAsClick(Sender: TObject); virtual;
|
procedure DoSaveClick(Sender: TObject);
|
||||||
|
procedure DoSaveAsClick(Sender: TObject);
|
||||||
// Public interface
|
// Public interface
|
||||||
procedure LoadProjectGroup(AFileName: string; AOptions: TProjectGroupLoadOptions); override;
|
procedure LoadProjectGroup(AFileName: string; AOptions: TProjectGroupLoadOptions); override;
|
||||||
procedure SaveProjectGroup; override;
|
procedure SaveProjectGroup; override;
|
||||||
|
public
|
||||||
|
property Options: TIDEProjectGroupOptions read FOptions;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TEditProjectGroupHandler = procedure(Sender: TObject; AProjectGroup: TProjectGroup);
|
TEditProjectGroupHandler = procedure(Sender: TObject; AProjectGroup: TProjectGroup);
|
||||||
@ -154,10 +185,100 @@ var
|
|||||||
cmdTargetProperties,
|
cmdTargetProperties,
|
||||||
cmdTargetUninstall: TIDEMenuCommand;
|
cmdTargetUninstall: TIDEMenuCommand;
|
||||||
|
|
||||||
|
OpenRecentProjectGroupSubMenu: TIDEMenuSection;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
{ TIDEProjectGroupOptions }
|
||||||
|
|
||||||
|
function TIDEProjectGroupOptions.GetModified: boolean;
|
||||||
|
begin
|
||||||
|
Result:=FLastSavedChangeStamp<>FChangeStamp
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.SetModified(AValue: boolean);
|
||||||
|
begin
|
||||||
|
if AValue then
|
||||||
|
IncreaseChangeStamp
|
||||||
|
else
|
||||||
|
FLastSavedChangeStamp:=FChangeStamp;
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TIDEProjectGroupOptions.Create;
|
||||||
|
begin
|
||||||
|
FRecentProjectGroups:=TStringList.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TIDEProjectGroupOptions.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FRecentProjectGroups);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.SaveSafe;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
SaveToFile(PGOptionsFileName);
|
||||||
|
Modified:=false;
|
||||||
|
except
|
||||||
|
on E: Exception do
|
||||||
|
debugln(['Error: (lazarus) [TIDEProjectGroupOptions.SaveSafe] ',E.Message]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.LoadSafe;
|
||||||
|
begin
|
||||||
|
try
|
||||||
|
LoadFromFile(PGOptionsFileName);
|
||||||
|
except
|
||||||
|
on E: Exception do
|
||||||
|
debugln(['Error: (lazarus) [TIDEProjectGroupOptions.LoadSafe] ',E.Message]);
|
||||||
|
end;
|
||||||
|
Modified:=false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.SaveToFile(aFilename: string);
|
||||||
|
var
|
||||||
|
Cfg: TConfigStorage;
|
||||||
|
begin
|
||||||
|
Cfg:=GetIDEConfigStorage(aFilename,false);
|
||||||
|
try
|
||||||
|
Cfg.SetValue('RecentProjectGroups/',FRecentProjectGroups);
|
||||||
|
finally
|
||||||
|
Cfg.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.LoadFromFile(aFilename: string);
|
||||||
|
var
|
||||||
|
Cfg: TConfigStorage;
|
||||||
|
begin
|
||||||
|
Cfg:=GetIDEConfigStorage(aFilename,true);
|
||||||
|
try
|
||||||
|
Cfg.GetValue('RecentProjectGroups/',FRecentProjectGroups);
|
||||||
|
finally
|
||||||
|
Cfg.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.AddToRecentProjectGroups(aFilename: string);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
begin
|
||||||
|
FRecentProjectGroups.Insert(0,aFilename);
|
||||||
|
for i:=FRecentProjectGroups.Count-1 downto 1 do
|
||||||
|
if CompareFilenames(FRecentProjectGroups[i],aFilename)=0 then
|
||||||
|
FRecentProjectGroups.Delete(i);
|
||||||
|
while FRecentProjectGroups.Count>30 do
|
||||||
|
FRecentProjectGroups.Delete(FRecentProjectGroups.Count-1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupOptions.IncreaseChangeStamp;
|
||||||
|
begin
|
||||||
|
LUIncreaseChangeStamp(FChangeStamp);
|
||||||
|
end;
|
||||||
|
|
||||||
{ TIDEProjectGroupManager }
|
{ TIDEProjectGroupManager }
|
||||||
|
|
||||||
function TIDEProjectGroupManager.CheckSaved: Boolean;
|
function TIDEProjectGroupManager.CheckSaved: Boolean;
|
||||||
@ -209,6 +330,39 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
constructor TIDEProjectGroupManager.Create;
|
||||||
|
begin
|
||||||
|
FOptions:=TIDEProjectGroupOptions.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
destructor TIDEProjectGroupManager.Destroy;
|
||||||
|
begin
|
||||||
|
FreeAndNil(FOptions);
|
||||||
|
inherited Destroy;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupManager.UpdateRecentProjectGroupMenu;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
Item: TIDEMenuItem;
|
||||||
|
aFilename: String;
|
||||||
|
begin
|
||||||
|
i:=0;
|
||||||
|
while i<Options.RecentProjectGroups.Count do begin
|
||||||
|
aFilename:=Options.RecentProjectGroups[i];
|
||||||
|
if i<OpenRecentProjectGroupSubMenu.Count then begin
|
||||||
|
Item:=OpenRecentProjectGroupSubMenu[i];
|
||||||
|
Item.Caption:=aFilename;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
Item:=RegisterIDEMenuCommand(OpenRecentProjectGroupSubMenu,'OpenRecentProjectGroup'+IntToStr(i),aFilename,@DoOpenRecentClick);
|
||||||
|
end;
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
while i<OpenRecentProjectGroupSubMenu.Count do
|
||||||
|
OpenRecentProjectGroupSubMenu[i].Free;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TIDEProjectGroupManager.DoNewClick(Sender: TObject);
|
procedure TIDEProjectGroupManager.DoNewClick(Sender: TObject);
|
||||||
var
|
var
|
||||||
AProject: TLazProject;
|
AProject: TLazProject;
|
||||||
@ -248,6 +402,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TIDEProjectGroupManager.DoOpenRecentClick(Sender: TObject);
|
||||||
|
var
|
||||||
|
Item: TIDEMenuCommand;
|
||||||
|
aFilename: String;
|
||||||
|
begin
|
||||||
|
Item:=Sender as TIDEMenuCommand;
|
||||||
|
aFilename:=Item.Caption;
|
||||||
|
debugln(['TIDEProjectGroupManager.DoOpenRecentClick ',aFilename]);
|
||||||
|
LoadProjectGroup(aFilename,[]);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TIDEProjectGroupManager.DoSaveClick(Sender: TObject);
|
procedure TIDEProjectGroupManager.DoSaveClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
SaveProjectGroup;
|
SaveProjectGroup;
|
||||||
@ -288,6 +453,11 @@ begin
|
|||||||
if Not CheckSaved then
|
if Not CheckSaved then
|
||||||
Exit;
|
Exit;
|
||||||
FreeAndNil(FProjectGroup);
|
FreeAndNil(FProjectGroup);
|
||||||
|
|
||||||
|
Options.AddToRecentProjectGroups(AFileName);
|
||||||
|
Options.SaveSafe;
|
||||||
|
UpdateRecentProjectGroupMenu;
|
||||||
|
|
||||||
FProjectGroup:=TIDEProjectGroup.Create;
|
FProjectGroup:=TIDEProjectGroup.Create;
|
||||||
FProjectGroup.FileName:=AFileName;
|
FProjectGroup.FileName:=AFileName;
|
||||||
FProjectGroup.LoadFromFile(AOptions);
|
FProjectGroup.LoadFromFile(AOptions);
|
||||||
|
@ -71,16 +71,21 @@ procedure Register;
|
|||||||
begin
|
begin
|
||||||
RegisterStandardProjectGroupMenuItems;
|
RegisterStandardProjectGroupMenuItems;
|
||||||
IDEProjectGroupManager:=TIDEProjectGroupManager.Create;
|
IDEProjectGroupManager:=TIDEProjectGroupManager.Create;
|
||||||
|
IDEProjectGroupManager.Options.LoadSafe;
|
||||||
|
|
||||||
cmdCreateProjectGroup:=RegisterIDEMenuCommand(itmProjectNewSection,
|
cmdCreateProjectGroup:=RegisterIDEMenuCommand(itmProjectNewSection,
|
||||||
'NewProjectGroup',lisNewProjectGroup,@IDEProjectGroupManager.DoNewClick);
|
'NewProjectGroup',lisNewProjectGroup,@IDEProjectGroupManager.DoNewClick);
|
||||||
cmdOpenProjectGroup:=RegisterIDEMenuCommand(itmProjectOpenSection,
|
cmdOpenProjectGroup:=RegisterIDEMenuCommand(itmProjectOpenSection,
|
||||||
'OpenProjectGroup',lisOpenProjectGroup,@IDEProjectGroupManager.DoOpenClick);
|
'OpenProjectGroup',lisOpenProjectGroup,@IDEProjectGroupManager.DoOpenClick);
|
||||||
|
OpenRecentProjectGroupSubMenu:=RegisterIDESubMenu(itmProjectOpenSection,
|
||||||
|
'OpenRecentProjectGroup',lisOpenRecentProjectGroup);
|
||||||
cmdSaveProjectGroup:=RegisterIDEMenuCommand(itmProjectSaveSection,
|
cmdSaveProjectGroup:=RegisterIDEMenuCommand(itmProjectSaveSection,
|
||||||
'SaveProjectGroup',lisSaveProjectGroup,@IDEProjectGroupManager.DoSaveClick);
|
'SaveProjectGroup',lisSaveProjectGroup,@IDEProjectGroupManager.DoSaveClick);
|
||||||
cmdSaveProjectGroupAs:=RegisterIDEMenuCommand(itmProjectSaveSection,
|
cmdSaveProjectGroupAs:=RegisterIDEMenuCommand(itmProjectSaveSection,
|
||||||
'SaveProjectGroupAs',lisSaveProjectGroupAs,@IDEProjectGroupManager.DoSaveAsClick);
|
'SaveProjectGroupAs',lisSaveProjectGroupAs,@IDEProjectGroupManager.DoSaveAsClick);
|
||||||
|
|
||||||
|
IDEProjectGroupManager.UpdateRecentProjectGroupMenu;
|
||||||
|
|
||||||
ProjectGroupManager:=IDEProjectGroupManager;
|
ProjectGroupManager:=IDEProjectGroupManager;
|
||||||
SetProjectGroupEditorCallBack;
|
SetProjectGroupEditorCallBack;
|
||||||
end;
|
end;
|
||||||
|
Loading…
Reference in New Issue
Block a user