mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-12-11 12:20:37 +01:00
IDE: refactor, move 2 methods from Main to SourceFileManager.
git-svn-id: trunk@45455 -
This commit is contained in:
parent
a46d8c4075
commit
dd98353d82
246
ide/main.pp
246
ide/main.pp
@ -949,13 +949,6 @@ type
|
|||||||
procedure DoJumpToGuessedMisplacedIFDEF(FindNextUTF8: boolean);
|
procedure DoJumpToGuessedMisplacedIFDEF(FindNextUTF8: boolean);
|
||||||
|
|
||||||
procedure DoGotoIncludeDirective;
|
procedure DoGotoIncludeDirective;
|
||||||
function SelectProjectItems(ItemList: TViewUnitEntries;
|
|
||||||
ItemType: TIDEProjectItem;
|
|
||||||
MultiSelect: boolean;
|
|
||||||
var MultiSelectCheckedState: Boolean): TModalResult;
|
|
||||||
function SelectUnitComponents(DlgCaption: string; ItemType: TIDEProjectItem;
|
|
||||||
Files: TStringList;
|
|
||||||
MultiSelect: boolean; var MultiSelectCheckedState: Boolean): TModalResult;
|
|
||||||
|
|
||||||
// tools
|
// tools
|
||||||
function DoMakeResourceString: TModalResult;
|
function DoMakeResourceString: TModalResult;
|
||||||
@ -5726,241 +5719,6 @@ begin
|
|||||||
Result:=SourceFileMgr.OpenEditorFile(AFileName, PageIndex, WindowIndex, AEditorInfo, Flags);
|
Result:=SourceFileMgr.OpenEditorFile(AFileName, PageIndex, WindowIndex, AEditorInfo, Flags);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMainIDE.SelectProjectItems(ItemList: TViewUnitEntries;
|
|
||||||
ItemType: TIDEProjectItem; MultiSelect: boolean;
|
|
||||||
var MultiSelectCheckedState: Boolean): TModalResult;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
AUnitName, DlgCaption: string;
|
|
||||||
MainUnitInfo: TUnitInfo;
|
|
||||||
ActiveSourceEditor: TSourceEditor;
|
|
||||||
ActiveUnitInfo: TUnitInfo;
|
|
||||||
CurUnitInfo: TUnitInfo;
|
|
||||||
LFMFilename: String;
|
|
||||||
LFMType: String;
|
|
||||||
LFMComponentName: String;
|
|
||||||
LFMClassName: String;
|
|
||||||
anUnitName: String;
|
|
||||||
begin
|
|
||||||
if Project1=nil then exit(mrCancel);
|
|
||||||
GetCurrentUnit(ActiveSourceEditor, ActiveUnitInfo);
|
|
||||||
for i := 0 to Project1.UnitCount - 1 do
|
|
||||||
begin
|
|
||||||
CurUnitInfo:=Project1.Units[i];
|
|
||||||
if not CurUnitInfo.IsPartOfProject then
|
|
||||||
Continue;
|
|
||||||
if ItemType in [piComponent, piFrame] then
|
|
||||||
begin
|
|
||||||
// add all form names of project
|
|
||||||
if CurUnitInfo.ComponentName <> '' then
|
|
||||||
begin
|
|
||||||
if (ItemType = piComponent) or
|
|
||||||
((ItemType = piFrame) and (CurUnitInfo.ResourceBaseClass = pfcbcFrame)) then
|
|
||||||
ItemList.Add(CurUnitInfo.ComponentName,
|
|
||||||
CurUnitInfo.Filename, i, CurUnitInfo = ActiveUnitInfo);
|
|
||||||
end else if FilenameIsAbsolute(CurUnitInfo.Filename)
|
|
||||||
and FilenameIsPascalSource(CurUnitInfo.Filename)
|
|
||||||
and FileExistsCached(CurUnitInfo.Filename) then begin
|
|
||||||
// this unit has a lfm, but the lpi does not know a ComponentName
|
|
||||||
// => maybe this component was added without the IDE
|
|
||||||
LFMFilename:=ChangeFileExt(CurUnitInfo.Filename,'.lfm');
|
|
||||||
if FileExistsCached(LFMFilename)
|
|
||||||
and ReadLFMHeaderFromFile(LFMFilename,LFMType,LFMComponentName,LFMClassName)
|
|
||||||
then begin
|
|
||||||
anUnitName:=CurUnitInfo.Unit_Name;
|
|
||||||
if anUnitName='' then
|
|
||||||
anUnitName:=ExtractFileNameOnly(LFMFilename);
|
|
||||||
ItemList.Add(LFMComponentName, CurUnitInfo.Filename,
|
|
||||||
i, CurUnitInfo = ActiveUnitInfo);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end else
|
|
||||||
begin
|
|
||||||
// add all unit names of project
|
|
||||||
if (CurUnitInfo.FileName <> '') then
|
|
||||||
begin
|
|
||||||
AUnitName := ExtractFileName(CurUnitInfo.Filename);
|
|
||||||
if ItemList.Find(AUnitName) = nil then
|
|
||||||
ItemList.Add(AUnitName, CurUnitInfo.Filename,
|
|
||||||
i, CurUnitInfo = ActiveUnitInfo);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
if Project1.MainUnitID = i then
|
|
||||||
begin
|
|
||||||
MainUnitInfo := Project1.MainUnitInfo;
|
|
||||||
if pfMainUnitIsPascalSource in Project1.Flags then
|
|
||||||
begin
|
|
||||||
AUnitName := ExtractFileName(MainUnitInfo.Filename);
|
|
||||||
if (AUnitName <> '') and (ItemList.Find(AUnitName) = nil) then
|
|
||||||
begin
|
|
||||||
ItemList.Add(AUnitName, MainUnitInfo.Filename,
|
|
||||||
i, MainUnitInfo = ActiveUnitInfo);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
case ItemType of
|
|
||||||
piUnit: DlgCaption := dlgMainViewUnits;
|
|
||||||
piComponent: DlgCaption := dlgMainViewForms;
|
|
||||||
piFrame: DlgCaption := dlgMainViewFrames;
|
|
||||||
end;
|
|
||||||
Result := ShowViewUnitsDlg(ItemList, MultiSelect, MultiSelectCheckedState, DlgCaption, ItemType);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.SelectUnitComponents(DlgCaption: string;
|
|
||||||
ItemType: TIDEProjectItem; Files: TStringList; MultiSelect: boolean;
|
|
||||||
var MultiSelectCheckedState: Boolean): TModalResult;
|
|
||||||
var
|
|
||||||
ActiveSourceEditor: TSourceEditor;
|
|
||||||
ActiveUnitInfo: TUnitInfo;
|
|
||||||
UnitToFilename: TStringToStringTree;
|
|
||||||
UnitPath: String;
|
|
||||||
|
|
||||||
function ResourceFits(ResourceBaseClass: TPFComponentBaseClass): boolean;
|
|
||||||
begin
|
|
||||||
case ItemType of
|
|
||||||
piUnit: Result:=true;
|
|
||||||
piComponent: Result:=ResourceBaseClass<>pfcbcNone;
|
|
||||||
piFrame: Result:=ResourceBaseClass=pfcbcFrame;
|
|
||||||
else Result:=false;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure AddUnit(AnUnitName,AFilename: string);
|
|
||||||
var
|
|
||||||
LFMFilename: String;
|
|
||||||
begin
|
|
||||||
//debugln(['AddUnit ',AFilename]);
|
|
||||||
if not FilenameIsPascalUnit(AFilename) then exit;
|
|
||||||
if CompareFilenames(AFilename,ActiveUnitInfo.Filename)=0 then exit;
|
|
||||||
if (AnUnitName='') then
|
|
||||||
AnUnitName:=ExtractFileNameOnly(AFilename);
|
|
||||||
if (not FilenameIsAbsolute(AFilename)) then begin
|
|
||||||
if (not ActiveUnitInfo.IsVirtual) then
|
|
||||||
exit; // virtual UnitToFilename can not be accessed from disk UnitToFilename
|
|
||||||
end else begin
|
|
||||||
//debugln(['AddUnit unitpath=',UnitPath]);
|
|
||||||
if SearchDirectoryInSearchPath(UnitPath,ExtractFilePath(AFilename))<1 then
|
|
||||||
exit; // not reachable
|
|
||||||
end;
|
|
||||||
if UnitToFilename.Contains(AnUnitName) then exit; // duplicate unit
|
|
||||||
if not FileExistsCached(AFilename) then exit;
|
|
||||||
LFMFilename:=ChangeFileExt(aFilename,'.lfm');
|
|
||||||
if not FileExistsCached(LFMFilename) then exit;
|
|
||||||
UnitToFilename[AnUnitName]:=AFilename;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure AddPackage(Pkg: TLazPackage);
|
|
||||||
var
|
|
||||||
i: Integer;
|
|
||||||
PkgFile: TPkgFile;
|
|
||||||
begin
|
|
||||||
//debugln(['AddPackage ',pkg.Name]);
|
|
||||||
for i:=0 to Pkg.FileCount-1 do begin
|
|
||||||
PkgFile:=TPkgFile(Pkg.Files[i]);
|
|
||||||
if not (PkgFile.FileType in PkgFileRealUnitTypes) then continue;
|
|
||||||
if not FilenameIsAbsolute(PkgFile.Filename) then continue;
|
|
||||||
if not ResourceFits(PkgFile.ResourceBaseClass) then begin
|
|
||||||
if PkgFile.ResourceBaseClass<>pfcbcNone then continue;
|
|
||||||
// unknown resource class => check file
|
|
||||||
PkgFile.ResourceBaseClass:=FindLFMBaseClass(PkgFile.Filename);
|
|
||||||
if not ResourceFits(PkgFile.ResourceBaseClass) then continue;
|
|
||||||
end;
|
|
||||||
AddUnit(PkgFile.Unit_Name,PkgFile.Filename);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
var
|
|
||||||
Owners: TFPList;
|
|
||||||
APackage: TLazPackage;
|
|
||||||
AProject: TProject;
|
|
||||||
AnUnitInfo: TUnitInfo;
|
|
||||||
FirstDependency: TPkgDependency;
|
|
||||||
PkgList: TFPList;
|
|
||||||
i: Integer;
|
|
||||||
S2SItem: PStringToStringTreeItem;
|
|
||||||
AnUnitName: String;
|
|
||||||
AFilename: String;
|
|
||||||
UnitList: TViewUnitEntries;
|
|
||||||
Entry: TViewUnitsEntry;
|
|
||||||
begin
|
|
||||||
Result:=mrCancel;
|
|
||||||
GetCurrentUnit(ActiveSourceEditor, ActiveUnitInfo);
|
|
||||||
if ActiveUnitInfo=nil then exit;
|
|
||||||
Owners:=PkgBoss.GetPossibleOwnersOfUnit(ActiveUnitInfo.Filename,[]);
|
|
||||||
UnitPath:=CodeToolBoss.GetCompleteSrcPathForDirectory(ExtractFilePath(ActiveUnitInfo.Filename));
|
|
||||||
PkgList:=nil;
|
|
||||||
UnitToFilename:=TStringToStringTree.Create(false);
|
|
||||||
UnitList:=TViewUnitEntries.Create;
|
|
||||||
try
|
|
||||||
// fetch owner of active unit
|
|
||||||
AProject:=nil;
|
|
||||||
APackage:=nil;
|
|
||||||
if (Owners<>nil) then begin
|
|
||||||
for i:=0 to Owners.Count-1 do begin
|
|
||||||
if TObject(Owners[i]) is TProject then begin
|
|
||||||
AProject:=TProject(Owners[i]);
|
|
||||||
break;
|
|
||||||
end else if TObject(Owners[i]) is TLazPackage then begin
|
|
||||||
APackage:=TLazPackage(Owners[i]);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
if AProject<>nil then begin
|
|
||||||
// add project units
|
|
||||||
//debugln(['TMainIDE.SelectUnitComponents Project=',AProject.ProjectInfoFile]);
|
|
||||||
FirstDependency:=AProject.FirstRequiredDependency;
|
|
||||||
for i:=0 to AProject.UnitCount-1 do begin
|
|
||||||
AnUnitInfo:=AProject.Units[i];
|
|
||||||
if (not AnUnitInfo.IsPartOfProject)
|
|
||||||
or (AnUnitInfo.ComponentName='')
|
|
||||||
then continue;
|
|
||||||
if not ResourceFits(AnUnitInfo.ResourceBaseClass) then begin
|
|
||||||
if AnUnitInfo.ResourceBaseClass<>pfcbcNone then continue;
|
|
||||||
// unknown resource class => check file
|
|
||||||
AnUnitInfo.ResourceBaseClass:=FindLFMBaseClass(AnUnitInfo.Filename);
|
|
||||||
if not ResourceFits(AnUnitInfo.ResourceBaseClass) then continue;
|
|
||||||
end;
|
|
||||||
AddUnit(AnUnitInfo.Unit_Name,AnUnitInfo.Filename);
|
|
||||||
end;
|
|
||||||
end else if APackage<>nil then begin
|
|
||||||
// add package units
|
|
||||||
FirstDependency:=APackage.FirstRequiredDependency;
|
|
||||||
AddPackage(APackage);
|
|
||||||
end else
|
|
||||||
FirstDependency:=nil;
|
|
||||||
// add all units of all used packages
|
|
||||||
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,PkgList);
|
|
||||||
if PkgList<>nil then
|
|
||||||
for i:=0 to PkgList.Count-1 do
|
|
||||||
AddPackage(TLazPackage(PkgList[i]));
|
|
||||||
|
|
||||||
// create Files
|
|
||||||
i:=0;
|
|
||||||
for S2SItem in UnitToFilename do begin
|
|
||||||
AnUnitName:=S2SItem^.Name;
|
|
||||||
AFilename:=S2SItem^.Value;
|
|
||||||
UnitList.Add(AnUnitName,AFilename,i,false);
|
|
||||||
inc(i);
|
|
||||||
end;
|
|
||||||
// show dialog
|
|
||||||
Result := ShowViewUnitsDlg(UnitList, MultiSelect, MultiSelectCheckedState,
|
|
||||||
DlgCaption, ItemType, ActiveUnitInfo.Filename);
|
|
||||||
// create list of selected files
|
|
||||||
for Entry in UnitList do begin
|
|
||||||
if Entry.Selected then
|
|
||||||
Files.Add(Entry.Filename);
|
|
||||||
end;
|
|
||||||
|
|
||||||
finally
|
|
||||||
UnitList.Free;
|
|
||||||
PkgList.Free;
|
|
||||||
Owners.Free;
|
|
||||||
UnitToFilename.Free;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.DoSelectFrame: TComponentClass;
|
function TMainIDE.DoSelectFrame: TComponentClass;
|
||||||
var
|
var
|
||||||
UnitList: TStringList;
|
UnitList: TStringList;
|
||||||
@ -5973,7 +5731,7 @@ begin
|
|||||||
UnitList := TStringList.Create;
|
UnitList := TStringList.Create;
|
||||||
try
|
try
|
||||||
dummy := false;
|
dummy := false;
|
||||||
if SelectUnitComponents('Select Frame',piFrame,UnitList, false, dummy) <> mrOk
|
if SourceFileMgr.SelectUnitComponents('Select Frame',piFrame,UnitList, false, dummy) <> mrOk
|
||||||
then
|
then
|
||||||
exit;
|
exit;
|
||||||
for i := 0 to UnitList.Count-1 do
|
for i := 0 to UnitList.Count-1 do
|
||||||
@ -6006,7 +5764,7 @@ begin
|
|||||||
if Project1=nil then exit(mrCancel);
|
if Project1=nil then exit(mrCancel);
|
||||||
UnitList := TViewUnitEntries.Create;
|
UnitList := TViewUnitEntries.Create;
|
||||||
try
|
try
|
||||||
if SelectProjectItems(UnitList, UseItemType[OnlyForms],
|
if SourceFileMgr.SelectProjectItems(UnitList, UseItemType[OnlyForms],
|
||||||
true, MultiSelectCheckedState[OnlyForms]) = mrOk then
|
true, MultiSelectCheckedState[OnlyForms]) = mrOk then
|
||||||
begin
|
begin
|
||||||
{ This is where we check what the user selected. }
|
{ This is where we check what the user selected. }
|
||||||
|
|||||||
@ -115,6 +115,11 @@ type
|
|||||||
function CheckFilesOnDisk(Instantaneous: boolean = false): TModalResult;
|
function CheckFilesOnDisk(Instantaneous: boolean = false): TModalResult;
|
||||||
function PublishModule(Options: TPublishModuleOptions;
|
function PublishModule(Options: TPublishModuleOptions;
|
||||||
const SrcDirectory, DestDirectory: string): TModalResult;
|
const SrcDirectory, DestDirectory: string): TModalResult;
|
||||||
|
function SelectProjectItems(ItemList: TViewUnitEntries; ItemType: TIDEProjectItem;
|
||||||
|
MultiSelect: boolean; var MultiSelectCheckedState: Boolean): TModalResult;
|
||||||
|
function SelectUnitComponents(DlgCaption: string; ItemType: TIDEProjectItem;
|
||||||
|
Files: TStringList; MultiSelect: boolean;
|
||||||
|
var MultiSelectCheckedState: Boolean): TModalResult;
|
||||||
|
|
||||||
function AddActiveUnitToProject: TModalResult;
|
function AddActiveUnitToProject: TModalResult;
|
||||||
function RemoveFromProjectDialog: TModalResult;
|
function RemoveFromProjectDialog: TModalResult;
|
||||||
@ -2434,8 +2439,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
// copy the directory
|
// copy the directory
|
||||||
if not CopyDirectoryWithMethods(SrcDir,DestDir,
|
if not CopyDirectoryWithMethods(SrcDir,DestDir,@OnCopyFile,@OnCopyError,Options) then
|
||||||
@OnCopyFile,@OnCopyError,Options) then
|
|
||||||
begin
|
begin
|
||||||
debugln('TLazSourceFileManager.DoPublishModule CopyDirectoryWithMethods failed');
|
debugln('TLazSourceFileManager.DoPublishModule CopyDirectoryWithMethods failed');
|
||||||
Result:=mrCancel;
|
Result:=mrCancel;
|
||||||
@ -2481,6 +2485,240 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TLazSourceFileManager.SelectProjectItems(ItemList: TViewUnitEntries;
|
||||||
|
ItemType: TIDEProjectItem; MultiSelect: boolean;
|
||||||
|
var MultiSelectCheckedState: Boolean): TModalResult;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
AUnitName, DlgCaption: string;
|
||||||
|
MainUnitInfo: TUnitInfo;
|
||||||
|
ActiveSourceEditor: TSourceEditor;
|
||||||
|
ActiveUnitInfo: TUnitInfo;
|
||||||
|
CurUnitInfo: TUnitInfo;
|
||||||
|
LFMFilename: String;
|
||||||
|
LFMType: String;
|
||||||
|
LFMComponentName: String;
|
||||||
|
LFMClassName: String;
|
||||||
|
anUnitName: String;
|
||||||
|
begin
|
||||||
|
if Project1=nil then exit(mrCancel);
|
||||||
|
MainIDE.GetCurrentUnit(ActiveSourceEditor, ActiveUnitInfo);
|
||||||
|
for i := 0 to Project1.UnitCount - 1 do
|
||||||
|
begin
|
||||||
|
CurUnitInfo:=Project1.Units[i];
|
||||||
|
if not CurUnitInfo.IsPartOfProject then
|
||||||
|
Continue;
|
||||||
|
if ItemType in [piComponent, piFrame] then
|
||||||
|
begin
|
||||||
|
// add all form names of project
|
||||||
|
if CurUnitInfo.ComponentName <> '' then
|
||||||
|
begin
|
||||||
|
if (ItemType = piComponent) or
|
||||||
|
((ItemType = piFrame) and (CurUnitInfo.ResourceBaseClass = pfcbcFrame)) then
|
||||||
|
ItemList.Add(CurUnitInfo.ComponentName,
|
||||||
|
CurUnitInfo.Filename, i, CurUnitInfo = ActiveUnitInfo);
|
||||||
|
end else if FilenameIsAbsolute(CurUnitInfo.Filename)
|
||||||
|
and FilenameIsPascalSource(CurUnitInfo.Filename)
|
||||||
|
and FileExistsCached(CurUnitInfo.Filename) then begin
|
||||||
|
// this unit has a lfm, but the lpi does not know a ComponentName
|
||||||
|
// => maybe this component was added without the IDE
|
||||||
|
LFMFilename:=ChangeFileExt(CurUnitInfo.Filename,'.lfm');
|
||||||
|
if FileExistsCached(LFMFilename)
|
||||||
|
and ReadLFMHeaderFromFile(LFMFilename,LFMType,LFMComponentName,LFMClassName)
|
||||||
|
then begin
|
||||||
|
anUnitName:=CurUnitInfo.Unit_Name;
|
||||||
|
if anUnitName='' then
|
||||||
|
anUnitName:=ExtractFileNameOnly(LFMFilename);
|
||||||
|
ItemList.Add(LFMComponentName, CurUnitInfo.Filename,
|
||||||
|
i, CurUnitInfo = ActiveUnitInfo);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
// add all unit names of project
|
||||||
|
if (CurUnitInfo.FileName <> '') then
|
||||||
|
begin
|
||||||
|
AUnitName := ExtractFileName(CurUnitInfo.Filename);
|
||||||
|
if ItemList.Find(AUnitName) = nil then
|
||||||
|
ItemList.Add(AUnitName, CurUnitInfo.Filename,
|
||||||
|
i, CurUnitInfo = ActiveUnitInfo);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
if Project1.MainUnitID = i then
|
||||||
|
begin
|
||||||
|
MainUnitInfo := Project1.MainUnitInfo;
|
||||||
|
if pfMainUnitIsPascalSource in Project1.Flags then
|
||||||
|
begin
|
||||||
|
AUnitName := ExtractFileName(MainUnitInfo.Filename);
|
||||||
|
if (AUnitName <> '') and (ItemList.Find(AUnitName) = nil) then
|
||||||
|
begin
|
||||||
|
ItemList.Add(AUnitName, MainUnitInfo.Filename,
|
||||||
|
i, MainUnitInfo = ActiveUnitInfo);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
case ItemType of
|
||||||
|
piUnit: DlgCaption := dlgMainViewUnits;
|
||||||
|
piComponent: DlgCaption := dlgMainViewForms;
|
||||||
|
piFrame: DlgCaption := dlgMainViewFrames;
|
||||||
|
end;
|
||||||
|
Result := ShowViewUnitsDlg(ItemList, MultiSelect, MultiSelectCheckedState, DlgCaption, ItemType);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TLazSourceFileManager.SelectUnitComponents(DlgCaption: string;
|
||||||
|
ItemType: TIDEProjectItem; Files: TStringList; MultiSelect: boolean;
|
||||||
|
var MultiSelectCheckedState: Boolean): TModalResult;
|
||||||
|
var
|
||||||
|
ActiveSourceEditor: TSourceEditor;
|
||||||
|
ActiveUnitInfo: TUnitInfo;
|
||||||
|
UnitToFilename: TStringToStringTree;
|
||||||
|
UnitPath: String;
|
||||||
|
|
||||||
|
function ResourceFits(ResourceBaseClass: TPFComponentBaseClass): boolean;
|
||||||
|
begin
|
||||||
|
case ItemType of
|
||||||
|
piUnit: Result:=true;
|
||||||
|
piComponent: Result:=ResourceBaseClass<>pfcbcNone;
|
||||||
|
piFrame: Result:=ResourceBaseClass=pfcbcFrame;
|
||||||
|
else Result:=false;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure AddUnit(AnUnitName,AFilename: string);
|
||||||
|
var
|
||||||
|
LFMFilename: String;
|
||||||
|
begin
|
||||||
|
//debugln(['AddUnit ',AFilename]);
|
||||||
|
if not FilenameIsPascalUnit(AFilename) then exit;
|
||||||
|
if CompareFilenames(AFilename,ActiveUnitInfo.Filename)=0 then exit;
|
||||||
|
if (AnUnitName='') then
|
||||||
|
AnUnitName:=ExtractFileNameOnly(AFilename);
|
||||||
|
if (not FilenameIsAbsolute(AFilename)) then begin
|
||||||
|
if (not ActiveUnitInfo.IsVirtual) then
|
||||||
|
exit; // virtual UnitToFilename can not be accessed from disk UnitToFilename
|
||||||
|
end else begin
|
||||||
|
//debugln(['AddUnit unitpath=',UnitPath]);
|
||||||
|
if SearchDirectoryInSearchPath(UnitPath,ExtractFilePath(AFilename))<1 then
|
||||||
|
exit; // not reachable
|
||||||
|
end;
|
||||||
|
if UnitToFilename.Contains(AnUnitName) then exit; // duplicate unit
|
||||||
|
if not FileExistsCached(AFilename) then exit;
|
||||||
|
LFMFilename:=ChangeFileExt(aFilename,'.lfm');
|
||||||
|
if not FileExistsCached(LFMFilename) then exit;
|
||||||
|
UnitToFilename[AnUnitName]:=AFilename;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure AddPackage(Pkg: TLazPackage);
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
PkgFile: TPkgFile;
|
||||||
|
begin
|
||||||
|
//debugln(['AddPackage ',pkg.Name]);
|
||||||
|
for i:=0 to Pkg.FileCount-1 do begin
|
||||||
|
PkgFile:=TPkgFile(Pkg.Files[i]);
|
||||||
|
if not (PkgFile.FileType in PkgFileRealUnitTypes) then continue;
|
||||||
|
if not FilenameIsAbsolute(PkgFile.Filename) then continue;
|
||||||
|
if not ResourceFits(PkgFile.ResourceBaseClass) then begin
|
||||||
|
if PkgFile.ResourceBaseClass<>pfcbcNone then continue;
|
||||||
|
// unknown resource class => check file
|
||||||
|
PkgFile.ResourceBaseClass:=FindLFMBaseClass(PkgFile.Filename);
|
||||||
|
if not ResourceFits(PkgFile.ResourceBaseClass) then continue;
|
||||||
|
end;
|
||||||
|
AddUnit(PkgFile.Unit_Name,PkgFile.Filename);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
Owners: TFPList;
|
||||||
|
APackage: TLazPackage;
|
||||||
|
AProject: TProject;
|
||||||
|
AnUnitInfo: TUnitInfo;
|
||||||
|
FirstDependency: TPkgDependency;
|
||||||
|
PkgList: TFPList;
|
||||||
|
i: Integer;
|
||||||
|
S2SItem: PStringToStringTreeItem;
|
||||||
|
AnUnitName: String;
|
||||||
|
AFilename: String;
|
||||||
|
UnitList: TViewUnitEntries;
|
||||||
|
Entry: TViewUnitsEntry;
|
||||||
|
begin
|
||||||
|
Result:=mrCancel;
|
||||||
|
MainIDE.GetCurrentUnit(ActiveSourceEditor, ActiveUnitInfo);
|
||||||
|
if ActiveUnitInfo=nil then exit;
|
||||||
|
Owners:=PkgBoss.GetPossibleOwnersOfUnit(ActiveUnitInfo.Filename,[]);
|
||||||
|
UnitPath:=CodeToolBoss.GetCompleteSrcPathForDirectory(ExtractFilePath(ActiveUnitInfo.Filename));
|
||||||
|
PkgList:=nil;
|
||||||
|
UnitToFilename:=TStringToStringTree.Create(false);
|
||||||
|
UnitList:=TViewUnitEntries.Create;
|
||||||
|
try
|
||||||
|
// fetch owner of active unit
|
||||||
|
AProject:=nil;
|
||||||
|
APackage:=nil;
|
||||||
|
if (Owners<>nil) then begin
|
||||||
|
for i:=0 to Owners.Count-1 do begin
|
||||||
|
if TObject(Owners[i]) is TProject then begin
|
||||||
|
AProject:=TProject(Owners[i]);
|
||||||
|
break;
|
||||||
|
end else if TObject(Owners[i]) is TLazPackage then begin
|
||||||
|
APackage:=TLazPackage(Owners[i]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
if AProject<>nil then begin
|
||||||
|
// add project units
|
||||||
|
//debugln(['TMainIDE.SelectUnitComponents Project=',AProject.ProjectInfoFile]);
|
||||||
|
FirstDependency:=AProject.FirstRequiredDependency;
|
||||||
|
for i:=0 to AProject.UnitCount-1 do begin
|
||||||
|
AnUnitInfo:=AProject.Units[i];
|
||||||
|
if (not AnUnitInfo.IsPartOfProject)
|
||||||
|
or (AnUnitInfo.ComponentName='')
|
||||||
|
then continue;
|
||||||
|
if not ResourceFits(AnUnitInfo.ResourceBaseClass) then begin
|
||||||
|
if AnUnitInfo.ResourceBaseClass<>pfcbcNone then continue;
|
||||||
|
// unknown resource class => check file
|
||||||
|
AnUnitInfo.ResourceBaseClass:=FindLFMBaseClass(AnUnitInfo.Filename);
|
||||||
|
if not ResourceFits(AnUnitInfo.ResourceBaseClass) then continue;
|
||||||
|
end;
|
||||||
|
AddUnit(AnUnitInfo.Unit_Name,AnUnitInfo.Filename);
|
||||||
|
end;
|
||||||
|
end else if APackage<>nil then begin
|
||||||
|
// add package units
|
||||||
|
FirstDependency:=APackage.FirstRequiredDependency;
|
||||||
|
AddPackage(APackage);
|
||||||
|
end else
|
||||||
|
FirstDependency:=nil;
|
||||||
|
// add all units of all used packages
|
||||||
|
PackageGraph.GetAllRequiredPackages(nil,FirstDependency,PkgList);
|
||||||
|
if PkgList<>nil then
|
||||||
|
for i:=0 to PkgList.Count-1 do
|
||||||
|
AddPackage(TLazPackage(PkgList[i]));
|
||||||
|
|
||||||
|
// create Files
|
||||||
|
i:=0;
|
||||||
|
for S2SItem in UnitToFilename do begin
|
||||||
|
AnUnitName:=S2SItem^.Name;
|
||||||
|
AFilename:=S2SItem^.Value;
|
||||||
|
UnitList.Add(AnUnitName,AFilename,i,false);
|
||||||
|
inc(i);
|
||||||
|
end;
|
||||||
|
// show dialog
|
||||||
|
Result := ShowViewUnitsDlg(UnitList, MultiSelect, MultiSelectCheckedState,
|
||||||
|
DlgCaption, ItemType, ActiveUnitInfo.Filename);
|
||||||
|
// create list of selected files
|
||||||
|
for Entry in UnitList do
|
||||||
|
if Entry.Selected then
|
||||||
|
Files.Add(Entry.Filename);
|
||||||
|
|
||||||
|
finally
|
||||||
|
UnitList.Free;
|
||||||
|
PkgList.Free;
|
||||||
|
Owners.Free;
|
||||||
|
UnitToFilename.Free;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
function TLazSourceFileManager.AddActiveUnitToProject: TModalResult;
|
function TLazSourceFileManager.AddActiveUnitToProject: TModalResult;
|
||||||
var
|
var
|
||||||
ActiveSourceEditor: TSourceEditor;
|
ActiveSourceEditor: TSourceEditor;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user