forked from qt-creator/qt-creator
		
	Move code from Designer to QtSupport
* Move settings pages for Qt code generation from Designer to QtSupport plugin. * Make Designer plugin depend on QtSupport Change-Id: I222dac0a648c194ce46fd9f8bbb09c70db851bbd Reviewed-by: Daniel Teske <daniel.teske@digia.com>
This commit is contained in:
		@@ -3,14 +3,11 @@ DEFINES+=CPP_ENABLED
 | 
			
		||||
HEADERS+=$$PWD/formclasswizardpage.h \
 | 
			
		||||
    $$PWD/formclasswizarddialog.h \
 | 
			
		||||
    $$PWD/formclasswizard.h \
 | 
			
		||||
    $$PWD/formclasswizardparameters.h \
 | 
			
		||||
    $$PWD/cppsettingspage.h
 | 
			
		||||
    $$PWD/formclasswizardparameters.h
 | 
			
		||||
 | 
			
		||||
SOURCES+=$$PWD/formclasswizardpage.cpp \
 | 
			
		||||
    $$PWD/formclasswizarddialog.cpp  \
 | 
			
		||||
    $$PWD/formclasswizard.cpp \
 | 
			
		||||
    $$PWD/formclasswizardparameters.cpp \
 | 
			
		||||
    $$PWD/cppsettingspage.cpp
 | 
			
		||||
    $$PWD/formclasswizardparameters.cpp
 | 
			
		||||
 | 
			
		||||
FORMS+=$$PWD/formclasswizardpage.ui \
 | 
			
		||||
$$PWD/cppsettingspagewidget.ui
 | 
			
		||||
FORMS+=$$PWD/formclasswizardpage.ui
 | 
			
		||||
 
 | 
			
		||||
