mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-06 17:27:23 +02:00
IDE: Move BeginCodeTool to MainBase.
git-svn-id: trunk@38768 -
This commit is contained in:
parent
08589a996b
commit
fdb25262a7
116
ide/main.pp
116
ide/main.pp
@ -593,7 +593,6 @@ type
|
|||||||
procedure OnAfterCodeToolBossApplyChanges(Manager: TCodeToolManager);
|
procedure OnAfterCodeToolBossApplyChanges(Manager: TCodeToolManager);
|
||||||
function OnCodeToolBossSearchUsedUnit(const SrcFilename: string;
|
function OnCodeToolBossSearchUsedUnit(const SrcFilename: string;
|
||||||
const TheUnitName, TheUnitInFilename: string): TCodeBuffer;
|
const TheUnitName, TheUnitInFilename: string): TCodeBuffer;
|
||||||
function OnCodeToolBossCheckAbort: boolean;
|
|
||||||
procedure CodeToolBossGetVirtualDirectoryAlias(Sender: TObject;
|
procedure CodeToolBossGetVirtualDirectoryAlias(Sender: TObject;
|
||||||
var RealDir: string);
|
var RealDir: string);
|
||||||
procedure CodeToolBossGetVirtualDirectoryDefines(DefTree: TDefineTree;
|
procedure CodeToolBossGetVirtualDirectoryDefines(DefTree: TDefineTree;
|
||||||
@ -903,10 +902,6 @@ type
|
|||||||
procedure AbortBuild; override;
|
procedure AbortBuild; override;
|
||||||
|
|
||||||
// useful frontend methods
|
// useful frontend methods
|
||||||
procedure DoSwitchToFormSrc(var ActiveSourceEditor:TSourceEditor;
|
|
||||||
var ActiveUnitInfo:TUnitInfo);
|
|
||||||
procedure DoSwitchToFormSrc(ADesigner: TDesigner;
|
|
||||||
var ActiveSourceEditor:TSourceEditor; var ActiveUnitInfo:TUnitInfo);
|
|
||||||
procedure UpdateCaption; override;
|
procedure UpdateCaption; override;
|
||||||
procedure HideIDE; override;
|
procedure HideIDE; override;
|
||||||
procedure HideUnmodifiedDesigners;
|
procedure HideUnmodifiedDesigners;
|
||||||
@ -914,15 +909,7 @@ type
|
|||||||
|
|
||||||
// methods for codetools
|
// methods for codetools
|
||||||
function InitCodeToolBoss: boolean;
|
function InitCodeToolBoss: boolean;
|
||||||
procedure ActivateCodeToolAbortableMode;
|
|
||||||
function BeginCodeTools: boolean; override;
|
function BeginCodeTools: boolean; override;
|
||||||
function BeginCodeTool(var ActiveSrcEdit: TSourceEditor;
|
|
||||||
out ActiveUnitInfo: TUnitInfo;
|
|
||||||
Flags: TCodeToolsFlags): boolean;
|
|
||||||
function BeginCodeTool(ADesigner: TDesigner;
|
|
||||||
var ActiveSrcEdit: TSourceEditor;
|
|
||||||
out ActiveUnitInfo: TUnitInfo;
|
|
||||||
Flags: TCodeToolsFlags): boolean;
|
|
||||||
function DoJumpToSourcePosition(const Filename: string;
|
function DoJumpToSourcePosition(const Filename: string;
|
||||||
NewX, NewY, NewTopLine: integer;
|
NewX, NewY, NewTopLine: integer;
|
||||||
Flags: TJumpToCodePosFlags = [jfFocusEditor]): TModalResult; override;
|
Flags: TJumpToCodePosFlags = [jfFocusEditor]): TModalResult; override;
|
||||||
@ -10364,15 +10351,6 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainIDE.ActivateCodeToolAbortableMode;
|
|
||||||
begin
|
|
||||||
if ToolStatus=itNone then
|
|
||||||
RaiseException('TMainIDE.ActivateCodeToolAbortableMode Error 1');
|
|
||||||
ToolStatus:=itCodeTools;
|
|
||||||
CodeToolBoss.OnCheckAbort:=@OnCodeToolBossCheckAbort;
|
|
||||||
CodeToolBoss.Abortable:=true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.BeginCodeTools: boolean;
|
function TMainIDE.BeginCodeTools: boolean;
|
||||||
var
|
var
|
||||||
ActiveSrcEdit: TSourceEditor;
|
ActiveSrcEdit: TSourceEditor;
|
||||||
@ -10464,14 +10442,6 @@ begin
|
|||||||
Result:=AnUnitInfo.Source;
|
Result:=AnUnitInfo.Source;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMainIDE.OnCodeToolBossCheckAbort: boolean;
|
|
||||||
begin
|
|
||||||
Result:=true;
|
|
||||||
if ToolStatus<>itCodeTools then exit;
|
|
||||||
Application.ProcessMessages;
|
|
||||||
Result:=ToolStatus<>itCodeTools;
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TMainIDE.CodeToolBossGetVirtualDirectoryAlias(Sender: TObject;
|
procedure TMainIDE.CodeToolBossGetVirtualDirectoryAlias(Sender: TObject;
|
||||||
var RealDir: string);
|
var RealDir: string);
|
||||||
begin
|
begin
|
||||||
@ -10699,67 +10669,6 @@ begin
|
|||||||
Result:=SourceFileMgr.SaveSourceEditorChangesToCodeCache(AEditor);
|
Result:=SourceFileMgr.SaveSourceEditorChangesToCodeCache(AEditor);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMainIDE.BeginCodeTool(var ActiveSrcEdit: TSourceEditor;
|
|
||||||
out ActiveUnitInfo: TUnitInfo; Flags: TCodeToolsFlags): boolean;
|
|
||||||
begin
|
|
||||||
Result:=BeginCodeTool(nil,ActiveSrcEdit,ActiveUnitInfo,Flags);
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.BeginCodeTool(ADesigner: TDesigner;
|
|
||||||
var ActiveSrcEdit: TSourceEditor; out ActiveUnitInfo: TUnitInfo;
|
|
||||||
Flags: TCodeToolsFlags): boolean;
|
|
||||||
begin
|
|
||||||
Result:=false;
|
|
||||||
if (ctfUseGivenSourceEditor in Flags) and (Project1<>nil) then begin
|
|
||||||
ActiveUnitInfo := Project1.EditorInfoWithEditorComponent(ActiveSrcEdit).UnitInfo;
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
ActiveSrcEdit:=nil;
|
|
||||||
ActiveUnitInfo:=nil;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// check global stati
|
|
||||||
if (ToolStatus in [itCodeTools,itCodeToolAborting]) then begin
|
|
||||||
debugln('TMainIDE.BeginCodeTool impossible ',dbgs(ord(ToolStatus)));
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
if (not (ctfSourceEditorNotNeeded in Flags)) and (SourceEditorManager.SourceEditorCount=0)
|
|
||||||
then begin
|
|
||||||
DebugLn('TMainIDE.BeginCodeTool no source editor');
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
// check source editor
|
|
||||||
if not (ctfUseGivenSourceEditor in Flags) then begin
|
|
||||||
if ctfSwitchToFormSource in Flags then
|
|
||||||
DoSwitchToFormSrc(ADesigner,ActiveSrcEdit,ActiveUnitInfo)
|
|
||||||
else if ADesigner<>nil then
|
|
||||||
GetDesignerUnit(ADesigner,ActiveSrcEdit,ActiveUnitInfo)
|
|
||||||
else
|
|
||||||
GetCurrentUnit(ActiveSrcEdit,ActiveUnitInfo);
|
|
||||||
end;
|
|
||||||
if (not (ctfSourceEditorNotNeeded in Flags)) and
|
|
||||||
((ActiveSrcEdit=nil) or (ActiveUnitInfo=nil))
|
|
||||||
then exit;
|
|
||||||
|
|
||||||
// init codetools
|
|
||||||
SaveSourceEditorChangesToCodeCache(nil);
|
|
||||||
if ActiveSrcEdit<>nil then begin
|
|
||||||
CodeToolBoss.VisibleEditorLines:=ActiveSrcEdit.EditorComponent.LinesInWindow;
|
|
||||||
CodeToolBoss.TabWidth:=ActiveSrcEdit.EditorComponent.TabWidth;
|
|
||||||
CodeToolBoss.IndentSize:=ActiveSrcEdit.EditorComponent.BlockIndent;
|
|
||||||
end else begin
|
|
||||||
CodeToolBoss.VisibleEditorLines:=25;
|
|
||||||
CodeToolBoss.TabWidth:=EditorOpts.TabWidth;
|
|
||||||
CodeToolBoss.IndentSize:=EditorOpts.BlockIndent;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if ctfActivateAbortMode in Flags then
|
|
||||||
ActivateCodeToolAbortableMode;
|
|
||||||
|
|
||||||
Result:=true;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.DoJumpToSourcePosition(const Filename: string; NewX, NewY,
|
function TMainIDE.DoJumpToSourcePosition(const Filename: string; NewX, NewY,
|
||||||
NewTopLine: integer; Flags: TJumpToCodePosFlags = [jfFocusEditor]): TModalResult;
|
NewTopLine: integer; Flags: TJumpToCodePosFlags = [jfFocusEditor]): TModalResult;
|
||||||
var
|
var
|
||||||
@ -13434,31 +13343,6 @@ begin
|
|||||||
Result := FOIHelpProvider;
|
Result := FOIHelpProvider;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TMainIDE.DoSwitchToFormSrc(var ActiveSourceEditor: TSourceEditor;
|
|
||||||
var ActiveUnitInfo: TUnitInfo);
|
|
||||||
begin
|
|
||||||
DoSwitchToFormSrc(nil,ActiveSourceEditor,ActiveUnitInfo);
|
|
||||||
end;
|
|
||||||
|
|
||||||
procedure TMainIDE.DoSwitchToFormSrc(ADesigner: TDesigner;
|
|
||||||
var ActiveSourceEditor: TSourceEditor; var ActiveUnitInfo: TUnitInfo);
|
|
||||||
begin
|
|
||||||
ActiveSourceEditor:=nil;
|
|
||||||
ActiveUnitInfo:=nil;
|
|
||||||
if (ADesigner<>nil) then
|
|
||||||
ActiveUnitInfo:=Project1.UnitWithComponent(ADesigner.LookupRoot)
|
|
||||||
else if (GlobalDesignHook.LookupRoot<>nil)
|
|
||||||
and (GlobalDesignHook.LookupRoot is TComponent) then
|
|
||||||
ActiveUnitInfo:=Project1.UnitWithComponent(TComponent(GlobalDesignHook.LookupRoot))
|
|
||||||
else
|
|
||||||
ActiveUnitInfo:=nil;
|
|
||||||
if (ActiveUnitInfo<>nil) and (ActiveUnitInfo.OpenEditorInfoCount > 0) then begin
|
|
||||||
ActiveSourceEditor := TSourceEditor(ActiveUnitInfo.OpenEditorInfo[0].EditorComponent);
|
|
||||||
SourceEditorManagerIntf.ActiveEditor := ActiveSourceEditor;
|
|
||||||
exit;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function TMainIDE.GetDesignerFormOfSource(AnUnitInfo: TUnitInfo; LoadForm: boolean
|
function TMainIDE.GetDesignerFormOfSource(AnUnitInfo: TUnitInfo; LoadForm: boolean
|
||||||
): TCustomForm;
|
): TCustomForm;
|
||||||
begin
|
begin
|
||||||
|
118
ide/mainbase.pas
118
ide/mainbase.pas
@ -142,11 +142,24 @@ type
|
|||||||
function GetMainBar: TComponent; override;
|
function GetMainBar: TComponent; override;
|
||||||
procedure SetRecentProjectFilesMenu;
|
procedure SetRecentProjectFilesMenu;
|
||||||
procedure SetRecentFilesMenu;
|
procedure SetRecentFilesMenu;
|
||||||
|
function BeginCodeTool(var ActiveSrcEdit: TSourceEditor;
|
||||||
|
out ActiveUnitInfo: TUnitInfo;
|
||||||
|
Flags: TCodeToolsFlags): boolean;
|
||||||
|
function BeginCodeTool(ADesigner: TDesigner;
|
||||||
|
var ActiveSrcEdit: TSourceEditor;
|
||||||
|
out ActiveUnitInfo: TUnitInfo;
|
||||||
|
Flags: TCodeToolsFlags): boolean;
|
||||||
|
procedure ActivateCodeToolAbortableMode;
|
||||||
|
function OnCodeToolBossCheckAbort: boolean;
|
||||||
|
|
||||||
|
procedure DoSwitchToFormSrc(var ActiveSourceEditor:TSourceEditor;
|
||||||
|
var ActiveUnitInfo:TUnitInfo);
|
||||||
|
procedure DoSwitchToFormSrc(ADesigner: TDesigner;
|
||||||
|
var ActiveSourceEditor:TSourceEditor; var ActiveUnitInfo:TUnitInfo);
|
||||||
|
|
||||||
procedure GetUnitInfoForDesigner(ADesigner: TIDesigner;
|
procedure GetUnitInfoForDesigner(ADesigner: TIDesigner;
|
||||||
out ActiveSourceEditor: TSourceEditorInterface;
|
out ActiveSourceEditor: TSourceEditorInterface;
|
||||||
out ActiveUnitInfo: TUnitInfo); override;
|
out ActiveUnitInfo: TUnitInfo); override;
|
||||||
|
|
||||||
procedure GetCurrentUnitInfo(out ActiveSourceEditor: TSourceEditorInterface;
|
procedure GetCurrentUnitInfo(out ActiveSourceEditor: TSourceEditorInterface;
|
||||||
out ActiveUnitInfo: TUnitInfo); override;
|
out ActiveUnitInfo: TUnitInfo); override;
|
||||||
procedure GetCurrentUnit(out ActiveSourceEditor: TSourceEditor;
|
procedure GetCurrentUnit(out ActiveSourceEditor: TSourceEditor;
|
||||||
@ -304,6 +317,109 @@ begin
|
|||||||
@mnuOpenRecentClicked);
|
@mnuOpenRecentClicked);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TMainIDEBase.BeginCodeTool(var ActiveSrcEdit: TSourceEditor;
|
||||||
|
out ActiveUnitInfo: TUnitInfo; Flags: TCodeToolsFlags): boolean;
|
||||||
|
begin
|
||||||
|
Result:=BeginCodeTool(nil,ActiveSrcEdit,ActiveUnitInfo,Flags);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TMainIDEBase.BeginCodeTool(ADesigner: TDesigner;
|
||||||
|
var ActiveSrcEdit: TSourceEditor; out ActiveUnitInfo: TUnitInfo;
|
||||||
|
Flags: TCodeToolsFlags): boolean;
|
||||||
|
begin
|
||||||
|
Result:=false;
|
||||||
|
if (ctfUseGivenSourceEditor in Flags) and (Project1<>nil) then begin
|
||||||
|
ActiveUnitInfo := Project1.EditorInfoWithEditorComponent(ActiveSrcEdit).UnitInfo;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
ActiveSrcEdit:=nil;
|
||||||
|
ActiveUnitInfo:=nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// check global stati
|
||||||
|
if (ToolStatus in [itCodeTools,itCodeToolAborting]) then begin
|
||||||
|
debugln('TMainIDE.BeginCodeTool impossible ',dbgs(ord(ToolStatus)));
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
if (not (ctfSourceEditorNotNeeded in Flags)) and (SourceEditorManager.SourceEditorCount=0)
|
||||||
|
then begin
|
||||||
|
DebugLn('TMainIDE.BeginCodeTool no source editor');
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// check source editor
|
||||||
|
if not (ctfUseGivenSourceEditor in Flags) then begin
|
||||||
|
if ctfSwitchToFormSource in Flags then
|
||||||
|
DoSwitchToFormSrc(ADesigner,ActiveSrcEdit,ActiveUnitInfo)
|
||||||
|
else if ADesigner<>nil then
|
||||||
|
GetDesignerUnit(ADesigner,ActiveSrcEdit,ActiveUnitInfo)
|
||||||
|
else
|
||||||
|
GetCurrentUnit(ActiveSrcEdit,ActiveUnitInfo);
|
||||||
|
end;
|
||||||
|
if (not (ctfSourceEditorNotNeeded in Flags)) and
|
||||||
|
((ActiveSrcEdit=nil) or (ActiveUnitInfo=nil))
|
||||||
|
then exit;
|
||||||
|
|
||||||
|
// init codetools
|
||||||
|
SaveSourceEditorChangesToCodeCache(nil);
|
||||||
|
if ActiveSrcEdit<>nil then begin
|
||||||
|
CodeToolBoss.VisibleEditorLines:=ActiveSrcEdit.EditorComponent.LinesInWindow;
|
||||||
|
CodeToolBoss.TabWidth:=ActiveSrcEdit.EditorComponent.TabWidth;
|
||||||
|
CodeToolBoss.IndentSize:=ActiveSrcEdit.EditorComponent.BlockIndent;
|
||||||
|
end else begin
|
||||||
|
CodeToolBoss.VisibleEditorLines:=25;
|
||||||
|
CodeToolBoss.TabWidth:=EditorOpts.TabWidth;
|
||||||
|
CodeToolBoss.IndentSize:=EditorOpts.BlockIndent;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if ctfActivateAbortMode in Flags then
|
||||||
|
ActivateCodeToolAbortableMode;
|
||||||
|
|
||||||
|
Result:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainIDEBase.ActivateCodeToolAbortableMode;
|
||||||
|
begin
|
||||||
|
if ToolStatus=itNone then
|
||||||
|
RaiseException('TMainIDEBase.ActivateCodeToolAbortableMode Error 1');
|
||||||
|
ToolStatus:=itCodeTools;
|
||||||
|
CodeToolBoss.OnCheckAbort:=@OnCodeToolBossCheckAbort;
|
||||||
|
CodeToolBoss.Abortable:=true;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TMainIDEBase.OnCodeToolBossCheckAbort: boolean;
|
||||||
|
begin
|
||||||
|
Result:=true;
|
||||||
|
if ToolStatus<>itCodeTools then exit;
|
||||||
|
Application.ProcessMessages;
|
||||||
|
Result:=ToolStatus<>itCodeTools;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainIDEBase.DoSwitchToFormSrc(var ActiveSourceEditor: TSourceEditor;
|
||||||
|
var ActiveUnitInfo: TUnitInfo);
|
||||||
|
begin
|
||||||
|
DoSwitchToFormSrc(nil,ActiveSourceEditor,ActiveUnitInfo);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TMainIDEBase.DoSwitchToFormSrc(ADesigner: TDesigner;
|
||||||
|
var ActiveSourceEditor: TSourceEditor; var ActiveUnitInfo: TUnitInfo);
|
||||||
|
begin
|
||||||
|
ActiveSourceEditor:=nil;
|
||||||
|
ActiveUnitInfo:=nil;
|
||||||
|
if (ADesigner<>nil) then
|
||||||
|
ActiveUnitInfo:=Project1.UnitWithComponent(ADesigner.LookupRoot)
|
||||||
|
else if (GlobalDesignHook.LookupRoot<>nil)
|
||||||
|
and (GlobalDesignHook.LookupRoot is TComponent) then
|
||||||
|
ActiveUnitInfo:=Project1.UnitWithComponent(TComponent(GlobalDesignHook.LookupRoot))
|
||||||
|
else
|
||||||
|
ActiveUnitInfo:=nil;
|
||||||
|
if (ActiveUnitInfo<>nil) and (ActiveUnitInfo.OpenEditorInfoCount > 0) then begin
|
||||||
|
ActiveSourceEditor := TSourceEditor(ActiveUnitInfo.OpenEditorInfo[0].EditorComponent);
|
||||||
|
SourceEditorManagerIntf.ActiveEditor := ActiveSourceEditor;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TMainIDEBase.DoMnuWindowClicked(Sender: TObject);
|
procedure TMainIDEBase.DoMnuWindowClicked(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
UpdateWindowMenu(True);
|
UpdateWindowMenu(True);
|
||||||
|
@ -1903,7 +1903,8 @@ begin
|
|||||||
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.CloseProject B');{$ENDIF}
|
{$IFDEF IDE_MEM_CHECK}CheckHeapWrtMemCnt('TLazSourceFileManager.CloseProject B');{$ENDIF}
|
||||||
IncreaseCompilerParseStamp;
|
IncreaseCompilerParseStamp;
|
||||||
// close Project
|
// close Project
|
||||||
if ProjInspector<>nil then ProjInspector.LazProject:=nil;
|
if ProjInspector<>nil then
|
||||||
|
ProjInspector.LazProject:=nil;
|
||||||
FreeThenNil(Project1);
|
FreeThenNil(Project1);
|
||||||
if IDEMessagesWindow<>nil then IDEMessagesWindow.Clear;
|
if IDEMessagesWindow<>nil then IDEMessagesWindow.Clear;
|
||||||
|
|
||||||
@ -2857,7 +2858,7 @@ var
|
|||||||
begin
|
begin
|
||||||
Result:=mrOk;
|
Result:=mrOk;
|
||||||
if (AnUnitInfo.Component=nil) then exit;
|
if (AnUnitInfo.Component=nil) then exit;
|
||||||
if not TMainIDE(MainIDE).BeginCodeTool(ActiveSrcEdit,ActiveUnitInfo,[]) then exit;
|
if not MainIDE.BeginCodeTool(ActiveSrcEdit,ActiveUnitInfo,[]) then exit;
|
||||||
// unselect methods in ObjectInspector1
|
// unselect methods in ObjectInspector1
|
||||||
if (ObjectInspector1<>nil)
|
if (ObjectInspector1<>nil)
|
||||||
and (ObjectInspector1.PropertyEditorHook.LookupRoot=AnUnitInfo.Component) then
|
and (ObjectInspector1.PropertyEditorHook.LookupRoot=AnUnitInfo.Component) then
|
||||||
@ -4962,7 +4963,7 @@ begin
|
|||||||
// set new project filename
|
// set new project filename
|
||||||
Project1.ProjectInfoFile:=NewLPIFilename;
|
Project1.ProjectInfoFile:=NewLPIFilename;
|
||||||
EnvironmentOptions.AddToRecentProjectFiles(NewLPIFilename);
|
EnvironmentOptions.AddToRecentProjectFiles(NewLPIFilename);
|
||||||
TMainIDE(MainIDE).SetRecentProjectFilesMenu;
|
MainIDE.SetRecentProjectFilesMenu;
|
||||||
|
|
||||||
// change main source
|
// change main source
|
||||||
if (Project1.MainUnitID >= 0) then
|
if (Project1.MainUnitID >= 0) then
|
||||||
|
Loading…
Reference in New Issue
Block a user