IDE: package editor: move files: find res files

git-svn-id: trunk@45483 -
This commit is contained in:
mattias 2014-06-12 11:05:58 +00:00
parent 3e8a908c47
commit 791dda33f3
6 changed files with 104 additions and 59 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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)];

View File

@ -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,

View File

@ -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;