@@ -15,6 +15,7 @@ QtcPlugin {
 | 
			
		||||
    Depends { name: "ResourceEditor" }
 | 
			
		||||
    Depends { name: "TextEditor" }
 | 
			
		||||
    Depends { name: "ProjectExplorer" }
 | 
			
		||||
    Depends { name: "QtSupport" }
 | 
			
		||||
 | 
			
		||||
    cpp.defines: base.concat(["CPP_ENABLED"])
 | 
			
		||||
    cpp.includePaths: base.concat([
 | 
			
		||||
@@ -66,8 +67,6 @@ QtcPlugin {
 | 
			
		||||
        name: "cpp"
 | 
			
		||||
        prefix: "cpp/"
 | 
			
		||||
        files: [
 | 
			
		||||
            "cppsettingspage.cpp", "cppsettingspage.h",
 | 
			
		||||
            "cppsettingspagewidget.ui",
 | 
			
		||||
            "formclasswizard.cpp", "formclasswizard.h",
 | 
			
		||||
            "formclasswizarddialog.cpp", "formclasswizarddialog.h",
 | 
			
		||||
            "formclasswizardpage.cpp", "formclasswizardpage.h", "formclasswizardpage.ui",
 | 
			
		||||
 
 | 
			
		||||
@@ -7,5 +7,6 @@ QTC_PLUGIN_DEPENDS += \
 | 
			
		||||
    resourceeditor\
 | 
			
		||||
    cpptools \
 | 
			
		||||
    projectexplorer \
 | 
			
		||||
    qtsupport \
 | 
			
		||||
    texteditor \
 | 
			
		||||
    coreplugin
 | 
			
		||||
 
 | 
			
		||||
@@ -43,8 +43,6 @@ const char C_DESIGNER_XML_DISPLAY_NAME[]  = QT_TRANSLATE_NOOP("Designer", "Form
 | 
			
		||||
const char SETTINGS_CATEGORY[] = "P.Designer";
 | 
			
		||||
const char SETTINGS_CATEGORY_ICON[] = ":/core/images/category_design.png";
 | 
			
		||||
const char SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("Designer", "Designer");
 | 
			
		||||
const char SETTINGS_CPP_SETTINGS_ID[] = "Class Generation";
 | 
			
		||||
const char SETTINGS_CPP_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("Designer", "Class Generation");
 | 
			
		||||
 | 
			
		||||
// Context
 | 
			
		||||
const char C_FORMEDITOR[] = "FormEditor.FormEditor";
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@
 | 
			
		||||
 | 
			
		||||
#ifdef CPP_ENABLED
 | 
			
		||||
#  include "cpp/formclasswizard.h"
 | 
			
		||||
#  include "cpp/cppsettingspage.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "settingspage.h"
 | 
			
		||||
@@ -49,6 +48,7 @@
 | 
			
		||||
#include <coreplugin/designmode.h>
 | 
			
		||||
#include <cpptools/cpptoolsconstants.h>
 | 
			
		||||
 | 
			
		||||
#include <QApplication>
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QLibraryInfo>
 | 
			
		||||
#include <QTranslator>
 | 
			
		||||
@@ -146,8 +146,6 @@ void FormEditorPlugin::initializeTemplates()
 | 
			
		||||
    wizard->setDescription(tr("Creates a Qt Designer form along with a matching class (C++ header and source file) "
 | 
			
		||||
                                       "for implementation purposes. You can add the form and class to an existing Qt Widget Project."));
 | 
			
		||||
    addAutoReleasedObject(wizard);
 | 
			
		||||
 | 
			
		||||
    addAutoReleasedObject(new CppSettingsPage);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@
 | 
			
		||||
#include <utils/codegeneration.h>
 | 
			
		||||
#include <coreplugin/icore.h>
 | 
			
		||||
#include <cpptools/abstracteditorsupport.h>
 | 
			
		||||
#include <qtsupport/codegensettings.h>
 | 
			
		||||
 | 
			
		||||
#include <QTextStream>
 | 
			
		||||
#include <QSettings>
 | 
			
		||||
@@ -43,69 +44,22 @@
 | 
			
		||||
static const char uiMemberC[] = "ui";
 | 
			
		||||
static const char uiNamespaceC[] = "Ui";
 | 
			
		||||
 | 
			
		||||
static const char formClassWizardPageGroupC[] = "FormClassWizardPage";
 | 
			
		||||
static const char translationKeyC[] = "RetranslationSupport";
 | 
			
		||||
static const char embeddingModeKeyC[] = "Embedding";
 | 
			
		||||
 | 
			
		||||
// TODO: These 2 are general coding convention settings and
 | 
			
		||||
// should go to CppTools...
 | 
			
		||||
static const char includeQtModuleKeyC[] = "IncludeQtModule";
 | 
			
		||||
static const char addQtVersionCheckKeyC[] = "AddQtVersionCheck";
 | 
			
		||||
 | 
			
		||||
static const bool retranslationSupportDefault = false;
 | 
			
		||||
 | 
			
		||||
namespace Designer {
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
FormClassWizardGenerationParameters::FormClassWizardGenerationParameters() :
 | 
			
		||||
    embedding(PointerAggregatedUiClass),
 | 
			
		||||
    retranslationSupport(retranslationSupportDefault),
 | 
			
		||||
    includeQtModule(false),
 | 
			
		||||
    addQtVersionCheck(false)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FormClassWizardGenerationParameters::fromSettings(const QSettings *settings)
 | 
			
		||||
{
 | 
			
		||||
    QString group = QLatin1String(formClassWizardPageGroupC) + QLatin1Char('/');
 | 
			
		||||
 | 
			
		||||
    retranslationSupport = settings->value(group + QLatin1String(translationKeyC), retranslationSupportDefault).toBool();
 | 
			
		||||
    embedding =  static_cast<UiClassEmbedding>(settings->value(group + QLatin1String(embeddingModeKeyC), int(PointerAggregatedUiClass)).toInt());
 | 
			
		||||
    includeQtModule = settings->value(group + QLatin1String(includeQtModuleKeyC), false).toBool();
 | 
			
		||||
    addQtVersionCheck = settings->value(group + QLatin1String(addQtVersionCheckKeyC), false).toBool();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void FormClassWizardGenerationParameters::toSettings(QSettings *settings) const
 | 
			
		||||
{
 | 
			
		||||
    settings->beginGroup(QLatin1String(formClassWizardPageGroupC));
 | 
			
		||||
    settings->setValue(QLatin1String(translationKeyC), retranslationSupport);
 | 
			
		||||
    settings->setValue(QLatin1String(embeddingModeKeyC), embedding);
 | 
			
		||||
    settings->setValue(QLatin1String(includeQtModuleKeyC), includeQtModule);
 | 
			
		||||
    settings->setValue(QLatin1String(addQtVersionCheckKeyC), addQtVersionCheck);
 | 
			
		||||
    settings->endGroup();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool FormClassWizardGenerationParameters::equals(const FormClassWizardGenerationParameters &rhs) const
 | 
			
		||||
{
 | 
			
		||||
    return embedding == rhs.embedding
 | 
			
		||||
            && retranslationSupport == rhs.retranslationSupport
 | 
			
		||||
            && includeQtModule == rhs.includeQtModule
 | 
			
		||||
            && addQtVersionCheck == rhs.addQtVersionCheck;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Generation code
 | 
			
		||||
 | 
			
		||||
// Write out how to access the Ui class in the source code.
 | 
			
		||||
static inline void writeUiMemberAccess(const FormClassWizardGenerationParameters &fp, QTextStream &str)
 | 
			
		||||
static inline void writeUiMemberAccess(const QtSupport::CodeGenSettings &fp, QTextStream &str)
 | 
			
		||||
{
 | 
			
		||||
    switch (fp.embedding) {
 | 
			
		||||
    case PointerAggregatedUiClass:
 | 
			
		||||
    case QtSupport::CodeGenSettings::PointerAggregatedUiClass:
 | 
			
		||||
        str << uiMemberC << "->";
 | 
			
		||||
        break;
 | 
			
		||||
    case AggregatedUiClass:
 | 
			
		||||
    case QtSupport::CodeGenSettings::AggregatedUiClass:
 | 
			
		||||
        str << uiMemberC << '.';
 | 
			
		||||
        break;
 | 
			
		||||
    case InheritedUiClass:
 | 
			
		||||
    case QtSupport::CodeGenSettings::InheritedUiClass:
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -115,7 +69,7 @@ static inline void writeUiMemberAccess(const FormClassWizardGenerationParameters
 | 
			
		||||
bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParameters ¶meters,
 | 
			
		||||
                                                   QString *header, QString *source, int indentation)
 | 
			
		||||
{
 | 
			
		||||
    Internal::FormClassWizardGenerationParameters generationParameters;
 | 
			
		||||
    QtSupport::CodeGenSettings generationParameters;
 | 
			
		||||
    generationParameters.fromSettings(Core::ICore::settings());
 | 
			
		||||
 | 
			
		||||
    const QString indent = QString(indentation, QLatin1Char(' '));
 | 
			
		||||
@@ -158,7 +112,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
 | 
			
		||||
              << "\n#define " <<  guard << '\n' << '\n';
 | 
			
		||||
 | 
			
		||||
    // Include 'ui_'
 | 
			
		||||
    if (generationParameters.embedding != Internal::PointerAggregatedUiClass) {
 | 
			
		||||
    if (generationParameters.embedding != QtSupport::CodeGenSettings::PointerAggregatedUiClass) {
 | 
			
		||||
        Utils::writeIncludeFileDirective(uiInclude, false, headerStr);
 | 
			
		||||
    } else {
 | 
			
		||||
        // Todo: Can we obtain the header from the code model for custom widgets?
 | 
			
		||||
@@ -184,7 +138,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
 | 
			
		||||
                                                                  headerStr);
 | 
			
		||||
 | 
			
		||||
    // Forward-declare the UI class
 | 
			
		||||
    if (generationParameters.embedding == Internal::PointerAggregatedUiClass) {
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass) {
 | 
			
		||||
          headerStr << '\n'
 | 
			
		||||
                  << namespaceIndent << "namespace " <<  uiNamespaceC << " {\n"
 | 
			
		||||
                  << namespaceIndent << indent << "class " << Internal::FormTemplateWizardPage::stripNamespaces(uiClassName) << ";\n"
 | 
			
		||||
@@ -194,22 +148,22 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
 | 
			
		||||
    // Class declaration
 | 
			
		||||
    headerStr << '\n' << namespaceIndent << "class " << unqualifiedClassName
 | 
			
		||||
              << " : public " << formBaseClass;
 | 
			
		||||
    if (generationParameters.embedding == Internal::InheritedUiClass)
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::InheritedUiClass)
 | 
			
		||||
        headerStr << ", private " << uiClassName;
 | 
			
		||||
    headerStr << "\n{\n" << namespaceIndent << indent << "Q_OBJECT\n\n"
 | 
			
		||||
              << namespaceIndent << "public:\n"
 | 
			
		||||
              << namespaceIndent << indent << "explicit " << unqualifiedClassName << "(QWidget *parent = 0);\n";
 | 
			
		||||
    if (generationParameters.embedding == Internal::PointerAggregatedUiClass)
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass)
 | 
			
		||||
        headerStr << namespaceIndent << indent << "~" << unqualifiedClassName << "();\n";
 | 
			
		||||
    // retranslation
 | 
			
		||||
    if (generationParameters.retranslationSupport)
 | 
			
		||||
        headerStr << '\n' << namespaceIndent << "protected:\n"
 | 
			
		||||
                  << namespaceIndent << indent << "void changeEvent(QEvent *e);\n";
 | 
			
		||||
    // Member variable
 | 
			
		||||
    if (generationParameters.embedding != Internal::InheritedUiClass) {
 | 
			
		||||
    if (generationParameters.embedding != QtSupport::CodeGenSettings::InheritedUiClass) {
 | 
			
		||||
        headerStr << '\n' << namespaceIndent << "private:\n"
 | 
			
		||||
                  << namespaceIndent << indent << uiClassName << ' ';
 | 
			
		||||
        if (generationParameters.embedding == Internal::PointerAggregatedUiClass)
 | 
			
		||||
        if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass)
 | 
			
		||||
            headerStr << '*';
 | 
			
		||||
        headerStr << uiMemberC << ";\n";
 | 
			
		||||
    }
 | 
			
		||||
@@ -221,20 +175,20 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
 | 
			
		||||
    QTextStream sourceStr(source);
 | 
			
		||||
    sourceStr << sourceLicense;
 | 
			
		||||
    Utils::writeIncludeFileDirective(parameters.headerFile, false, sourceStr);
 | 
			
		||||
    if (generationParameters.embedding == Internal::PointerAggregatedUiClass)
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass)
 | 
			
		||||
        Utils::writeIncludeFileDirective(uiInclude, false, sourceStr);
 | 
			
		||||
    // NameSpaces(
 | 
			
		||||
    Utils::writeOpeningNameSpaces(namespaceList, QString(), sourceStr);
 | 
			
		||||
    // Constructor with setupUi
 | 
			
		||||
    sourceStr << '\n' << namespaceIndent << unqualifiedClassName << "::" << unqualifiedClassName << "(QWidget *parent) :\n"
 | 
			
		||||
               << namespaceIndent << indent << formBaseClass << "(parent)";
 | 
			
		||||
    if (generationParameters.embedding == Internal::PointerAggregatedUiClass)
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass)
 | 
			
		||||
        sourceStr << ",\n"  << namespaceIndent << indent <<  uiMemberC << "(new " << uiClassName << ")";
 | 
			
		||||
    sourceStr <<  '\n' << namespaceIndent << "{\n" <<  namespaceIndent << indent;
 | 
			
		||||
    writeUiMemberAccess(generationParameters, sourceStr);
 | 
			
		||||
    Internal::writeUiMemberAccess(generationParameters, sourceStr);
 | 
			
		||||
    sourceStr <<  "setupUi(this);\n" << namespaceIndent << "}\n";
 | 
			
		||||
    // Deleting destructor for ptr
 | 
			
		||||
    if (generationParameters.embedding == Internal::PointerAggregatedUiClass) {
 | 
			
		||||
    if (generationParameters.embedding == QtSupport::CodeGenSettings::PointerAggregatedUiClass) {
 | 
			
		||||
        sourceStr << '\n' <<  namespaceIndent << unqualifiedClassName << "::~" << unqualifiedClassName
 | 
			
		||||
                  << "()\n" << namespaceIndent << "{\n"
 | 
			
		||||
                  << namespaceIndent << indent << "delete " << uiMemberC << ";\n"
 | 
			
		||||
@@ -247,7 +201,7 @@ bool QtDesignerFormClassCodeGenerator::generateCpp(const FormClassWizardParamete
 | 
			
		||||
        << namespaceIndent << indent << formBaseClass << "::changeEvent(e);\n"
 | 
			
		||||
        << namespaceIndent << indent << "switch (e->type()) {\n" << namespaceIndent << indent << "case QEvent::LanguageChange:\n"
 | 
			
		||||
        << namespaceIndent << indent << indent;
 | 
			
		||||
        writeUiMemberAccess(generationParameters, sourceStr);
 | 
			
		||||
        Internal::writeUiMemberAccess(generationParameters, sourceStr);
 | 
			
		||||
        sourceStr << "retranslateUi(this);\n"
 | 
			
		||||
                  << namespaceIndent << indent <<  indent << "break;\n"
 | 
			
		||||
                  << namespaceIndent << indent << "default:\n"
 | 
			
		||||
 
 | 
			
		||||
@@ -40,35 +40,6 @@ QT_END_NAMESPACE
 | 
			
		||||
 | 
			
		||||
namespace Designer {
 | 
			
		||||
class FormClassWizardParameters;
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
// How to embed the Ui::Form class.
 | 
			
		||||
enum UiClassEmbedding
 | 
			
		||||
{
 | 
			
		||||
    PointerAggregatedUiClass, // "Ui::Form *m_ui";
 | 
			
		||||
    AggregatedUiClass,        // "Ui::Form m_ui";
 | 
			
		||||
    InheritedUiClass          // "...private Ui::Form..."
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Parameters influencing the code generation to be used in settings page.
 | 
			
		||||
struct FormClassWizardGenerationParameters
 | 
			
		||||
{
 | 
			
		||||
    FormClassWizardGenerationParameters();
 | 
			
		||||
    bool equals(const FormClassWizardGenerationParameters &rhs) const;
 | 
			
		||||
 | 
			
		||||
    void fromSettings(const QSettings *);
 | 
			
		||||
    void toSettings(QSettings *) const;
 | 
			
		||||
 | 
			
		||||
    UiClassEmbedding embedding;
 | 
			
		||||
    bool retranslationSupport; // Add handling for language change events
 | 
			
		||||
    bool includeQtModule; // Include "<QtGui/[Class]>" or just "<[Class]>"
 | 
			
		||||
    bool addQtVersionCheck; // Include #ifdef when using "#include <QtGui/..."
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline bool operator==(const FormClassWizardGenerationParameters &p1, const FormClassWizardGenerationParameters &p2) { return p1.equals(p2); }
 | 
			
		||||
inline bool operator!=(const FormClassWizardGenerationParameters &p1, const FormClassWizardGenerationParameters &p2) { return !p1.equals(p2); }
 | 
			
		||||
 | 
			
		||||
} // namespace Internal
 | 
			
		||||
 | 
			
		||||
// Publicly registered service to generate the code for a form class
 | 
			
		||||
// (See PluginManager::Invoke) to be accessed by Qt4ProjectManager.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										84
									
								
								src/plugins/qtsupport/codegensettings.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								src/plugins/qtsupport/codegensettings.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
**
 | 
			
		||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
 | 
			
		||||
** Contact: http://www.qt-project.org/legal
 | 
			
		||||
**
 | 
			
		||||
** This file is part of Qt Creator.
 | 
			
		||||
**
 | 
			
		||||
** Commercial License Usage
 | 
			
		||||
** Licensees holding valid commercial Qt licenses may use this file in
 | 
			
		||||
** accordance with the commercial license agreement provided with the
 | 
			
		||||
** Software or, alternatively, in accordance with the terms contained in
 | 
			
		||||
** a written agreement between you and Digia.  For licensing terms and
 | 
			
		||||
** conditions see http://qt.digia.com/licensing.  For further information
 | 
			
		||||
** use the contact form at http://qt.digia.com/contact-us.
 | 
			
		||||
**
 | 
			
		||||
** GNU Lesser General Public License Usage
 | 
			
		||||
** Alternatively, this file may be used under the terms of the GNU Lesser
 | 
			
		||||
** General Public License version 2.1 as published by the Free Software
 | 
			
		||||
** Foundation and appearing in the file LICENSE.LGPL included in the
 | 
			
		||||
** packaging of this file.  Please review the following information to
 | 
			
		||||
** ensure the GNU Lesser General Public License version 2.1 requirements
 | 
			
		||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
			
		||||
**
 | 
			
		||||
** In addition, as a special exception, Digia gives you certain additional
 | 
			
		||||
** rights.  These rights are described in the Digia Qt LGPL Exception
 | 
			
		||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 | 
			
		||||
**
 | 
			
		||||
****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "codegensettings.h"
 | 
			
		||||
 | 
			
		||||
#include <coreplugin/icore.h>
 | 
			
		||||
 | 
			
		||||
#include <QSettings>
 | 
			
		||||
 | 
			
		||||
static const char CODE_GEN_GROUP[] = "FormClassWizardPage";
 | 
			
		||||
static const char TRANSLATION_KEY[] = "RetranslationSupport";
 | 
			
		||||
static const char EMBEDDING_KEY[] = "Embedding";
 | 
			
		||||
static const char INCLUDE_QT_MODULE_KEY[] = "IncludeQtModule";
 | 
			
		||||
static const char ADD_QT_VERSION_CHECK_KEY[] = "AddQtVersionCheck";
 | 
			
		||||
 | 
			
		||||
static const bool retranslationSupportDefault = false;
 | 
			
		||||
 | 
			
		||||
namespace QtSupport {
 | 
			
		||||
 | 
			
		||||
CodeGenSettings::CodeGenSettings() :
 | 
			
		||||
    embedding(PointerAggregatedUiClass),
 | 
			
		||||
    retranslationSupport(retranslationSupportDefault),
 | 
			
		||||
    includeQtModule(false),
 | 
			
		||||
    addQtVersionCheck(false)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CodeGenSettings::equals(const CodeGenSettings &rhs) const
 | 
			
		||||
{
 | 
			
		||||
    return embedding == rhs.embedding
 | 
			
		||||
            && retranslationSupport == rhs.retranslationSupport
 | 
			
		||||
            && includeQtModule == rhs.includeQtModule
 | 
			
		||||
            && addQtVersionCheck == rhs.addQtVersionCheck;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CodeGenSettings::fromSettings(const QSettings *settings)
 | 
			
		||||
{
 | 
			
		||||
    QString group = QLatin1String(CODE_GEN_GROUP) + QLatin1Char('/');
 | 
			
		||||
 | 
			
		||||
    retranslationSupport = settings->value(group + QLatin1String(TRANSLATION_KEY), retranslationSupportDefault).toBool();
 | 
			
		||||
    embedding =  static_cast<UiClassEmbedding>(settings->value(group + QLatin1String(EMBEDDING_KEY), int(PointerAggregatedUiClass)).toInt());
 | 
			
		||||
    includeQtModule = settings->value(group + QLatin1String(INCLUDE_QT_MODULE_KEY), false).toBool();
 | 
			
		||||
    addQtVersionCheck = settings->value(group + QLatin1String(ADD_QT_VERSION_CHECK_KEY), false).toBool();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CodeGenSettings::toSettings(QSettings *settings) const
 | 
			
		||||
{
 | 
			
		||||
    settings->beginGroup(QLatin1String(CODE_GEN_GROUP));
 | 
			
		||||
    settings->setValue(QLatin1String(TRANSLATION_KEY), retranslationSupport);
 | 
			
		||||
    settings->setValue(QLatin1String(EMBEDDING_KEY), embedding);
 | 
			
		||||
    settings->setValue(QLatin1String(INCLUDE_QT_MODULE_KEY), includeQtModule);
 | 
			
		||||
    settings->setValue(QLatin1String(ADD_QT_VERSION_CHECK_KEY), addQtVersionCheck);
 | 
			
		||||
    settings->endGroup();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace QtSupport
 | 
			
		||||
							
								
								
									
										67
									
								
								src/plugins/qtsupport/codegensettings.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/plugins/qtsupport/codegensettings.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
**
 | 
			
		||||
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
 | 
			
		||||
** Contact: http://www.qt-project.org/legal
 | 
			
		||||
**
 | 
			
		||||
** This file is part of Qt Creator.
 | 
			
		||||
**
 | 
			
		||||
** Commercial License Usage
 | 
			
		||||
** Licensees holding valid commercial Qt licenses may use this file in
 | 
			
		||||
** accordance with the commercial license agreement provided with the
 | 
			
		||||
** Software or, alternatively, in accordance with the terms contained in
 | 
			
		||||
** a written agreement between you and Digia.  For licensing terms and
 | 
			
		||||
** conditions see http://qt.digia.com/licensing.  For further information
 | 
			
		||||
** use the contact form at http://qt.digia.com/contact-us.
 | 
			
		||||
**
 | 
			
		||||
** GNU Lesser General Public License Usage
 | 
			
		||||
** Alternatively, this file may be used under the terms of the GNU Lesser
 | 
			
		||||
** General Public License version 2.1 as published by the Free Software
 | 
			
		||||
** Foundation and appearing in the file LICENSE.LGPL included in the
 | 
			
		||||
** packaging of this file.  Please review the following information to
 | 
			
		||||
** ensure the GNU Lesser General Public License version 2.1 requirements
 | 
			
		||||
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
 | 
			
		||||
**
 | 
			
		||||
** In addition, as a special exception, Digia gives you certain additional
 | 
			
		||||
** rights.  These rights are described in the Digia Qt LGPL Exception
 | 
			
		||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
 | 
			
		||||
**
 | 
			
		||||
****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef CODEGENSETTINGS_H
 | 
			
		||||
#define CODEGENSETTINGS_H
 | 
			
		||||
 | 
			
		||||
#include "qtsupport_global.h"
 | 
			
		||||
 | 
			
		||||
QT_FORWARD_DECLARE_CLASS(QSettings)
 | 
			
		||||
 | 
			
		||||
namespace QtSupport {
 | 
			
		||||
 | 
			
		||||
class QTSUPPORT_EXPORT CodeGenSettings
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    // How to embed the Ui::Form class.
 | 
			
		||||
    enum UiClassEmbedding
 | 
			
		||||
    {
 | 
			
		||||
        PointerAggregatedUiClass, // "Ui::Form *m_ui";
 | 
			
		||||
        AggregatedUiClass,        // "Ui::Form m_ui";
 | 
			
		||||
        InheritedUiClass          // "...private Ui::Form..."
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    CodeGenSettings();
 | 
			
		||||
    bool equals(const CodeGenSettings &rhs) const;
 | 
			
		||||
 | 
			
		||||
    void fromSettings(const QSettings *settings);
 | 
			
		||||
    void toSettings(QSettings *settings) const;
 | 
			
		||||
 | 
			
		||||
    UiClassEmbedding embedding;
 | 
			
		||||
    bool retranslationSupport; // Add handling for language change events
 | 
			
		||||
    bool includeQtModule; // Include "<QtGui/[Class]>" or just "<[Class]>"
 | 
			
		||||
    bool addQtVersionCheck; // Include #ifdef when using "#include <QtGui/..."
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline bool operator==(const CodeGenSettings &p1, const CodeGenSettings &p2) { return p1.equals(p2); }
 | 
			
		||||
inline bool operator!=(const CodeGenSettings &p1, const CodeGenSettings &p2) { return !p1.equals(p2); }
 | 
			
		||||
 | 
			
		||||
} // namespace QtSupport
 | 
			
		||||
 | 
			
		||||
#endif // CODEGENSETTINGS_H
 | 
			
		||||
@@ -27,19 +27,22 @@
 | 
			
		||||
**
 | 
			
		||||
****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "cppsettingspage.h"
 | 
			
		||||
#include <designer/designerconstants.h>
 | 
			
		||||
#include "codegensettingspage.h"
 | 
			
		||||
 | 
			
		||||
#include "qtsupportconstants.h"
 | 
			
		||||
 | 
			
		||||
#include <cpptools/cpptoolsconstants.h>
 | 
			
		||||
 | 
			
		||||
#include <QCoreApplication>
 | 
			
		||||
#include <QTextStream>
 | 
			
		||||
#include <coreplugin/icore.h>
 | 
			
		||||
 | 
			
		||||
namespace Designer {
 | 
			
		||||
namespace QtSupport {
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
// ---------- CppSettingsPageWidget
 | 
			
		||||
// ---------- CodeGenSettingsPageWidget
 | 
			
		||||
 | 
			
		||||
CppSettingsPageWidget::CppSettingsPageWidget(QWidget *parent) :
 | 
			
		||||
CodeGenSettingsPageWidget::CodeGenSettingsPageWidget(QWidget *parent) :
 | 
			
		||||
        QWidget(parent)
 | 
			
		||||
{
 | 
			
		||||
    m_ui.setupUi(this);
 | 
			
		||||
@@ -47,17 +50,17 @@ CppSettingsPageWidget::CppSettingsPageWidget(QWidget *parent) :
 | 
			
		||||
            m_ui.addQtVersionCheckBox, SLOT(setEnabled(bool)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FormClassWizardGenerationParameters CppSettingsPageWidget::parameters() const
 | 
			
		||||
CodeGenSettings CodeGenSettingsPageWidget::parameters() const
 | 
			
		||||
{
 | 
			
		||||
    FormClassWizardGenerationParameters rc;
 | 
			
		||||
    rc.embedding = static_cast<UiClassEmbedding>(uiEmbedding());
 | 
			
		||||
    CodeGenSettings rc;
 | 
			
		||||
    rc.embedding = static_cast<CodeGenSettings::UiClassEmbedding>(uiEmbedding());
 | 
			
		||||
    rc.retranslationSupport =m_ui.retranslateCheckBox->isChecked();
 | 
			
		||||
    rc.includeQtModule = m_ui.includeQtModuleCheckBox->isChecked();
 | 
			
		||||
    rc.addQtVersionCheck = m_ui.addQtVersionCheckBox->isChecked();
 | 
			
		||||
    return rc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppSettingsPageWidget::setParameters(const FormClassWizardGenerationParameters &p)
 | 
			
		||||
void CodeGenSettingsPageWidget::setParameters(const CodeGenSettings &p)
 | 
			
		||||
{
 | 
			
		||||
    m_ui.retranslateCheckBox->setChecked(p.retranslationSupport);
 | 
			
		||||
    m_ui.includeQtModuleCheckBox->setChecked(p.includeQtModule);
 | 
			
		||||
@@ -65,54 +68,56 @@ void CppSettingsPageWidget::setParameters(const FormClassWizardGenerationParamet
 | 
			
		||||
    setUiEmbedding(p.embedding);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int CppSettingsPageWidget::uiEmbedding() const
 | 
			
		||||
int CodeGenSettingsPageWidget::uiEmbedding() const
 | 
			
		||||
{
 | 
			
		||||
    if (m_ui.ptrAggregationRadioButton->isChecked())
 | 
			
		||||
        return PointerAggregatedUiClass;
 | 
			
		||||
        return CodeGenSettings::PointerAggregatedUiClass;
 | 
			
		||||
    if (m_ui.aggregationButton->isChecked())
 | 
			
		||||
        return AggregatedUiClass;
 | 
			
		||||
    return InheritedUiClass;
 | 
			
		||||
        return CodeGenSettings::AggregatedUiClass;
 | 
			
		||||
    return CodeGenSettings::InheritedUiClass;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppSettingsPageWidget::setUiEmbedding(int v)
 | 
			
		||||
void CodeGenSettingsPageWidget::setUiEmbedding(int v)
 | 
			
		||||
{
 | 
			
		||||
    switch (v) {
 | 
			
		||||
    case PointerAggregatedUiClass:
 | 
			
		||||
    case CodeGenSettings::PointerAggregatedUiClass:
 | 
			
		||||
        m_ui.ptrAggregationRadioButton->setChecked(true);
 | 
			
		||||
        break;
 | 
			
		||||
    case AggregatedUiClass:
 | 
			
		||||
    case CodeGenSettings::AggregatedUiClass:
 | 
			
		||||
        m_ui.aggregationButton->setChecked(true);
 | 
			
		||||
        break;
 | 
			
		||||
    case InheritedUiClass:
 | 
			
		||||
    case CodeGenSettings::InheritedUiClass:
 | 
			
		||||
        m_ui.multipleInheritanceButton->setChecked(true);
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ---------- CppSettingsPage
 | 
			
		||||
CppSettingsPage::CppSettingsPage(QObject *parent) : Core::IOptionsPage(parent)
 | 
			
		||||
// ---------- CodeGenSettingsPage
 | 
			
		||||
CodeGenSettingsPage::CodeGenSettingsPage(QObject *parent) :
 | 
			
		||||
    Core::IOptionsPage(parent),
 | 
			
		||||
    m_widget(0)
 | 
			
		||||
{
 | 
			
		||||
    m_parameters.fromSettings(Core::ICore::settings());
 | 
			
		||||
    setId(Designer::Constants::SETTINGS_CPP_SETTINGS_ID);
 | 
			
		||||
    setDisplayName(QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_CPP_SETTINGS_NAME));
 | 
			
		||||
    setCategory(Designer::Constants::SETTINGS_CATEGORY);
 | 
			
		||||
    setDisplayCategory(QCoreApplication::translate("Designer", Designer::Constants::SETTINGS_TR_CATEGORY));
 | 
			
		||||
    setCategoryIcon(QLatin1String(Designer::Constants::SETTINGS_CATEGORY_ICON));
 | 
			
		||||
    setId(Constants::CODEGEN_SETTINGS_PAGE_ID);
 | 
			
		||||
    setDisplayName(QCoreApplication::translate("QtSupport", Constants::CODEGEN_SETTINGS_PAGE_NAME));
 | 
			
		||||
    setCategory(CppTools::Constants::CPP_SETTINGS_CATEGORY);
 | 
			
		||||
    setDisplayCategory(QCoreApplication::translate("CppTools", CppTools::Constants::CPP_SETTINGS_TR_CATEGORY));
 | 
			
		||||
    setCategoryIcon(QLatin1String(CppTools::Constants::SETTINGS_CATEGORY_CPP_ICON));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QWidget *CppSettingsPage::widget()
 | 
			
		||||
QWidget *CodeGenSettingsPage::widget()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_widget) {
 | 
			
		||||
        m_widget = new CppSettingsPageWidget;
 | 
			
		||||
        m_widget = new CodeGenSettingsPageWidget;
 | 
			
		||||
        m_widget->setParameters(m_parameters);
 | 
			
		||||
    }
 | 
			
		||||
    return m_widget;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppSettingsPage::apply()
 | 
			
		||||
void CodeGenSettingsPage::apply()
 | 
			
		||||
{
 | 
			
		||||
    if (m_widget) {
 | 
			
		||||
        const FormClassWizardGenerationParameters newParameters = m_widget->parameters();
 | 
			
		||||
        const CodeGenSettings newParameters = m_widget->parameters();
 | 
			
		||||
        if (newParameters != m_parameters) {
 | 
			
		||||
            m_parameters = newParameters;
 | 
			
		||||
            m_parameters.toSettings(Core::ICore::settings());
 | 
			
		||||
@@ -120,10 +125,10 @@ void CppSettingsPage::apply()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CppSettingsPage::finish()
 | 
			
		||||
void CodeGenSettingsPage::finish()
 | 
			
		||||
{
 | 
			
		||||
    delete m_widget;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Internal
 | 
			
		||||
} // namespace Designer
 | 
			
		||||
} // namespace QtSupport
 | 
			
		||||
@@ -27,50 +27,51 @@
 | 
			
		||||
**
 | 
			
		||||
****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#ifndef CPPSETTINGSPAGE_H
 | 
			
		||||
#define CPPSETTINGSPAGE_H
 | 
			
		||||
#ifndef CODEGENSETTINGSPAGE_H
 | 
			
		||||
#define CODEGENSETTINGSPAGE_H
 | 
			
		||||
 | 
			
		||||
#include "ui_cppsettingspagewidget.h"
 | 
			
		||||
#include <designer/qtdesignerformclasscodegenerator.h>
 | 
			
		||||
#include "ui_codegensettingspagewidget.h"
 | 
			
		||||
 | 
			
		||||
#include "codegensettings.h"
 | 
			
		||||
 | 
			
		||||
#include <coreplugin/dialogs/ioptionspage.h>
 | 
			
		||||
 | 
			
		||||
#include <QPointer>
 | 
			
		||||
 | 
			
		||||
namespace Designer {
 | 
			
		||||
namespace QtSupport {
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
class CppSettingsPageWidget : public QWidget
 | 
			
		||||
class CodeGenSettingsPageWidget : public QWidget
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
public:
 | 
			
		||||
    explicit CppSettingsPageWidget(QWidget *parent = 0);
 | 
			
		||||
    explicit CodeGenSettingsPageWidget(QWidget *parent = 0);
 | 
			
		||||
 | 
			
		||||
    FormClassWizardGenerationParameters parameters() const;
 | 
			
		||||
    void setParameters(const FormClassWizardGenerationParameters &p);
 | 
			
		||||
    CodeGenSettings parameters() const;
 | 
			
		||||
    void setParameters(const CodeGenSettings &p);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    int uiEmbedding() const;
 | 
			
		||||
    void setUiEmbedding(int);
 | 
			
		||||
 | 
			
		||||
    Ui::CppSettingsPageWidget m_ui;
 | 
			
		||||
    Ui::CodeGenSettingsPageWidget m_ui;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class CppSettingsPage : public Core::IOptionsPage
 | 
			
		||||
class CodeGenSettingsPage : public Core::IOptionsPage
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    explicit CppSettingsPage(QObject *parent = 0);
 | 
			
		||||
    explicit CodeGenSettingsPage(QObject *parent = 0);
 | 
			
		||||
 | 
			
		||||
    QWidget *widget();
 | 
			
		||||
    void apply();
 | 
			
		||||
    void finish();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    QPointer<CppSettingsPageWidget> m_widget;
 | 
			
		||||
    FormClassWizardGenerationParameters m_parameters;
 | 
			
		||||
    QPointer<CodeGenSettingsPageWidget> m_widget;
 | 
			
		||||
    CodeGenSettings m_parameters;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace Internal
 | 
			
		||||
} // namespace Designer
 | 
			
		||||
} // namespace QtSupport
 | 
			
		||||
 | 
			
		||||
#endif // CPPSETTINGSPAGE_H
 | 
			
		||||
#endif // CODEGENSETTINGSPAGE_H
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<ui version="4.0">
 | 
			
		||||
 <class>Designer::Internal::CppSettingsPageWidget</class>
 | 
			
		||||
 <widget class="QWidget" name="Designer::Internal::CppSettingsPageWidget">
 | 
			
		||||
 <class>QtSupport::Internal::CodeGenSettingsPageWidget</class>
 | 
			
		||||
 <widget class="QWidget" name="QtSupport::Internal::CodeGenSettingsPageWidget">
 | 
			
		||||
  <property name="geometry">
 | 
			
		||||
   <rect>
 | 
			
		||||
    <x>0</x>
 | 
			
		||||
@@ -7,6 +7,8 @@ DEFINES += QMAKE_LIBRARY
 | 
			
		||||
include(../../shared/proparser/proparser.pri)
 | 
			
		||||
 | 
			
		||||
HEADERS += \
 | 
			
		||||
    codegensettings.h \
 | 
			
		||||
    codegensettingspage.h \
 | 
			
		||||
    qtsupportplugin.h \
 | 
			
		||||
    qtsupport_global.h \
 | 
			
		||||
    qtkitconfigwidget.h \
 | 
			
		||||
@@ -36,6 +38,8 @@ HEADERS += \
 | 
			
		||||
    winceqtversion.h
 | 
			
		||||
 | 
			
		||||
SOURCES += \
 | 
			
		||||
    codegensettings.cpp \
 | 
			
		||||
    codegensettingspage.cpp \
 | 
			
		||||
    qtsupportplugin.cpp \
 | 
			
		||||
    qtkitconfigwidget.cpp \
 | 
			
		||||
    qtkitinformation.cpp \
 | 
			
		||||
@@ -68,6 +72,7 @@ greaterThan(QT_MAJOR_VERSION, 4) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
FORMS   +=  \
 | 
			
		||||
    codegensettingspagewidget.ui \
 | 
			
		||||
    showbuildlog.ui \
 | 
			
		||||
    qtversioninfo.ui \
 | 
			
		||||
    debugginghelper.ui \
 | 
			
		||||
 
 | 
			
		||||
@@ -60,6 +60,11 @@ QtcPlugin {
 | 
			
		||||
    files: [
 | 
			
		||||
        "baseqtversion.cpp",
 | 
			
		||||
        "baseqtversion.h",
 | 
			
		||||
        "codegensettings.cpp",
 | 
			
		||||
        "codegensettings.h",
 | 
			
		||||
        "codegensettingspage.cpp",
 | 
			
		||||
        "codegensettingspage.h",
 | 
			
		||||
        "codegensettingswidget.ui",
 | 
			
		||||
        "qtconfigwidget.cpp",
 | 
			
		||||
        "qtconfigwidget.h",
 | 
			
		||||
        "qtsupport.qrc",
 | 
			
		||||
 
 | 
			
		||||
@@ -33,10 +33,13 @@
 | 
			
		||||
namespace QtSupport {
 | 
			
		||||
namespace Constants {
 | 
			
		||||
 | 
			
		||||
// Qt4 settings pages
 | 
			
		||||
// Qt settings pages
 | 
			
		||||
const char QTVERSION_SETTINGS_PAGE_ID[] = "H.Qt Versions";
 | 
			
		||||
const char QTVERSION_SETTINGS_PAGE_NAME[] = QT_TRANSLATE_NOOP("QtSupport", "Qt Versions");
 | 
			
		||||
 | 
			
		||||
const char CODEGEN_SETTINGS_PAGE_ID[] = "Class Generation";
 | 
			
		||||
const char CODEGEN_SETTINGS_PAGE_NAME[] = QT_TRANSLATE_NOOP("QtSupport", "Qt Class Generation");
 | 
			
		||||
 | 
			
		||||
// QtVersions
 | 
			
		||||
const char DESKTOPQT[]   = "Qt4ProjectManager.QtVersion.Desktop";
 | 
			
		||||
const char SIMULATORQT[] = "Qt4ProjectManager.QtVersion.Simulator";
 | 
			
		||||
 
 | 
			
		||||
@@ -29,6 +29,7 @@
 | 
			
		||||
 | 
			
		||||
#include "qtsupportplugin.h"
 | 
			
		||||
 | 
			
		||||
#include "codegensettingspage.h"
 | 
			
		||||
#include "customexecutablerunconfiguration.h"
 | 
			
		||||
#include "desktopqtversionfactory.h"
 | 
			
		||||
#include "qtfeatureprovider.h"
 | 
			
		||||
@@ -81,6 +82,7 @@ bool QtSupportPlugin::initialize(const QStringList &arguments, QString *errorMes
 | 
			
		||||
    QtFeatureProvider *featureMgr = new QtFeatureProvider;
 | 
			
		||||
    addAutoReleasedObject(featureMgr);
 | 
			
		||||
 | 
			
		||||
    addAutoReleasedObject(new CodeGenSettingsPage);
 | 
			
		||||
    addAutoReleasedObject(new QtOptionsPage);
 | 
			
		||||
 | 
			
		||||
#if (QT_VERSION >= QT_VERSION_CHECK(5, 1, 0))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user