forked from qt-creator/qt-creator
Merge branch 'master' of git@scm.dev.nokia.troll.no:creator/mainline
This commit is contained in:
@@ -35,6 +35,9 @@
|
|||||||
#include "projectexplorerconstants.h"
|
#include "projectexplorerconstants.h"
|
||||||
#include "runconfiguration.h"
|
#include "runconfiguration.h"
|
||||||
|
|
||||||
|
#include <coreplugin/actionmanager/actionmanagerinterface.h>
|
||||||
|
#include <coreplugin/coreconstants.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
#include <find/basetextfind.h>
|
#include <find/basetextfind.h>
|
||||||
#include <aggregation/aggregate.h>
|
#include <aggregation/aggregate.h>
|
||||||
|
|
||||||
@@ -52,69 +55,7 @@
|
|||||||
using namespace ProjectExplorer::Internal;
|
using namespace ProjectExplorer::Internal;
|
||||||
using namespace ProjectExplorer;
|
using namespace ProjectExplorer;
|
||||||
|
|
||||||
bool OutputPane::hasFocus()
|
OutputPane::OutputPane(Core::ICore *core)
|
||||||
{
|
|
||||||
return m_tabWidget->currentWidget() && m_tabWidget->currentWidget()->hasFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OutputPane::canFocus()
|
|
||||||
{
|
|
||||||
return m_tabWidget->currentWidget();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::setFocus()
|
|
||||||
{
|
|
||||||
if (m_tabWidget->currentWidget())
|
|
||||||
m_tabWidget->currentWidget()->setFocus();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::appendOutput(const QString &/*out*/)
|
|
||||||
{
|
|
||||||
// This function is in the interface, since we can't do anything sensible here, we don't do anything here.
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::appendOutput(RunControl *rc, const QString &out)
|
|
||||||
{
|
|
||||||
OutputWindow *ow = m_outputWindows.value(rc);
|
|
||||||
ow->appendOutput(out);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::showTabFor(RunControl *rc)
|
|
||||||
{
|
|
||||||
OutputWindow *ow = m_outputWindows.value(rc);
|
|
||||||
m_tabWidget->setCurrentWidget(ow);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::stopRunControl()
|
|
||||||
{
|
|
||||||
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
|
||||||
rc->stop();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::reRunRunControl()
|
|
||||||
{
|
|
||||||
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
|
||||||
if (rc->runConfiguration()->project() != 0)
|
|
||||||
rc->start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::closeTab(int index)
|
|
||||||
{
|
|
||||||
OutputWindow *ow = static_cast<OutputWindow *>(m_tabWidget->widget(index));
|
|
||||||
RunControl *rc = m_outputWindows.key(ow);
|
|
||||||
|
|
||||||
if (rc->isRunning()) {
|
|
||||||
QString msg = tr("The application is still running. Close it first.");
|
|
||||||
QMessageBox::critical(0, tr("Unable to close"), msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_tabWidget->removeTab(index);
|
|
||||||
delete ow;
|
|
||||||
delete rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
OutputPane::OutputPane()
|
|
||||||
: m_mainWidget(new QWidget)
|
: m_mainWidget(new QWidget)
|
||||||
{
|
{
|
||||||
// m_insertLineButton = new QToolButton;
|
// m_insertLineButton = new QToolButton;
|
||||||
@@ -127,7 +68,7 @@ OutputPane::OutputPane()
|
|||||||
QIcon runIcon(Constants::ICON_RUN);
|
QIcon runIcon(Constants::ICON_RUN);
|
||||||
runIcon.addFile(Constants::ICON_RUN_SMALL);
|
runIcon.addFile(Constants::ICON_RUN_SMALL);
|
||||||
|
|
||||||
//Rerun
|
// Rerun
|
||||||
m_reRunButton = new QToolButton;
|
m_reRunButton = new QToolButton;
|
||||||
m_reRunButton->setIcon(runIcon);
|
m_reRunButton->setIcon(runIcon);
|
||||||
m_reRunButton->setToolTip(tr("Rerun this runconfiguration"));
|
m_reRunButton->setToolTip(tr("Rerun this runconfiguration"));
|
||||||
@@ -136,13 +77,23 @@ OutputPane::OutputPane()
|
|||||||
connect(m_reRunButton, SIGNAL(clicked()),
|
connect(m_reRunButton, SIGNAL(clicked()),
|
||||||
this, SLOT(reRunRunControl()));
|
this, SLOT(reRunRunControl()));
|
||||||
|
|
||||||
//Stop
|
// Stop
|
||||||
|
Core::ActionManagerInterface *am = core->actionManager();
|
||||||
|
QList<int> globalcontext;
|
||||||
|
globalcontext.append(Core::Constants::C_GLOBAL_ID);
|
||||||
|
|
||||||
|
m_stopAction = new QAction(QIcon(Constants::ICON_STOP), tr("Stop"), this);
|
||||||
|
m_stopAction->setToolTip(tr("Stop"));
|
||||||
|
m_stopAction->setEnabled(false);
|
||||||
|
|
||||||
|
Core::ICommand *cmd = am->registerAction(m_stopAction, Constants::STOP, globalcontext);
|
||||||
|
cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+R")));
|
||||||
|
|
||||||
m_stopButton = new QToolButton;
|
m_stopButton = new QToolButton;
|
||||||
m_stopButton->setIcon(QIcon(Constants::ICON_STOP));
|
m_stopButton->setDefaultAction(cmd->action());
|
||||||
m_stopButton->setToolTip(tr("Stop"));
|
|
||||||
m_stopButton->setAutoRaise(true);
|
m_stopButton->setAutoRaise(true);
|
||||||
m_stopButton->setEnabled(false);
|
|
||||||
connect(m_stopButton, SIGNAL(clicked()),
|
connect(m_stopAction, SIGNAL(triggered()),
|
||||||
this, SLOT(stopRunControl()));
|
this, SLOT(stopRunControl()));
|
||||||
|
|
||||||
// Spacer (?)
|
// Spacer (?)
|
||||||
@@ -173,21 +124,57 @@ OutputPane::~OutputPane()
|
|||||||
delete m_mainWidget;
|
delete m_mainWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::projectRemoved()
|
QWidget *OutputPane::outputWidget(QWidget *)
|
||||||
{
|
{
|
||||||
tabChanged(m_tabWidget->currentIndex());
|
return m_mainWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::tabChanged(int i)
|
QList<QWidget*> OutputPane::toolBarWidgets(void) const
|
||||||
{
|
{
|
||||||
if (i == -1) {
|
return QList<QWidget*>() << m_reRunButton << m_stopButton
|
||||||
m_stopButton->setEnabled(false);
|
; // << m_insertLineButton;
|
||||||
m_reRunButton->setEnabled(false);
|
}
|
||||||
} else {
|
|
||||||
RunControl *rc = runControlForTab(i);
|
QString OutputPane::name() const
|
||||||
m_stopButton->setEnabled(rc->isRunning());
|
{
|
||||||
m_reRunButton->setEnabled(!rc->isRunning() && rc->runConfiguration()->project());
|
return tr("Application Output");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int OutputPane::priorityInStatusBar() const
|
||||||
|
{
|
||||||
|
return 60;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::clearContents()
|
||||||
|
{
|
||||||
|
OutputWindow *currentWindow = qobject_cast<OutputWindow *>(m_tabWidget->currentWidget());
|
||||||
|
if (currentWindow)
|
||||||
|
currentWindow->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::visibilityChanged(bool /* b */)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutputPane::hasFocus()
|
||||||
|
{
|
||||||
|
return m_tabWidget->currentWidget() && m_tabWidget->currentWidget()->hasFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OutputPane::canFocus()
|
||||||
|
{
|
||||||
|
return m_tabWidget->currentWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::setFocus()
|
||||||
|
{
|
||||||
|
if (m_tabWidget->currentWidget())
|
||||||
|
m_tabWidget->currentWidget()->setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::appendOutput(const QString &/*out*/)
|
||||||
|
{
|
||||||
|
// This function is in the interface, since we can't do anything sensible here, we don't do anything here.
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::createNewOutputWindow(RunControl *rc)
|
void OutputPane::createNewOutputWindow(RunControl *rc)
|
||||||
@@ -199,7 +186,7 @@ void OutputPane::createNewOutputWindow(RunControl *rc)
|
|||||||
|
|
||||||
// First look if we can reuse a tab
|
// First look if we can reuse a tab
|
||||||
bool found = false;
|
bool found = false;
|
||||||
for (int i=0; i<m_tabWidget->count(); ++i) {
|
for (int i = 0; i < m_tabWidget->count(); ++i) {
|
||||||
RunControl *old = runControlForTab(i);
|
RunControl *old = runControlForTab(i);
|
||||||
if (old->runConfiguration() == rc->runConfiguration() && !old->isRunning()) {
|
if (old->runConfiguration() == rc->runConfiguration() && !old->isRunning()) {
|
||||||
// Reuse this tab
|
// Reuse this tab
|
||||||
@@ -222,50 +209,16 @@ void OutputPane::createNewOutputWindow(RunControl *rc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::runControlStarted()
|
void OutputPane::appendOutput(RunControl *rc, const QString &out)
|
||||||
{
|
{
|
||||||
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
OutputWindow *ow = m_outputWindows.value(rc);
|
||||||
if (rc == qobject_cast<RunControl *>(sender())) {
|
ow->appendOutput(out);
|
||||||
m_reRunButton->setEnabled(false);
|
|
||||||
m_stopButton->setEnabled(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::runControlFinished()
|
void OutputPane::showTabFor(RunControl *rc)
|
||||||
{
|
{
|
||||||
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
OutputWindow *ow = m_outputWindows.value(rc);
|
||||||
if (rc == qobject_cast<RunControl *>(sender())) {
|
m_tabWidget->setCurrentWidget(ow);
|
||||||
m_reRunButton->setEnabled(rc->runConfiguration()->project());
|
|
||||||
m_stopButton->setEnabled(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget *OutputPane::outputWidget(QWidget *)
|
|
||||||
{
|
|
||||||
return m_mainWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
QList<QWidget*> OutputPane::toolBarWidgets(void) const
|
|
||||||
{
|
|
||||||
return QList<QWidget*>() << m_reRunButton << m_stopButton
|
|
||||||
; // << m_insertLineButton;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString OutputPane::name() const
|
|
||||||
{
|
|
||||||
return tr("Application Output");
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::clearContents()
|
|
||||||
{
|
|
||||||
OutputWindow *currentWindow = qobject_cast<OutputWindow *>(m_tabWidget->currentWidget());
|
|
||||||
if (currentWindow)
|
|
||||||
currentWindow->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OutputPane::visibilityChanged(bool /* b */)
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OutputPane::insertLine()
|
void OutputPane::insertLine()
|
||||||
@@ -275,16 +228,75 @@ void OutputPane::insertLine()
|
|||||||
currentWindow->clear();
|
currentWindow->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OutputPane::reRunRunControl()
|
||||||
|
{
|
||||||
|
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
||||||
|
if (rc->runConfiguration()->project() != 0)
|
||||||
|
rc->start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::stopRunControl()
|
||||||
|
{
|
||||||
|
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
||||||
|
rc->stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::closeTab(int index)
|
||||||
|
{
|
||||||
|
OutputWindow *ow = static_cast<OutputWindow *>(m_tabWidget->widget(index));
|
||||||
|
RunControl *rc = m_outputWindows.key(ow);
|
||||||
|
|
||||||
|
if (rc->isRunning()) {
|
||||||
|
QString msg = tr("The application is still running. Close it first.");
|
||||||
|
QMessageBox::critical(0, tr("Unable to close"), msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_tabWidget->removeTab(index);
|
||||||
|
delete ow;
|
||||||
|
delete rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::projectRemoved()
|
||||||
|
{
|
||||||
|
tabChanged(m_tabWidget->currentIndex());
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::tabChanged(int i)
|
||||||
|
{
|
||||||
|
if (i == -1) {
|
||||||
|
m_stopAction->setEnabled(false);
|
||||||
|
m_reRunButton->setEnabled(false);
|
||||||
|
} else {
|
||||||
|
RunControl *rc = runControlForTab(i);
|
||||||
|
m_stopAction->setEnabled(rc->isRunning());
|
||||||
|
m_reRunButton->setEnabled(!rc->isRunning() && rc->runConfiguration()->project());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::runControlStarted()
|
||||||
|
{
|
||||||
|
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
||||||
|
if (rc == qobject_cast<RunControl *>(sender())) {
|
||||||
|
m_reRunButton->setEnabled(false);
|
||||||
|
m_stopAction->setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void OutputPane::runControlFinished()
|
||||||
|
{
|
||||||
|
RunControl *rc = runControlForTab(m_tabWidget->currentIndex());
|
||||||
|
if (rc == qobject_cast<RunControl *>(sender())) {
|
||||||
|
m_reRunButton->setEnabled(rc->runConfiguration()->project());
|
||||||
|
m_stopAction->setEnabled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
RunControl* OutputPane::runControlForTab(int index) const
|
RunControl* OutputPane::runControlForTab(int index) const
|
||||||
{
|
{
|
||||||
return m_outputWindows.key(qobject_cast<OutputWindow *>(m_tabWidget->widget(index)));
|
return m_outputWindows.key(qobject_cast<OutputWindow *>(m_tabWidget->widget(index)));
|
||||||
}
|
}
|
||||||
|
|
||||||
int OutputPane::priorityInStatusBar() const
|
|
||||||
{
|
|
||||||
return 60;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*******************/
|
/*******************/
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,10 @@ QT_BEGIN_NAMESPACE
|
|||||||
class QTabWidget;
|
class QTabWidget;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class ICore;
|
||||||
|
}
|
||||||
|
|
||||||
namespace ProjectExplorer {
|
namespace ProjectExplorer {
|
||||||
|
|
||||||
class RunControl;
|
class RunControl;
|
||||||
@@ -61,7 +65,7 @@ class OutputPane : public Core::IOutputPane
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OutputPane();
|
OutputPane(Core::ICore *core);
|
||||||
~OutputPane();
|
~OutputPane();
|
||||||
|
|
||||||
QWidget *outputWidget(QWidget *);
|
QWidget *outputWidget(QWidget *);
|
||||||
@@ -77,9 +81,9 @@ public:
|
|||||||
void appendOutput(const QString &out);
|
void appendOutput(const QString &out);
|
||||||
|
|
||||||
// ApplicationOutputspecifics
|
// ApplicationOutputspecifics
|
||||||
void createNewOutputWindow(RunControl *);
|
void createNewOutputWindow(RunControl *rc);
|
||||||
void appendOutput(RunControl *, const QString &out);
|
void appendOutput(RunControl *rc, const QString &out);
|
||||||
void showTabFor(RunControl *);
|
void showTabFor(RunControl *rc);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void projectRemoved();
|
void projectRemoved();
|
||||||
@@ -99,16 +103,17 @@ private:
|
|||||||
QWidget *m_mainWidget;
|
QWidget *m_mainWidget;
|
||||||
QTabWidget *m_tabWidget;
|
QTabWidget *m_tabWidget;
|
||||||
QHash<RunControl *, OutputWindow *> m_outputWindows;
|
QHash<RunControl *, OutputWindow *> m_outputWindows;
|
||||||
|
QAction *m_stopAction;
|
||||||
// QToolButton *m_insertLineButton;
|
// QToolButton *m_insertLineButton;
|
||||||
QToolButton *m_reRunButton;
|
QToolButton *m_reRunButton;
|
||||||
QToolButton *m_stopButton;
|
QToolButton *m_stopButton;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class OutputWindow : public QPlainTextEdit
|
class OutputWindow : public QPlainTextEdit
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OutputWindow(QWidget *parent = 0);
|
OutputWindow(QWidget *parent = 0);
|
||||||
~OutputWindow();
|
~OutputWindow();
|
||||||
|
|||||||
@@ -200,7 +200,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList & /*arguments*/, QStrin
|
|||||||
|
|
||||||
addAutoReleasedObject(new CoreListenerCheckingForRunningBuild(m_buildManager));
|
addAutoReleasedObject(new CoreListenerCheckingForRunningBuild(m_buildManager));
|
||||||
|
|
||||||
m_outputPane = new OutputPane();
|
m_outputPane = new OutputPane(m_core);
|
||||||
addAutoReleasedObject(m_outputPane);
|
addAutoReleasedObject(m_outputPane);
|
||||||
connect(m_session, SIGNAL(projectRemoved(ProjectExplorer::Project *)),
|
connect(m_session, SIGNAL(projectRemoved(ProjectExplorer::Project *)),
|
||||||
m_outputPane, SLOT(projectRemoved()));
|
m_outputPane, SLOT(projectRemoved()));
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ const char * const CLEANSESSION = "ProjectExplorer.CleanSession";
|
|||||||
const char * const BUILDCONFIGURATIONMENU = "ProjectExplorer.BuildConfigurationMenu";
|
const char * const BUILDCONFIGURATIONMENU = "ProjectExplorer.BuildConfigurationMenu";
|
||||||
const char * const CANCELBUILD = "ProjectExplorer.CancelBuild";
|
const char * const CANCELBUILD = "ProjectExplorer.CancelBuild";
|
||||||
const char * const RUNCONFIGURATIONMENU = "ProjectExplorer.RunConfigurationMenu";
|
const char * const RUNCONFIGURATIONMENU = "ProjectExplorer.RunConfigurationMenu";
|
||||||
|
const char * const RUN = "ProjectExplorer.Run";
|
||||||
|
const char * const STOP = "ProjectExplorer.Stop";
|
||||||
const char * const DEBUG = "ProjectExplorer.Debug";
|
const char * const DEBUG = "ProjectExplorer.Debug";
|
||||||
const char * const DEPENDENCIES = "ProjectExplorer.Dependencies";
|
const char * const DEPENDENCIES = "ProjectExplorer.Dependencies";
|
||||||
const char * const FINDINALLPROJECTS = "ProjectExplorer.FindInAllProjects";
|
const char * const FINDINALLPROJECTS = "ProjectExplorer.FindInAllProjects";
|
||||||
@@ -67,7 +69,7 @@ const char * const OPENFILE = "ProjectExplorer.OpenFile";
|
|||||||
const char * const REMOVEFILE = "ProjectExplorer.RemoveFile";
|
const char * const REMOVEFILE = "ProjectExplorer.RemoveFile";
|
||||||
const char * const RENAMEFILE = "ProjectExplorer.RenameFile";
|
const char * const RENAMEFILE = "ProjectExplorer.RenameFile";
|
||||||
|
|
||||||
//Run modes
|
// Run modes
|
||||||
const char * const RUNMODE = "ProjectExplorer.RunMode";
|
const char * const RUNMODE = "ProjectExplorer.RunMode";
|
||||||
const char * const DEBUGMODE = "ProjectExplorer.DebugMode";
|
const char * const DEBUGMODE = "ProjectExplorer.DebugMode";
|
||||||
|
|
||||||
@@ -76,8 +78,6 @@ const int P_ACTION_RUN = 100;
|
|||||||
const int P_ACTION_DEBUG = 90;
|
const int P_ACTION_DEBUG = 90;
|
||||||
const int P_ACTION_BUILDSESSION = 80;
|
const int P_ACTION_BUILDSESSION = 80;
|
||||||
|
|
||||||
const char * const RUN = "ProjectExplorer.Run";
|
|
||||||
|
|
||||||
// context
|
// context
|
||||||
const char * const C_PROJECTEXPLORER = "Project Explorer";
|
const char * const C_PROJECTEXPLORER = "Project Explorer";
|
||||||
|
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ QuickOpenToolWindow::QuickOpenToolWindow(QuickOpenPlugin *qop) :
|
|||||||
m_configureAction(new QAction(tr("Configure..."), this)),
|
m_configureAction(new QAction(tr("Configure..."), this)),
|
||||||
m_fileLineEdit(new Core::Utils::FancyLineEdit)
|
m_fileLineEdit(new Core::Utils::FancyLineEdit)
|
||||||
{
|
{
|
||||||
// Explcitly hide the completion list popup.
|
// Explicitly hide the completion list popup.
|
||||||
m_completionList->hide();
|
m_completionList->hide();
|
||||||
|
|
||||||
setWindowTitle("Locate...");
|
setWindowTitle("Locate...");
|
||||||
|
|||||||
Reference in New Issue
Block a user