mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-10-22 18:01:27 +02:00
IDE: package editor: move files: find res files
git-svn-id: trunk@45483 -
This commit is contained in:
parent
3e8a908c47
commit
791dda33f3
@ -194,6 +194,7 @@ type
|
||||
public
|
||||
function GetString(const Name: string; out Value: string): boolean;
|
||||
procedure Add(const Name, Value: string); virtual;
|
||||
procedure AddNames(List: TStrings);
|
||||
property Strings[const s: string]: string read GetStrings write SetStrings; default;
|
||||
function GetNodeData(AVLNode: TAVLTreeNode): PStringToStringTreeItem; inline;
|
||||
function AsText: string;
|
||||
@ -1055,6 +1056,19 @@ begin
|
||||
Strings[Name]:=Value;
|
||||
end;
|
||||
|
||||
procedure TStringToStringTree.AddNames(List: TStrings);
|
||||
var
|
||||
i: Integer;
|
||||
aName: String;
|
||||
begin
|
||||
if List=nil then exit;
|
||||
for i:=0 to List.Count-1 do begin
|
||||
aName:=List[i];
|
||||
if not Contains(aName) then
|
||||
Strings[aName]:='';
|
||||
end;
|
||||
end;
|
||||
|
||||
function TStringToStringTree.GetNodeData(AVLNode: TAVLTreeNode
|
||||
): PStringToStringTreeItem;
|
||||
begin
|
||||
|
@ -45,7 +45,7 @@ uses
|
||||
// codetools
|
||||
CodeAtom, CodeTree, CodeToolManager, FindDeclarationTool, BasicCodeTools,
|
||||
KeywordFuncLists, PascalParserTool, CodeCache, CacheCodeTools, CustomCodeTool,
|
||||
FileProcs, CTXMLFixFragment, DefineTemplates,
|
||||
FileProcs, CTXMLFixFragment, DefineTemplates, CodeToolsStructs,
|
||||
// synedit
|
||||
SynHighlighterPas,
|
||||
// IDEIntf
|
||||
@ -270,9 +270,9 @@ type
|
||||
ResolveIncludeFiles: Boolean;
|
||||
out CacheWasUsed: boolean;
|
||||
CreateIfNotExists: boolean = false): string;
|
||||
procedure GetFPDocFilenamesForSources(SrcFilenames: TStringToStringTree;
|
||||
procedure GetFPDocFilenamesForSources(SrcFilenames: TFilenameToStringTree;
|
||||
ResolveIncludeFiles: boolean;
|
||||
var FPDocFilenames: TStringToStringTree // Names=Filename, Values=ModuleName
|
||||
var FPDocFilenames: TFilenameToStringTree // Filename to ModuleName
|
||||
);
|
||||
function GetIDESrcFPDocPath: string; // $(LazarusDir)/docs/xml/ide/
|
||||
function IsIDESrcFile(const SrcFilename: string): boolean;
|
||||
@ -1177,9 +1177,9 @@ var
|
||||
BaseDir: String;
|
||||
Code: TCodeBuffer;
|
||||
CurUnitName: String;
|
||||
AVLNode: TAvgLvlTreeNode;
|
||||
UnitSet: TFPCUnitSetCache;
|
||||
IsInFPCSrc: Boolean;
|
||||
AVLNode: TAvgLvlTreeNode;
|
||||
begin
|
||||
Result:='';
|
||||
NewOwner:=nil;
|
||||
@ -1767,29 +1767,25 @@ begin
|
||||
end;
|
||||
|
||||
procedure TCodeHelpManager.GetFPDocFilenamesForSources(
|
||||
SrcFilenames: TStringToStringTree; ResolveIncludeFiles: boolean;
|
||||
var FPDocFilenames: TStringToStringTree);
|
||||
SrcFilenames: TFilenameToStringTree; ResolveIncludeFiles: boolean;
|
||||
var FPDocFilenames: TFilenameToStringTree);
|
||||
var
|
||||
Node: TAvgLvlTreeNode;
|
||||
Item: PStringToStringItem;
|
||||
SrcFilename: String;
|
||||
CacheWasUsed: boolean;
|
||||
AnOwner: TObject;
|
||||
FPDocFilename: String;
|
||||
S2SItem: PStringToStringTreeItem;
|
||||
begin
|
||||
Node:=SrcFilenames.Tree.FindLowest;
|
||||
while Node<>nil do begin
|
||||
Item:=PStringToStringItem(Node.Data);
|
||||
SrcFilename:=Item^.Name;
|
||||
for S2SItem in SrcFilenames do begin
|
||||
SrcFilename:=S2SItem^.Name;
|
||||
FPDocFilename:=GetFPDocFilenameForSource(SrcFilename,ResolveIncludeFiles,
|
||||
CacheWasUsed,AnOwner);
|
||||
//DebugLn(['TCodeHelpManager.GetFPDocFilenamesForSources FPDoc=',FPDocFilename,' Src=',SrcFilename]);
|
||||
if FPDocFilename<>'' then begin
|
||||
if FPDocFilenames=nil then
|
||||
FPDocFilenames:=CreateFilenameToStringTree;
|
||||
FPDocFilenames:=TFilenameToStringTree.Create(false);
|
||||
FPDocFilenames[FPDocFilename]:=GetModuleOwnerName(AnOwner);
|
||||
end;
|
||||
Node:=SrcFilenames.Tree.FindSuccessor(Node);
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -35,7 +35,7 @@ uses
|
||||
laz2_DOM,
|
||||
// codetools
|
||||
FileProcs, AVL_Tree, CTUnitGraph, CodeTree, CodeCache,
|
||||
CodeToolManager,
|
||||
CodeToolManager, CodeToolsStructs,
|
||||
// IDE
|
||||
LazarusIDEStrConsts, IDEProcs, IDEWindowIntf, MiscOptions, DialogProcs,
|
||||
LazIDEIntf, IDEDialogs, InputHistory, SearchResultView, CodeHelp, ButtonPanel;
|
||||
@ -365,14 +365,13 @@ function GatherFPDocReferencesForPascalFiles(PascalFiles: TStringList;
|
||||
DeclarationCode: TCodeBuffer; const DeclarationCaretXY: TPoint;
|
||||
var ListOfLazFPDocNode: TFPList): TModalResult;
|
||||
var
|
||||
PascalFilenames, FPDocFilenames: TStringToStringTree;
|
||||
PascalFilenames, FPDocFilenames: TFilenameToStringTree;
|
||||
CacheWasUsed: boolean;
|
||||
Chain: TCodeHelpElementChain;
|
||||
CHResult: TCodeHelpParseResult;
|
||||
CHElement: TCodeHelpElement;
|
||||
AVLNode: TAvgLvlTreeNode;
|
||||
Item: PStringToStringItem;
|
||||
FPDocFilename: String;
|
||||
S2SItem: PStringToStringTreeItem;
|
||||
begin
|
||||
Result:=mrCancel;
|
||||
PascalFilenames:=nil;
|
||||
@ -381,7 +380,7 @@ begin
|
||||
// gather FPDoc files
|
||||
CleanUpFileList(PascalFiles);
|
||||
|
||||
PascalFilenames:=CreateFilenameToStringTree;
|
||||
PascalFilenames:=TFilenameToStringTree.Create(false);
|
||||
PascalFilenames.AddNames(PascalFiles);
|
||||
CodeHelpBoss.GetFPDocFilenamesForSources(PascalFilenames,true,FPDocFilenames);
|
||||
if FPDocFilenames=nil then begin
|
||||
@ -400,16 +399,13 @@ begin
|
||||
DebugLn(['GatherFPDocReferences OwnerName=',CHElement.ElementOwnerName,' FPDocPkg=',CHElement.ElementFPDocPackageName,' Name=',CHElement.ElementName]);
|
||||
|
||||
// search FPDoc files
|
||||
AVLNode:=FPDocFilenames.Tree.FindLowest;
|
||||
while AVLNode<>nil do begin
|
||||
Item:=PStringToStringItem(AVLNode.Data);
|
||||
FPDocFilename:=Item^.Name;
|
||||
for S2SItem in FPDocFilenames do begin
|
||||
FPDocFilename:=S2SItem^.Name;
|
||||
Result:=GatherReferencesInFPDocFile(
|
||||
CHElement.ElementFPDocPackageName,CHElement.ElementUnitName,
|
||||
CHElement.ElementName,
|
||||
FPDocFilename,ListOfLazFPDocNode);
|
||||
if Result<>mrOk then exit;
|
||||
AVLNode:=FPDocFilenames.Tree.FindSuccessor(AVLNode);
|
||||
end;
|
||||
|
||||
Result:=mrOk;
|
||||
|
@ -158,6 +158,8 @@ const
|
||||
'CaseInsensitive',
|
||||
'File'
|
||||
);
|
||||
function IndexInRecentList(List: TStrings; ListType: TRecentListType;
|
||||
const Path: string): integer;
|
||||
function StrToRecentListType(s: string): TRecentListType;
|
||||
function CompareRecentListItem(s1, s2: string; ListType: TRecentListType): boolean;
|
||||
procedure LoadRecentList(XMLConfig: TXMLConfig; List: TStrings; const Path: string;
|
||||
@ -170,6 +172,8 @@ function AddComboTextToRecentList(cb: TCombobox; Max: integer;
|
||||
procedure RemoveFromRecentList(const s: string; RecentList: TStrings;
|
||||
ListType: TRecentListType);
|
||||
procedure CleanUpRecentList(List: TStrings; ListType: TRecentListType);
|
||||
|
||||
// XMLconfig
|
||||
procedure LoadRect(XMLConfig: TXMLConfig; const Path:string;
|
||||
var ARect:TRect);
|
||||
procedure LoadRect(XMLConfig: TXMLConfig; const Path:string;
|
||||
@ -255,10 +259,6 @@ procedure FreeListObjects(List: TList; FreeList: boolean);
|
||||
procedure FreeListObjects(List: TFPList; FreeList: boolean);
|
||||
function CompareMemStreamText(s1, s2: TMemoryStream): Boolean;
|
||||
|
||||
function CompareStringToStringItemsFilename(Data1, Data2: Pointer): integer;
|
||||
function ComparePAnsiStringWithStrToStrItemFilename(Key, Data: Pointer): Integer;
|
||||
function CreateFilenameToStringTree: TStringToStringTree;
|
||||
|
||||
function CheckGroupItemChecked(CheckGroup: TCheckGroup; const Caption: string): Boolean;
|
||||
|
||||
|
||||
@ -946,6 +946,14 @@ begin
|
||||
FindCloseUTF8(FileInfo);
|
||||
end;
|
||||
|
||||
function IndexInRecentList(List: TStrings; ListType: TRecentListType;
|
||||
const Path: string): integer;
|
||||
begin
|
||||
Result:=List.Count-1;
|
||||
while (Result>=0) and (not CompareRecentListItem(List[Result],Path,ListType)) do
|
||||
dec(Result);
|
||||
end;
|
||||
|
||||
function StrToRecentListType(s: string): TRecentListType;
|
||||
begin
|
||||
for Result:=Low(TRecentListType) to high(TRecentListType) do
|
||||
@ -2641,23 +2649,6 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function CompareStringToStringItemsFilename(Data1, Data2: Pointer): integer;
|
||||
begin
|
||||
Result:=CompareFilenames(PStringToStringItem(Data1)^.Name,
|
||||
PStringToStringItem(Data2)^.Name);
|
||||
end;
|
||||
|
||||
function ComparePAnsiStringWithStrToStrItemFilename(Key, Data: Pointer): Integer;
|
||||
begin
|
||||
Result:=CompareFilenames(PAnsiString(Key)^,PStringToStringItem(Data)^.Name);
|
||||
end;
|
||||
|
||||
function CreateFilenameToStringTree: TStringToStringTree;
|
||||
begin
|
||||
Result:=TStringToStringTree.Create(@CompareStringToStringItemsFilename,
|
||||
@ComparePAnsiStringWithStrToStrItemFilename);
|
||||
end;
|
||||
|
||||
function CheckGroupItemChecked(CheckGroup: TCheckGroup; const Caption: string): Boolean;
|
||||
begin
|
||||
Result := CheckGroup.Checked[CheckGroup.Items.IndexOf(Caption)];
|
||||
|
@ -16,7 +16,7 @@ unit DynQueue;
|
||||
interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils, LCLProc;
|
||||
Classes, SysUtils, LazLoggerBase;
|
||||
|
||||
type
|
||||
TDynamicQueueItem = record
|
||||
@ -437,7 +437,7 @@ var
|
||||
DataCount: LongInt;
|
||||
DataOffset: Integer;
|
||||
begin
|
||||
debugln(['TDynamicDataQueue.WriteDebugReport FItemCapacity=',FItemCapacity,
|
||||
DebugLn(['TDynamicDataQueue.WriteDebugReport FItemCapacity=',FItemCapacity,
|
||||
' FTopIndex=',FTopIndex,' FTopItemSpace=',FTopItemSpace,
|
||||
' FLastIndex=',FLastIndex,' FLastItemSpace=',FLastItemSpace,
|
||||
' Size=',Size,
|
||||
|
@ -37,12 +37,12 @@ uses
|
||||
LCLType, LCLProc, Menus, Dialogs, FileUtil, LazFileCache,
|
||||
contnrs,
|
||||
// IDEIntf CodeTools
|
||||
IDEImagesIntf, MenuIntf, ExtCtrls, LazIDEIntf, ProjectIntf,
|
||||
CodeToolsStructs, FormEditingIntf, TreeFilterEdit, PackageIntf,
|
||||
IDEDialogs, IDEHelpIntf, IDEOptionsIntf, IDEProcs, LazarusIDEStrConsts,
|
||||
IDEDefs, CompilerOptions, ComponentReg, EnvironmentOpts, DialogProcs,
|
||||
PackageDefs, AddToPackageDlg, PkgVirtualUnitEditor,
|
||||
MissingPkgFilesDlg, PackageSystem, CleanPkgDeps;
|
||||
IDEImagesIntf, MenuIntf, ExtCtrls, LazIDEIntf, ProjectIntf, CodeToolsStructs,
|
||||
FormEditingIntf, TreeFilterEdit, PackageIntf, IDEDialogs, IDEHelpIntf,
|
||||
IDEOptionsIntf, IDEProcs, LazarusIDEStrConsts, IDEDefs, CompilerOptions,
|
||||
ComponentReg, UnitResources, EnvironmentOpts, DialogProcs, PackageDefs,
|
||||
AddToPackageDlg, PkgVirtualUnitEditor, MissingPkgFilesDlg, PackageSystem,
|
||||
CleanPkgDeps;
|
||||
|
||||
const
|
||||
PackageEditorMenuRootName = 'PackageEditor';
|
||||
@ -3014,6 +3014,15 @@ end;
|
||||
|
||||
function TPackageEditorForm.MoveFiles(SrcPkgEdit: TPackageEditorForm;
|
||||
PkgFiles: TFPList; TargetDirectory: string): boolean;
|
||||
|
||||
procedure AddResFile(ResFiles: TStringList; ResFile: string);
|
||||
begin
|
||||
if not FilenameIsAbsolute(ResFile) then exit;
|
||||
if IndexInRecentList(ResFiles,rltFile,ResFile)>=0 then exit;
|
||||
if not FileExistsCached(ResFile) then exit;
|
||||
ResFiles.Add(ResFile);
|
||||
end;
|
||||
|
||||
var
|
||||
i: Integer;
|
||||
PkgFile: TPkgFile;
|
||||
@ -3025,11 +3034,30 @@ var
|
||||
MsgResult: TModalResult;
|
||||
DeleteOld: Boolean;
|
||||
ChangedFilenames: TFilenameToStringTree; // old to new file name
|
||||
UnitResArr: TUnitResourcefileFormatArr;
|
||||
j: Integer;
|
||||
aFilename: String;
|
||||
UnitFilenameToResFileList: TFilenameToPointerTree; // filename to TStringList
|
||||
ResFileList: TStringList;
|
||||
begin
|
||||
Result:=false;
|
||||
|
||||
// ignore non existing files
|
||||
for i:=PkgFiles.Count-1 downto 0 do begin
|
||||
PkgFile:=TPkgFile(PkgFiles[i]);
|
||||
OldFilename:=PkgFile.GetFullFilename;
|
||||
if not FileExistsCached(OldFilename) then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles WARNING: file not found: ',OldFilename]);
|
||||
{$ENDIF}
|
||||
PkgFiles.Delete(i);
|
||||
end;
|
||||
end;
|
||||
if PkgFiles.Count=0 then exit;
|
||||
|
||||
if not FilenameIsAbsolute(TargetDirectory) then exit;
|
||||
TargetDirectory:=AppendPathDelim(TargetDirectory);
|
||||
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles Self=',LazPackage.Filename,' Src=',SrcPkgEdit.LazPackage.Filename,' Dir="',TargetDirectory,'" FileCount=',PkgFiles.Count]);
|
||||
{$ENDIF}
|
||||
@ -3040,14 +3068,19 @@ begin
|
||||
|
||||
NewFileToOldPkgFile:=nil;
|
||||
ChangedFilenames:=nil;
|
||||
UnitFilenameToResFileList:=nil;
|
||||
try
|
||||
// check files
|
||||
MoveFileCount:=0;
|
||||
NewFileToOldPkgFile:=TFilenameToPointerTree.Create(false);
|
||||
ChangedFilenames:=TFilenameToStringTree.Create(false);
|
||||
UnitFilenameToResFileList:=TFilenameToPointerTree.Create(false);
|
||||
UnitFilenameToResFileList.FreeValues:=true;
|
||||
|
||||
for i:=0 to PkgFiles.Count-1 do begin
|
||||
PkgFile:=TPkgFile(PkgFiles[i]);
|
||||
OldFilename:=PkgFile.GetFullFilename;
|
||||
if not FileExistsCached(OldFilename) then continue;
|
||||
NewFilename:=TargetDirectory+ExtractFilename(OldFilename);
|
||||
|
||||
// check if two copied/moved files will get the same new file name
|
||||
@ -3064,6 +3097,8 @@ begin
|
||||
if CompareFilenames(NewFilename,OldFilename)<>0 then begin
|
||||
// file be copied/moved to another directory
|
||||
inc(MoveFileCount);
|
||||
ChangedFilenames[OldFilename]:=NewFilename;
|
||||
|
||||
// check if new position is free
|
||||
if FileExistsCached(NewFilename) then begin
|
||||
IDEMessageDialog('Conflict detected',
|
||||
@ -3073,11 +3108,25 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
ChangedFilenames[OldFilename]:=NewFilename;
|
||||
|
||||
// check resource file
|
||||
if PkgFile.FileType=pftUnit then begin
|
||||
ResFileList:=TStringList.Create;
|
||||
UnitFilenameToResFileList[OldFilename]:=ResFileList;
|
||||
AddResFile(ResFileList,ChangeFileExt(OldFilename,'.lfm'));
|
||||
AddResFile(ResFileList,ChangeFileExt(OldFilename,'.dfm'));
|
||||
AddResFile(ResFileList,ChangeFileExt(OldFilename,'.lrs'));
|
||||
UnitResArr:=GetUnitResourcefileFormats;
|
||||
for j:=0 to length(UnitResArr)-1 do begin
|
||||
aFilename:=UnitResArr[j].GetUnitResourceFilename(OldFilename,true);
|
||||
AddResFile(ResFileList,aFilename);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
// ToDo: remove res files, that are in PkgFiles
|
||||
|
||||
|
||||
if (MoveFileCount=0) and (LazPackage=SrcPackage) then begin
|
||||
// change order in package
|
||||
// ToDo: check this case in ItemsTreeViewDragDrop
|
||||
@ -3110,16 +3159,15 @@ begin
|
||||
end;
|
||||
|
||||
if DeleteOld then begin
|
||||
// close files in source editor
|
||||
// close files and res files in source editor
|
||||
|
||||
end;
|
||||
|
||||
ShowMessage('Moving files is not yet implemented');
|
||||
|
||||
// move/copy file
|
||||
// move/copy secondary files (lfm,lrs)
|
||||
// if SrcPkg<>SelfPkg: clear output dir of SrcPkg
|
||||
// move/copy file and res files, Note: some files are res files
|
||||
// move/copy TPkgFile, make uses-unit unique
|
||||
// if another pkg: clear output dir of SrcPkg
|
||||
// clean up unit/inlude path of SrcPkg
|
||||
finally
|
||||
ChangedFilenames.Free;
|
||||
|
Loading…
Reference in New Issue
Block a user