mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-28 20:40:56 +02:00
IDE: package editor: move files: use interface
git-svn-id: trunk@45589 -
This commit is contained in:
parent
c07eaa50e2
commit
7d00cd341d
@ -821,7 +821,7 @@ type
|
||||
function GetLazPackage: TLazPackage; virtual;
|
||||
procedure SetLazPackage(const AValue: TLazPackage); virtual; abstract;
|
||||
public
|
||||
procedure UpdateAll(Immediately: boolean); virtual; abstract;
|
||||
procedure UpdateAll(Immediately: boolean = false); virtual; abstract;
|
||||
property LazPackage: TLazPackage read GetLazPackage write SetLazPackage;
|
||||
end;
|
||||
|
||||
|
@ -151,6 +151,32 @@ type
|
||||
constructor Create(aTyp: TPENodeType; aName: string; aRemoved: boolean);
|
||||
end;
|
||||
|
||||
{ IFilesEditorInterface
|
||||
An editor with a TTreeView with files and dependencies }
|
||||
|
||||
IFilesEditorInterface = interface
|
||||
function FilesEditTreeView: TTreeView;
|
||||
function TVNodeFiles: TTreeNode;
|
||||
function TVNodeRequiredPackages: TTreeNode;
|
||||
function FilesEditForm: TCustomForm;
|
||||
function FilesOwner: TObject; // TProject or TLazPackage
|
||||
function FilesOwnerName: string; // for debugging purposes
|
||||
procedure BeginUpdate;
|
||||
procedure EndUpdate;
|
||||
function GetNodeData(TVNode: TTreeNode): TPENodeData;
|
||||
function GetNodeItem(NodeData: TPENodeData): TObject;
|
||||
function GetNodeDataItem(TVNode: TTreeNode; out NodeData: TPENodeData;
|
||||
out Item: TObject): boolean;
|
||||
function GetNodeFilename(Node: TTreeNode): string;
|
||||
function IsDirectoryNode(Node: TTreeNode): boolean;
|
||||
function FilesBaseDirectory: string;
|
||||
function FilesOwnerReadOnly: boolean;
|
||||
function FirstRequiredDependency: TPkgDependency;
|
||||
function ExtendUnitSearchPath(NewUnitPaths: string): boolean;
|
||||
function ExtendIncSearchPath(NewIncPaths: string): boolean;
|
||||
procedure UpdateAll(Immediately: boolean = false);
|
||||
end;
|
||||
|
||||
TPEFlag = (
|
||||
pefNeedUpdateTitle,
|
||||
pefNeedUpdateFiles,
|
||||
@ -164,7 +190,7 @@ type
|
||||
|
||||
{ TPackageEditorForm }
|
||||
|
||||
TPackageEditorForm = class(TBasePackageEditor)
|
||||
TPackageEditorForm = class(TBasePackageEditor,IFilesEditorInterface)
|
||||
MoveDownBtn: TSpeedButton;
|
||||
MoveUpBtn: TSpeedButton;
|
||||
DirectoryHierarchyButton: TSpeedButton;
|
||||
@ -334,18 +360,29 @@ type
|
||||
procedure DoSave(SaveAs: boolean);
|
||||
procedure DoSortFiles;
|
||||
function DoOpenPkgFile(PkgFile: TPkgFile): TModalResult;
|
||||
procedure UpdateAll(Immediately: boolean); override;
|
||||
function ShowAddDialog(var DlgPage: TAddToPkgType): TModalResult;
|
||||
procedure BeginUdate;
|
||||
procedure EndUpdate;
|
||||
public
|
||||
// IFilesEditorInterface
|
||||
function FilesEditTreeView: TTreeView;
|
||||
function FilesEditForm: TCustomForm;
|
||||
function FilesOwner: TObject; // = Lazpackage
|
||||
function FilesOwnerName: string;
|
||||
function TVNodeFiles: TTreeNode;
|
||||
function TVNodeRequiredPackages: TTreeNode;
|
||||
function FilesBaseDirectory: string;
|
||||
function FilesOwnerReadOnly: boolean;
|
||||
function FirstRequiredDependency: TPkgDependency;
|
||||
function ExtendUnitSearchPath(NewUnitPaths: string): boolean;
|
||||
function ExtendIncSearchPath(NewIncPaths: string): boolean;
|
||||
function GetNodeData(TVNode: TTreeNode): TPENodeData;
|
||||
function GetNodeItem(NodeData: TPENodeData): TObject;
|
||||
function GetNodeDataItem(TVNode: TTreeNode; out NodeData: TPENodeData;
|
||||
out Item: TObject): boolean;
|
||||
function IsDirectoryNode(Node: TTreeNode): boolean;
|
||||
function GetNodeFilename(Node: TTreeNode): string;
|
||||
function ExtendUnitSearchPath(NewUnitPaths: string): boolean;
|
||||
function ExtendIncSearchPath(NewIncPaths: string): boolean;
|
||||
function IsDirectoryNode(Node: TTreeNode): boolean;
|
||||
procedure BeginUpdate;
|
||||
procedure EndUpdate;
|
||||
procedure UpdateAll(Immediately: boolean = false); override;
|
||||
public
|
||||
property LazPackage: TLazPackage read FLazPackage write SetLazPackage;
|
||||
property SortAlphabetically: boolean read FSortAlphabetically write SetSortAlphabetically;
|
||||
@ -593,7 +630,7 @@ var
|
||||
NodeData: TPENodeData;
|
||||
Item: TObject;
|
||||
begin
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=ItemsTreeView.Selections[i];
|
||||
@ -1172,7 +1209,7 @@ var
|
||||
PkgCount: Integer;
|
||||
PkgWarning: String;
|
||||
begin
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
ANode:=ItemsTreeView.Selected;
|
||||
if (ANode=nil) or LazPackage.ReadOnly then begin
|
||||
@ -1315,7 +1352,7 @@ begin
|
||||
debugln(['TPackageEditorForm.FormDropFiles ',length(FileNames)]);
|
||||
{$ENDIF}
|
||||
if length(FileNames)=0 then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
NewUnitPaths:='';
|
||||
NewIncPaths:='';
|
||||
@ -1452,7 +1489,7 @@ end;
|
||||
procedure TPackageEditorForm.AddBitBtnClick(Sender: TObject);
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
ShowAddDialog(fLastDlgPage);
|
||||
finally
|
||||
@ -1471,7 +1508,7 @@ var
|
||||
j: Integer;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=ItemsTreeView.Selections[i];
|
||||
@ -1563,7 +1600,7 @@ var
|
||||
Item: TObject;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=ItemsTreeView.Selections[i];
|
||||
@ -1596,7 +1633,7 @@ begin
|
||||
CurItem:=TIDEMenuCommand(Sender);
|
||||
for CurPFT:=Low(TPkgFileType) to High(TPkgFileType) do begin
|
||||
if CurItem.Caption=GetPkgFileTypeLocalizedName(CurPFT) then begin
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=ItemsTreeView.Selections[i];
|
||||
@ -1628,7 +1665,7 @@ var
|
||||
Dependency: TPkgDependency;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
ListOfNodeInfos:=nil;
|
||||
try
|
||||
if ShowCleanPkgDepDlg(LazPackage,ListOfNodeInfos)<>mrOk then exit;
|
||||
@ -1693,7 +1730,7 @@ var
|
||||
Item: TObject;
|
||||
begin
|
||||
if LazPackage=nil then exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
for i:=0 to ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=ItemsTreeView.Selections[i];
|
||||
@ -1847,7 +1884,7 @@ begin
|
||||
if (NewFilename=FSingleSelectedDependency.DefaultFilename)
|
||||
and (FSingleSelectedDependency.PreferDefaultFilename=AsPreferred) then
|
||||
exit;
|
||||
BeginUdate;
|
||||
BeginUpdate;
|
||||
try
|
||||
FSingleSelectedDependency.DefaultFilename:=NewFilename;
|
||||
FSingleSelectedDependency.PreferDefaultFilename:=AsPreferred;
|
||||
@ -2101,7 +2138,7 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPackageEditorForm.BeginUdate;
|
||||
procedure TPackageEditorForm.BeginUpdate;
|
||||
begin
|
||||
inc(fUpdateLock);
|
||||
end;
|
||||
@ -2901,6 +2938,51 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesEditTreeView: TTreeView;
|
||||
begin
|
||||
Result:=ItemsTreeView;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesEditForm: TCustomForm;
|
||||
begin
|
||||
Result:=Self;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesOwner: TObject;
|
||||
begin
|
||||
Result:=LazPackage;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesOwnerName: string;
|
||||
begin
|
||||
Result:=LazPackage.Name;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.TVNodeFiles: TTreeNode;
|
||||
begin
|
||||
Result:=FFilesNode;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.TVNodeRequiredPackages: TTreeNode;
|
||||
begin
|
||||
Result:=FRequiredPackagesNode;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesBaseDirectory: string;
|
||||
begin
|
||||
Result:=LazPackage.Directory;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FilesOwnerReadOnly: boolean;
|
||||
begin
|
||||
Result:=LazPackage.ReadOnly;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.FirstRequiredDependency: TPkgDependency;
|
||||
begin
|
||||
Result:=LazPackage.FirstRequiredDependency;
|
||||
end;
|
||||
|
||||
function TPackageEditorForm.CanBeAddedToProject: boolean;
|
||||
begin
|
||||
if LazPackage=nil then exit(false);
|
||||
|
@ -196,13 +196,13 @@ type
|
||||
const AnUnitName, AnUnitInFilename: string);
|
||||
// move files
|
||||
function CheckDrag(Sender, Source: TObject; X, Y: Integer;
|
||||
out SrcPkgEdit, TargetPkgEdit: TPackageEditorForm;
|
||||
out SrcFilesEdit, TargetFilesEdit: IFilesEditorInterface;
|
||||
out aFileCount, aDependencyCount, aDirectoryCount: integer;
|
||||
out TargetTVNode: TTreeNode; out TargetTVType: TTreeViewInsertMarkType
|
||||
): boolean;
|
||||
function MoveFiles(TargetPkgEdit, SrcPkgEdit: TPackageEditorForm;
|
||||
function MoveFiles(TargetFilesEdit, SrcFilesEdit: IFilesEditorInterface;
|
||||
TargetDirectory: string): boolean;
|
||||
function MoveFiles(TargetPkgEdit, SrcPkgEdit: TPackageEditorForm;
|
||||
function MoveFiles(TargetFilesEdit, SrcFilesEdit: IFilesEditorInterface;
|
||||
PkgFiles: TFPList; TargetDirectory: string): boolean;
|
||||
function CopyMoveFiles(Sender: TObject): boolean;
|
||||
public
|
||||
@ -853,8 +853,6 @@ end;
|
||||
procedure TPkgManager.OnPackageEditorDragDropTreeView(Sender, Source: TObject;
|
||||
X, Y: Integer);
|
||||
var
|
||||
SrcPkgEdit: TPackageEditorForm;
|
||||
TargetPkgEdit: TPackageEditorForm;
|
||||
aFileCount: integer;
|
||||
aDependencyCount: integer;
|
||||
aDirectoryCount: integer;
|
||||
@ -864,18 +862,20 @@ var
|
||||
Item: TObject;
|
||||
PkgFile: TPkgFile;
|
||||
Directory: String;
|
||||
SrcFilesEdit: IFilesEditorInterface;
|
||||
TargetFilesEdit: IFilesEditorInterface;
|
||||
begin
|
||||
if not CheckDrag(Sender, Source, X, Y, SrcPkgEdit, TargetPkgEdit, aFileCount,
|
||||
aDependencyCount, aDirectoryCount, TargetTVNode, TargetTVType) then
|
||||
begin
|
||||
if not CheckDrag(Sender, Source, X, Y, SrcFilesEdit, TargetFilesEdit,
|
||||
aFileCount, aDependencyCount, aDirectoryCount, TargetTVNode, TargetTVType)
|
||||
then begin
|
||||
ShowMessage('drop failed, dragover was wrong');
|
||||
exit;
|
||||
end;
|
||||
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPkgManager.OnPackageEditorDragDropTreeView START Src=',SrcPkgEdit.LazPackage.Name,' Target=',TargetPkgEdit.LazPackage.Name,' FileCount=',aFileCount,' DepCount=',aDependencyCount,' DirCount=',aDirectoryCount]);
|
||||
debugln(['TPkgManager.OnPackageEditorDragDropTreeView START Src=',SrcFilesEdit.FilesOwnerName,' Target=',TargetFilesEdit.FilesOwnerName,' FileCount=',aFileCount,' DepCount=',aDependencyCount,' DirCount=',aDirectoryCount]);
|
||||
{$ENDIF}
|
||||
if TargetPkgEdit.GetNodeDataItem(TargetTVNode,NodeData,Item) then begin
|
||||
if TargetFilesEdit.GetNodeDataItem(TargetTVNode,NodeData,Item) then begin
|
||||
if Item is TPkgFile then begin
|
||||
PkgFile:=TPkgFile(Item);
|
||||
if aFileCount=0 then exit;
|
||||
@ -884,7 +884,7 @@ begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPkgManager.OnPackageEditorDragDropTreeView drag files to directory of ',PkgFile.Filename]);
|
||||
{$ENDIF}
|
||||
MoveFiles(TargetPkgEdit,SrcPkgEdit,Directory);
|
||||
MoveFiles(TargetFilesEdit,SrcFilesEdit,Directory);
|
||||
end else if Item is TPkgDependency then begin
|
||||
if aDependencyCount=0 then exit;
|
||||
// ToDo: drag dependencies
|
||||
@ -893,16 +893,16 @@ begin
|
||||
{$ENDIF}
|
||||
ShowMessage('Not implemented yet: drag dependencies');
|
||||
end;
|
||||
end else if TargetPkgEdit.IsDirectoryNode(TargetTVNode)
|
||||
or (TargetTVNode=TargetPkgEdit.FilesNode)
|
||||
end else if TargetFilesEdit.IsDirectoryNode(TargetTVNode)
|
||||
or (TargetTVNode=TargetFilesEdit.TVNodeFiles)
|
||||
then begin
|
||||
Directory:=TargetPkgEdit.GetNodeFilename(TargetTVNode);
|
||||
Directory:=TargetFilesEdit.GetNodeFilename(TargetTVNode);
|
||||
if aFileCount>0 then begin
|
||||
// drag files
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPkgManager.OnPackageEditorDragDropTreeView drag files to ',TargetPkgEdit.LazPackage.Directory]);
|
||||
debugln(['TPkgManager.OnPackageEditorDragDropTreeView drag files to ',TargetFilesEdit.FilesBaseDirectory]);
|
||||
{$ENDIF}
|
||||
MoveFiles(TargetPkgEdit,SrcPkgEdit,Directory);
|
||||
MoveFiles(TargetFilesEdit,SrcFilesEdit,Directory);
|
||||
end else if aDirectoryCount>0 then begin
|
||||
// drag directory
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
@ -912,7 +912,7 @@ begin
|
||||
end else begin
|
||||
ShowMessage('I cannot drag that to a directory');
|
||||
end;
|
||||
end else if TargetTVNode=TargetPkgEdit.RequiredPackagesNode then begin
|
||||
end else if TargetTVNode=TargetFilesEdit.TVNodeRequiredPackages then begin
|
||||
if aDependencyCount=0 then exit;
|
||||
// ToDo: drag dependencies
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
@ -939,10 +939,10 @@ var
|
||||
aFileCount: integer;
|
||||
aDependencyCount: integer;
|
||||
aDirectoryCount: integer;
|
||||
TargetPkgEdit: TPackageEditorForm;
|
||||
SrcPkgEdit: TPackageEditorForm;
|
||||
TargetFilesEdit: IFilesEditorInterface;
|
||||
SrcFilesEdit: IFilesEditorInterface;
|
||||
begin
|
||||
Result:=CheckDrag(Sender, Source, X, Y, TargetPkgEdit, SrcPkgEdit, aFileCount,
|
||||
Result:=CheckDrag(Sender, Source, X, Y, TargetFilesEdit, SrcFilesEdit, aFileCount,
|
||||
aDependencyCount, aDirectoryCount, TargetTVNode, TargetTVType);
|
||||
end;
|
||||
|
||||
@ -1695,7 +1695,7 @@ begin
|
||||
end;
|
||||
|
||||
function TPkgManager.CheckDrag(Sender, Source: TObject; X, Y: Integer; out
|
||||
SrcPkgEdit, TargetPkgEdit: TPackageEditorForm; out aFileCount,
|
||||
SrcFilesEdit, TargetFilesEdit: IFilesEditorInterface; out aFileCount,
|
||||
aDependencyCount, aDirectoryCount: integer; out TargetTVNode: TTreeNode; out
|
||||
TargetTVType: TTreeViewInsertMarkType): boolean;
|
||||
var
|
||||
@ -1704,10 +1704,11 @@ var
|
||||
NodeData: TPENodeData;
|
||||
Item: TObject;
|
||||
Directory: String;
|
||||
SrcPkgEdit: TPackageEditorForm;
|
||||
begin
|
||||
Result:=false;
|
||||
SrcPkgEdit:=nil;
|
||||
TargetPkgEdit:=nil;
|
||||
SrcFilesEdit:=nil;
|
||||
TargetFilesEdit:=nil;
|
||||
aFileCount:=0;
|
||||
aDependencyCount:=0;
|
||||
aDirectoryCount:=0;
|
||||
@ -1717,38 +1718,39 @@ begin
|
||||
// get source
|
||||
if (Source is TTreeView) then begin
|
||||
SrcPkgEdit:=PackageEditors.TreeViewToPkgEditor(TTreeView(Source));
|
||||
//debugln(['TPkgManager.ItemsTreeViewDragOver from another package editor: ',SrcPkgEdit.LazPackage.Name]);
|
||||
//debugln(['TPkgManager.ItemsTreeViewDragOver from another package editor: ',SrcFilesEdit.LazPackage.Name]);
|
||||
if (SrcPkgEdit=nil) or SrcPkgEdit.LazPackage.ReadOnly
|
||||
or SrcPkgEdit.LazPackage.IsVirtual then
|
||||
exit;
|
||||
SrcFilesEdit:=SrcPkgEdit;
|
||||
end else
|
||||
exit;
|
||||
|
||||
// get target
|
||||
if Sender is TTreeView then begin
|
||||
TargetPkgEdit:=PackageEditors.TreeViewToPkgEditor(TTreeView(Sender));
|
||||
if (TargetPkgEdit=nil) or TargetPkgEdit.LazPackage.ReadOnly
|
||||
or TargetPkgEdit.LazPackage.IsVirtual then
|
||||
TargetFilesEdit:=PackageEditors.TreeViewToPkgEditor(TTreeView(Sender));
|
||||
if (TargetFilesEdit=nil) or TargetFilesEdit.FilesOwnerReadOnly
|
||||
or (not FilenameIsAbsolute(TargetFilesEdit.FilesBaseDirectory)) then
|
||||
exit;
|
||||
end else
|
||||
exit;
|
||||
|
||||
//debugln(['TPkgManager.CheckDrag Src=',SrcPkgEdit.LazPackage.Name,' Target=',TargetPkgEdit.LazPackage.Name]);
|
||||
//debugln(['TPkgManager.CheckDrag Src=',SrcFilesEdit.LazPackage.Name,' Target=',TargetFilesEdit.LazPackage.Name]);
|
||||
|
||||
// check items
|
||||
aFileCount:=0;
|
||||
aDependencyCount:=0;
|
||||
aDirectoryCount:=0;
|
||||
for i:=0 to SrcPkgEdit.ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=SrcPkgEdit.ItemsTreeView.Selections[i];
|
||||
if SrcPkgEdit.GetNodeDataItem(TVNode,NodeData,Item) then begin
|
||||
for i:=0 to SrcFilesEdit.FilesEditTreeView.SelectionCount-1 do begin
|
||||
TVNode:=SrcFilesEdit.FilesEditTreeView.Selections[i];
|
||||
if SrcFilesEdit.GetNodeDataItem(TVNode,NodeData,Item) then begin
|
||||
if NodeData.Removed then exit; // removed things cannot be moved
|
||||
if Item is TPkgFile then begin
|
||||
inc(aFileCount);
|
||||
end else if Item is TPkgDependency then begin
|
||||
inc(aDependencyCount);
|
||||
end;
|
||||
end else if SrcPkgEdit.IsDirectoryNode(TVNode) then begin
|
||||
end else if SrcFilesEdit.IsDirectoryNode(TVNode) then begin
|
||||
inc(aDirectoryCount);
|
||||
end;
|
||||
end;
|
||||
@ -1778,38 +1780,38 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
TargetPkgEdit.ItemsTreeView.GetInsertMarkAt(X,Y,TargetTVNode,TargetTVType);
|
||||
TargetFilesEdit.FilesEditTreeView.GetInsertMarkAt(X,Y,TargetTVNode,TargetTVType);
|
||||
if TargetTVNode=nil then begin
|
||||
if aDependencyCount>0 then begin
|
||||
TargetTVNode:=TargetPkgEdit.RequiredPackagesNode;
|
||||
TargetTVNode:=TargetFilesEdit.TVNodeRequiredPackages;
|
||||
end else begin
|
||||
TargetTVNode:=TargetPkgEdit.FilesNode;
|
||||
TargetTVNode:=TargetFilesEdit.TVNodeFiles;
|
||||
end;
|
||||
TargetTVType:=tvimAsFirstChild;
|
||||
end;
|
||||
if TargetPkgEdit.GetNodeDataItem(TargetTVNode,NodeData,Item) then begin
|
||||
if TargetFilesEdit.GetNodeDataItem(TargetTVNode,NodeData,Item) then begin
|
||||
// move to specific position is not yet supported
|
||||
// => redirect to parent nodes
|
||||
repeat
|
||||
TargetTVNode:=TargetTVNode.Parent;
|
||||
if TargetTVNode=nil then
|
||||
exit;
|
||||
until (TargetTVNode=TargetPkgEdit.FilesNode)
|
||||
or (TargetTVNode=TargetPkgEdit.RequiredPackagesNode)
|
||||
or TargetPkgEdit.IsDirectoryNode(TargetTVNode);
|
||||
until (TargetTVNode=TargetFilesEdit.TVNodeFiles)
|
||||
or (TargetTVNode=TargetFilesEdit.TVNodeRequiredPackages)
|
||||
or TargetFilesEdit.IsDirectoryNode(TargetTVNode);
|
||||
TargetTVType:=tvimAsFirstChild;
|
||||
end;
|
||||
if TargetPkgEdit.IsDirectoryNode(TargetTVNode)
|
||||
or (TargetTVNode=TargetPkgEdit.FilesNode)
|
||||
if TargetFilesEdit.IsDirectoryNode(TargetTVNode)
|
||||
or (TargetTVNode=TargetFilesEdit.TVNodeFiles)
|
||||
then begin
|
||||
Directory:=TargetPkgEdit.GetNodeFilename(TargetTVNode);
|
||||
Directory:=TargetFilesEdit.GetNodeFilename(TargetTVNode);
|
||||
if not FilenameIsAbsolute(Directory) then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPkgManager.CheckDrag: invalid target directory ',Directory]);
|
||||
{$ENDIF}
|
||||
exit;
|
||||
end;
|
||||
if TargetTVNode=TargetPkgEdit.FilesNode then
|
||||
if TargetTVNode=TargetFilesEdit.TVNodeFiles then
|
||||
TargetTVType:=tvimAsFirstChild;
|
||||
if aFileCount>0 then begin
|
||||
// drag files
|
||||
@ -1825,7 +1827,7 @@ begin
|
||||
{$ENDIF}
|
||||
exit;
|
||||
end;
|
||||
end else if TargetTVNode=TargetPkgEdit.RequiredPackagesNode then begin
|
||||
end else if TargetTVNode=TargetFilesEdit.TVNodeRequiredPackages then begin
|
||||
if aDependencyCount=0 then exit;
|
||||
// drag dependencies
|
||||
TargetTVType:=tvimAsFirstChild;
|
||||
@ -1840,7 +1842,7 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
if (SrcPkgEdit=TargetPkgEdit)
|
||||
if (SrcFilesEdit=TargetFilesEdit)
|
||||
and (TargetTVNode.Selected or TargetTVNode.MultiSelected)
|
||||
then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
@ -1852,7 +1854,7 @@ begin
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
function TPkgManager.MoveFiles(TargetPkgEdit, SrcPkgEdit: TPackageEditorForm;
|
||||
function TPkgManager.MoveFiles(TargetFilesEdit, SrcFilesEdit: IFilesEditorInterface;
|
||||
TargetDirectory: string): boolean;
|
||||
var
|
||||
Files: TFPList; // list of TPkgFile
|
||||
@ -1869,13 +1871,13 @@ begin
|
||||
exit;
|
||||
end;
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPkgManager.MoveFiles Target=',TargetPkgEdit.LazPackage.Filename,' Src=',SrcPkgEdit.LazPackage.Filename,' Dir="',TargetDirectory,'"']);
|
||||
debugln(['TPkgManager.MoveFiles Target=',TargetFilesEdit.FilesOwnerName,' Src=',SrcFilesEdit.FilesOwnerName,' Dir="',TargetDirectory,'"']);
|
||||
{$ENDIF}
|
||||
Files:=TFPList.Create;
|
||||
try
|
||||
for i:=0 to SrcPkgEdit.ItemsTreeView.SelectionCount-1 do begin
|
||||
TVNode:=SrcPkgEdit.ItemsTreeView.Selections[i];
|
||||
if not SrcPkgEdit.GetNodeDataItem(TVNode, NodeData, Item) then continue;
|
||||
for i:=0 to SrcFilesEdit.FilesEditTreeView.SelectionCount-1 do begin
|
||||
TVNode:=SrcFilesEdit.FilesEditTreeView.Selections[i];
|
||||
if not SrcFilesEdit.GetNodeDataItem(TVNode, NodeData, Item) then continue;
|
||||
if NodeData.Removed then continue;
|
||||
if not (Item is TPkgFile) then continue;
|
||||
Files.Add(Item);
|
||||
@ -1887,22 +1889,23 @@ begin
|
||||
exit(true);
|
||||
end;
|
||||
|
||||
Result:=MoveFiles(TargetPkgEdit,SrcPkgEdit,Files,TargetDirectory);
|
||||
Result:=MoveFiles(TargetFilesEdit,SrcFilesEdit,Files,TargetDirectory);
|
||||
finally
|
||||
Files.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPkgManager.MoveFiles(TargetPkgEdit, SrcPkgEdit: TPackageEditorForm;
|
||||
function TPkgManager.MoveFiles(TargetFilesEdit, SrcFilesEdit: IFilesEditorInterface;
|
||||
PkgFiles: TFPList; TargetDirectory: string): boolean;
|
||||
var
|
||||
SrcPackage: TLazPackage;
|
||||
ChangedFilenames: TFilenameToStringTree; // old to new file name
|
||||
AllChangedFilenames: TFilenameToStringTree; // including resouce files
|
||||
NewFileToOldPkgFile: TFilenameToPointerTree; // filename to TPkgFile
|
||||
DeleteOld: Boolean;
|
||||
UnitFilenameToResFileList: TFilenameToPointerTree; // filename to TStringList
|
||||
SrcDirToPkg: TFilenameToPointerTree;
|
||||
SrcPackage, TargetPackage: TLazPackage;
|
||||
SrcIsTarget: Boolean;
|
||||
|
||||
procedure DeleteNonExistingPkgFiles;
|
||||
var
|
||||
@ -1960,7 +1963,7 @@ var
|
||||
IDEMessageDialog(lisConflictDetected,
|
||||
Format(lisTwoMovedFilesWillHaveTheSameFileNameInPackage, [#13, PkgFile
|
||||
.Filename, #13, TPkgFile(NewFileToOldPkgFile[NewFilename]).
|
||||
Filename, #13, TargetPkgEdit.LazPackage.Name]), mtError, [mbCancel]);
|
||||
Filename, #13, TargetFilesEdit.FilesOwnerName]), mtError, [mbCancel]);
|
||||
exit;
|
||||
end;
|
||||
NewFileToOldPkgFile[NewFilename]:=PkgFile;
|
||||
@ -2027,44 +2030,46 @@ var
|
||||
if FileExistsCached(NewFilename) then begin
|
||||
IDEMessageDialog(lisConflictDetected,
|
||||
Format(lisThereIsAlreadyAFileInPackage, [#13, NewFilename, #13,
|
||||
TargetPkgEdit.LazPackage.Name]), mtError, [mbCancel]);
|
||||
TargetFilesEdit.FilesOwnerName]), mtError, [mbCancel]);
|
||||
exit;
|
||||
end;
|
||||
|
||||
if (TargetPkgEdit.LazPackage<>SrcPackage) then begin
|
||||
if (not SrcIsTarget) then begin
|
||||
// warn duplicate names
|
||||
if FilenameIsPascalUnit(NewFilename) then begin
|
||||
// warn duplicate unit name
|
||||
CurName:=ExtractFileNameOnly(NewFilename);
|
||||
ConflictFile:=TargetPkgEdit.LazPackage.FindUnit(CurName,true);
|
||||
if (ConflictFile<>nil) and WarnUnitClash then begin
|
||||
ShortFilename:=NewFilename;
|
||||
TargetPkgEdit.LazPackage.ShortenFilename(ShortFilename,true);
|
||||
r:=IDEMessageDialog(lisDuplicateUnit,
|
||||
Format(lisThereIsAlreadyAUnitInPackageOldNewYouHaveToMakeSur, [
|
||||
CurName, TargetPkgEdit.LazPackage.Name, #13, ConflictFile.GetShortFilename(
|
||||
true), #13, ShortFilename, #13, #13, #13])
|
||||
,mtWarning,[mbYes,mbYesToAll,mbCancel]);
|
||||
case r of
|
||||
mrYes: ;
|
||||
mrYesToAll: WarnUnitClash:=false;
|
||||
else exit;
|
||||
if TargetPackage<>nil then begin
|
||||
ConflictFile:=TargetPackage.FindUnit(CurName,true);
|
||||
if (ConflictFile<>nil) and WarnUnitClash then begin
|
||||
ShortFilename:=NewFilename;
|
||||
TargetPackage.ShortenFilename(ShortFilename,true);
|
||||
r:=IDEMessageDialog(lisDuplicateUnit,
|
||||
Format(lisThereIsAlreadyAUnitInPackageOldNewYouHaveToMakeSur, [
|
||||
CurName, TargetPackage.Name, #13, ConflictFile.GetShortFilename(
|
||||
true), #13, ShortFilename, #13, #13, #13])
|
||||
,mtWarning,[mbYes,mbYesToAll,mbCancel]);
|
||||
case r of
|
||||
mrYes: ;
|
||||
mrYesToAll: WarnUnitClash:=false;
|
||||
else exit;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end else begin
|
||||
end else if TargetPackage<>nil then begin
|
||||
// warn duplicate file
|
||||
for i:=0 to TargetPkgEdit.LazPackage.FileCount-1 do begin
|
||||
for i:=0 to TargetPackage.FileCount-1 do begin
|
||||
if not WarnNameClash then continue;
|
||||
ConflictFile:=TargetPkgEdit.LazPackage.Files[i];
|
||||
ConflictFile:=TargetPackage.Files[i];
|
||||
CurName:=ExtractFilename(NewFilename);
|
||||
if UTF8CompareText(CurName,ExtractFileName(ConflictFile.Filename))<>0
|
||||
then
|
||||
continue;
|
||||
ShortFilename:=NewFilename;
|
||||
TargetPkgEdit.LazPackage.ShortenFilename(ShortFilename,true);
|
||||
TargetPackage.ShortenFilename(ShortFilename,true);
|
||||
r:=IDEMessageDialog(lisDuplicateFileName,
|
||||
Format(lisThereIsAlreadyAFileInPackageOldNewContinue, [CurName,
|
||||
TargetPkgEdit.LazPackage.Name, #13, ConflictFile.GetShortFilename(true), #13,
|
||||
TargetPackage.Name, #13, ConflictFile.GetShortFilename(true), #13,
|
||||
ShortFilename, #13, #13])
|
||||
,mtWarning,[mbYes,mbYesToAll,mbCancel]);
|
||||
case r of
|
||||
@ -2212,13 +2217,13 @@ var
|
||||
Tool: TCodeTool;
|
||||
NewFilename: String;
|
||||
begin
|
||||
if TargetPkgEdit.LazPackage=SrcPackage then
|
||||
if SrcIsTarget then
|
||||
exit(true);
|
||||
// moving files to another package
|
||||
if PackageGraph.FindDependencyRecursively(
|
||||
TargetPkgEdit.LazPackage.FirstRequiredDependency,SrcPackage)<>nil
|
||||
// moving files to another package/project
|
||||
if (SrcPackage<>nil) and (PackageGraph.FindDependencyRecursively(
|
||||
TargetFilesEdit.FirstRequiredDependency,SrcPackage)<>nil)
|
||||
then begin
|
||||
// units are moved to higher level package
|
||||
// units are moved to higher level package/project
|
||||
// => no check needed
|
||||
exit(true);
|
||||
end;
|
||||
@ -2273,9 +2278,9 @@ var
|
||||
end;
|
||||
end;
|
||||
// unit paths
|
||||
if not TargetPkgEdit.ExtendUnitSearchPath(NewUnitPaths) then exit(false);
|
||||
if not TargetFilesEdit.ExtendUnitSearchPath(NewUnitPaths) then exit(false);
|
||||
// include paths
|
||||
if not TargetPkgEdit.ExtendIncSearchPath(NewIncPaths) then exit(false);
|
||||
if not TargetFilesEdit.ExtendIncSearchPath(NewIncPaths) then exit(false);
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
@ -2321,49 +2326,61 @@ var
|
||||
exit;
|
||||
end;
|
||||
|
||||
OldPkgFile:=SrcPackage.FindPkgFile(OldFilename,true,false);
|
||||
if OldPkgFile=nil then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile old file not in lpk: "',OldFilename,'" pkg=',SrcPackage.Name]);
|
||||
{$ENDIF}
|
||||
// this is a resource file
|
||||
// => do not create an entry in the target package
|
||||
exit(true);
|
||||
end;
|
||||
// create new TPkgFile
|
||||
NewPkgFile:=TargetPkgEdit.LazPackage.FindPkgFile(NewFilename,true,false);
|
||||
if NewPkgFile=nil then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile create new "',NewFilename,'" pkg=',TargetPkgEdit.LazPackage.Name]);
|
||||
{$ENDIF}
|
||||
NewPkgFile:=TargetPkgEdit.LazPackage.AddFile(NewFilename,OldPkgFile.Unit_Name,
|
||||
OldPkgFile.FileType,OldPkgFile.Flags,OldPkgFile.ComponentPriority.Category);
|
||||
if SrcPackage<>nil then begin
|
||||
OldPkgFile:=SrcPackage.FindPkgFile(OldFilename,true,false);
|
||||
if OldPkgFile=nil then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile old file not in lpk: "',OldFilename,'" pkg=',SrcPackage.Name]);
|
||||
{$ENDIF}
|
||||
// this is a resource file
|
||||
// => do not create an entry in the target package
|
||||
exit(true);
|
||||
end;
|
||||
end else begin
|
||||
NewPkgFile.Unit_Name:=OldPkgFile.Unit_Name;
|
||||
NewPkgFile.FileType:=OldPkgFile.FileType;
|
||||
NewPkgFile.Flags:=OldPkgFile.Flags;
|
||||
NewPkgFile.ComponentPriority:=OldPkgFile.ComponentPriority;
|
||||
raise Exception.Create('implement me');
|
||||
end;
|
||||
NewPkgFile.ResourceBaseClass:=OldPkgFile.ResourceBaseClass;
|
||||
NewPkgFile.HasRegisterProc:=OldPkgFile.HasRegisterProc;
|
||||
if OldPkgFile.AddToUsesPkgSection
|
||||
and (TargetPkgEdit.LazPackage.FindUsedUnit(ExtractFileNameOnly(NewFilename),NewPkgFile)<>nil)
|
||||
then begin
|
||||
// another unit with this name is already used
|
||||
NewPkgFile.AddToUsesPkgSection:=false;
|
||||
if TargetPackage<>nil then begin
|
||||
// create new TPkgFile
|
||||
NewPkgFile:=TargetPackage.FindPkgFile(NewFilename,true,false);
|
||||
if NewPkgFile=nil then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile create new "',NewFilename,'" pkg=',TargetPackage.Name]);
|
||||
{$ENDIF}
|
||||
NewPkgFile:=TargetPackage.AddFile(NewFilename,OldPkgFile.Unit_Name,
|
||||
OldPkgFile.FileType,OldPkgFile.Flags,OldPkgFile.ComponentPriority.Category);
|
||||
end else begin
|
||||
NewPkgFile.Unit_Name:=OldPkgFile.Unit_Name;
|
||||
NewPkgFile.FileType:=OldPkgFile.FileType;
|
||||
NewPkgFile.Flags:=OldPkgFile.Flags;
|
||||
NewPkgFile.ComponentPriority:=OldPkgFile.ComponentPriority;
|
||||
end;
|
||||
NewPkgFile.ResourceBaseClass:=OldPkgFile.ResourceBaseClass;
|
||||
NewPkgFile.HasRegisterProc:=OldPkgFile.HasRegisterProc;
|
||||
if OldPkgFile.AddToUsesPkgSection
|
||||
and (TargetPackage.FindUsedUnit(ExtractFileNameOnly(NewFilename),NewPkgFile)<>nil)
|
||||
then begin
|
||||
// another unit with this name is already used
|
||||
NewPkgFile.AddToUsesPkgSection:=false;
|
||||
end else begin
|
||||
NewPkgFile.AddToUsesPkgSection:=OldPkgFile.AddToUsesPkgSection;
|
||||
end;
|
||||
end else begin
|
||||
NewPkgFile.AddToUsesPkgSection:=OldPkgFile.AddToUsesPkgSection;
|
||||
raise Exception.Create('implement me');
|
||||
end;
|
||||
|
||||
// delete old
|
||||
if DeleteOld then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile delete "',OldPkgFile.Filename,'" pkg=',OldPkgFile.LazPackage.Name]);
|
||||
{$ENDIF}
|
||||
SrcPackage.DeleteFile(OldPkgFile);
|
||||
if OldPkgFile<>nil then begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['MoveOrCopyFile delete "',OldPkgFile.Filename,'" pkg=',OldPkgFile.LazPackage.Name]);
|
||||
{$ENDIF}
|
||||
SrcPackage.DeleteFile(OldPkgFile);
|
||||
end else begin
|
||||
raise Exception.Create('implement me');
|
||||
end;
|
||||
end;
|
||||
TargetPkgEdit.UpdateAll(false);
|
||||
SrcPkgEdit.UpdateAll(false);
|
||||
TargetFilesEdit.UpdateAll;
|
||||
SrcFilesEdit.UpdateAll;
|
||||
Result:=true;
|
||||
end;
|
||||
|
||||
@ -2377,8 +2394,8 @@ var
|
||||
OldFilenames: TStringList;
|
||||
begin
|
||||
Result:=false;
|
||||
TargetPkgEdit.BeginUdate;
|
||||
SrcPkgEdit.BeginUdate;
|
||||
TargetFilesEdit.BeginUpdate;
|
||||
SrcFilesEdit.BeginUpdate;
|
||||
OldFilenames:=TStringList.Create;
|
||||
MovedFiles:=TFilenameToPointerTree.Create(false);
|
||||
try
|
||||
@ -2395,8 +2412,8 @@ var
|
||||
finally
|
||||
MovedFiles.Free;
|
||||
OldFilenames.Free;
|
||||
SrcPkgEdit.EndUpdate;
|
||||
TargetPkgEdit.EndUpdate;
|
||||
SrcFilesEdit.EndUpdate;
|
||||
TargetFilesEdit.EndUpdate;
|
||||
end;
|
||||
Result:=true;
|
||||
end;
|
||||
@ -2424,9 +2441,26 @@ begin
|
||||
TargetDirectory:=AppendPathDelim(TargetDirectory);
|
||||
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles Self=',TargetPkgEdit.LazPackage.Filename,' Src=',SrcPkgEdit.LazPackage.Filename,' Dir="',TargetDirectory,'" FileCount=',PkgFiles.Count]);
|
||||
debugln(['TPackageEditorForm.MoveFiles Self=',TargetFilesEdit.FilesOwnerName,' Src=',SrcFilesEdit.FilesOwnerName,' Dir="',TargetDirectory,'" FileCount=',PkgFiles.Count]);
|
||||
{$ENDIF}
|
||||
SrcPackage:=SrcPkgEdit.LazPackage;
|
||||
SrcPackage:=nil;
|
||||
if SrcFilesEdit.FilesOwner is TLazPackage then
|
||||
SrcPackage:=TLazPackage(SrcFilesEdit.FilesOwner)
|
||||
else begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles invalid src=',DbgSName(SrcFilesEdit.FilesOwner)]);
|
||||
{$ENDIF}
|
||||
exit;
|
||||
end;
|
||||
TargetPackage:=nil;
|
||||
if TargetFilesEdit.FilesOwner is TLazPackage then
|
||||
TargetPackage:=TLazPackage(TargetFilesEdit.FilesOwner)
|
||||
else begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles invalid src=',DbgSName(TargetFilesEdit.FilesOwner)]);
|
||||
{$ENDIF}
|
||||
exit;
|
||||
end;
|
||||
|
||||
// check TargetDirectory
|
||||
if CheckDirectoryIsWritable(TargetDirectory)<>mrOk then begin
|
||||
@ -2434,6 +2468,8 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
SrcIsTarget:=SrcFilesEdit.FilesOwner=TargetFilesEdit.FilesOwner;
|
||||
|
||||
IDEMessagesWindow.Clear;
|
||||
|
||||
NewFileToOldPkgFile:=TFilenameToPointerTree.Create(false);
|
||||
@ -2459,7 +2495,7 @@ begin
|
||||
exit;
|
||||
end;
|
||||
|
||||
if (MoveFileCount=0) and (TargetPkgEdit.LazPackage=SrcPackage) then begin
|
||||
if (MoveFileCount=0) and (SrcIsTarget) then begin
|
||||
// no move, only change order in package
|
||||
// ToDo: check this case in ItemsTreeViewDragDrop
|
||||
ShowMessage('Changing order via drag and drop is not implemented.');
|
||||
@ -2470,8 +2506,7 @@ begin
|
||||
if PkgFiles.Count=MoveFileCount then begin
|
||||
MsgResult:=IDEQuestionDialog(lisMoveOrCopyFiles,
|
||||
Format(lisMoveOrCopyFileSFromPackageToTheDirectoryOfPackage, [IntToStr(
|
||||
MoveFileCount), SrcPackage.Name, #13, TargetDirectory, #13, TargetPkgEdit.LazPackage
|
||||
.Name]),
|
||||
MoveFileCount), SrcFilesEdit.FilesOwnerName, #13, TargetDirectory, #13, TargetFilesEdit.FilesOwnerName]),
|
||||
mtConfirmation, [100, lisMove, 101, lisCopy, mrCancel]);
|
||||
case MsgResult of
|
||||
100: DeleteOld:=true;
|
||||
@ -2481,8 +2516,7 @@ begin
|
||||
end else begin
|
||||
if IDEMessageDialog(lisMoveFiles2,
|
||||
Format(lisMoveFileSFromPackageToTheDirectoryOfPackage, [IntToStr(
|
||||
MoveFileCount), SrcPackage.Name, #13, TargetDirectory, #13, TargetPkgEdit.LazPackage
|
||||
.Name]),
|
||||
MoveFileCount), SrcFilesEdit.FilesOwnerName, #13, TargetDirectory, #13, TargetFilesEdit.FilesOwnerName]),
|
||||
mtConfirmation,[mbOk,mbCancel])<>mrOK
|
||||
then exit;
|
||||
DeleteOld:=true;
|
||||
@ -2509,15 +2543,19 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
if (SrcPackage<>TargetPkgEdit.LazPackage) then begin
|
||||
// files will be moved to another directory
|
||||
// => clear output directory of SrcPackage
|
||||
if PackageGraph.PreparePackageOutputDirectory(SrcPackage,true)<>mrOk then
|
||||
begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles PreparePackageOutputDirectory failed']);
|
||||
{$ENDIF}
|
||||
exit;
|
||||
if (not SrcIsTarget) then begin
|
||||
// files will be moved to another package/project
|
||||
// => clear output directory of Src
|
||||
if SrcPackage<>nil then begin
|
||||
if PackageGraph.PreparePackageOutputDirectory(SrcPackage,true)<>mrOk then
|
||||
begin
|
||||
{$IFDEF VerbosePkgEditDrag}
|
||||
debugln(['TPackageEditorForm.MoveFiles PreparePackageOutputDirectory failed']);
|
||||
{$ENDIF}
|
||||
exit;
|
||||
end;
|
||||
end else begin
|
||||
raise Exception.Create('implement me');
|
||||
end;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user