diff --git a/src/plugins/bineditor/bineditor.pro b/src/plugins/bineditor/bineditor.pro index 08a67fdf05f..976e701ff4a 100644 --- a/src/plugins/bineditor/bineditor.pro +++ b/src/plugins/bineditor/bineditor.pro @@ -11,3 +11,5 @@ SOURCES += bineditorplugin.cpp \ bineditor.cpp RESOURCES += bineditor.qrc + +OTHER_FILES += BinEditor.pluginspec diff --git a/src/plugins/bookmarks/bookmarks.pro b/src/plugins/bookmarks/bookmarks.pro index 1fcbffff7b4..d061d5fa76d 100644 --- a/src/plugins/bookmarks/bookmarks.pro +++ b/src/plugins/bookmarks/bookmarks.pro @@ -16,3 +16,5 @@ SOURCES += bookmarksplugin.cpp \ bookmarkmanager.cpp RESOURCES += bookmarks.qrc + +OTHER_FILES += Bookmarks.pluginspec diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index c5e260b8e9b..e2d02bba527 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -19,3 +19,5 @@ SOURCES = cmakeproject.cpp \ cmakeopenprojectwizard.cpp RESOURCES += cmakeproject.qrc FORMS += + +OTHER_FILES += CMakeProjectManager.pluginspec diff --git a/src/plugins/coreplugin/coreplugin.pro b/src/plugins/coreplugin/coreplugin.pro index 57fac677d04..3fd27bb5352 100644 --- a/src/plugins/coreplugin/coreplugin.pro +++ b/src/plugins/coreplugin/coreplugin.pro @@ -167,3 +167,5 @@ linux-* { INSTALLS += images } + +OTHER_FILES += Core.pluginspec diff --git a/src/plugins/coreplugin/welcomemode.ui b/src/plugins/coreplugin/welcomemode.ui index 41686e7fb85..c4189e142df 100644 --- a/src/plugins/coreplugin/welcomemode.ui +++ b/src/plugins/coreplugin/welcomemode.ui @@ -26,7 +26,7 @@ background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 *, * *, * * *, * * * *, * * * * * { font-family: Arial, Trebuchet, Lucida, sans-serif; -font-size: 9pt; +font-size: 12px; color: #5e5e5e; } @@ -118,7 +118,7 @@ border-width: 8 8 8 8; <style> h1 { - font-size: 2em; + font-size: 24px; font-weight: normal; color: #4d4d4d; margin-top: 0px; @@ -206,7 +206,7 @@ p { 0 - + diff --git a/src/plugins/cppeditor/cppeditor.pro b/src/plugins/cppeditor/cppeditor.pro index 2ea6fb53245..2fbf3b46e48 100644 --- a/src/plugins/cppeditor/cppeditor.pro +++ b/src/plugins/cppeditor/cppeditor.pro @@ -22,3 +22,5 @@ SOURCES += cppplugin.cpp \ cppfilewizard.cpp \ cppclasswizard.cpp RESOURCES += cppeditor.qrc + +OTHER_FILES += CppEditor.pluginspec diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index 2094a0edf64..5a5763f6af4 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -37,3 +37,5 @@ SOURCES += completionsettingspage.cpp \ FORMS += completionsettingspage.ui \ cppfilesettingspage.ui + +OTHER_FILES += CppTools.pluginspec diff --git a/src/plugins/debugger/debugger.pro b/src/plugins/debugger/debugger.pro index 8d0cb9ddbdd..3d364762c64 100644 --- a/src/plugins/debugger/debugger.pro +++ b/src/plugins/debugger/debugger.pro @@ -98,3 +98,5 @@ win32 { include(win/win.pri) include(cdb/cdb.pri) } + +OTHER_FILES += Debugger.pluginspec diff --git a/src/plugins/designer/designer.pro b/src/plugins/designer/designer.pro index 444eb2e7949..7fc73987566 100644 --- a/src/plugins/designer/designer.pro +++ b/src/plugins/designer/designer.pro @@ -50,3 +50,5 @@ SOURCES += formeditorplugin.cpp \ formwizarddialog.cpp RESOURCES += designer.qrc + +OTHER_FILES += Designer.pluginspec diff --git a/src/plugins/fakevim/fakevim.pro b/src/plugins/fakevim/fakevim.pro index 10a89dfeae0..890f047cfa4 100644 --- a/src/plugins/fakevim/fakevim.pro +++ b/src/plugins/fakevim/fakevim.pro @@ -25,3 +25,5 @@ HEADERS += \ FORMS += \ fakevimoptions.ui + +OTHER_FILES += FakeVim.pluginspec diff --git a/src/plugins/find/find.pro b/src/plugins/find/find.pro index 77a6193801c..52c93f30233 100644 --- a/src/plugins/find/find.pro +++ b/src/plugins/find/find.pro @@ -31,3 +31,5 @@ SOURCES += findtoolwindow.cpp \ FORMS += findwidget.ui \ finddialog.ui RESOURCES += find.qrc + +OTHER_FILES += Find.pluginspec diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro index 9ffb539b88b..eb00ccc16e4 100644 --- a/src/plugins/genericprojectmanager/genericprojectmanager.pro +++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro @@ -21,3 +21,5 @@ SOURCES = genericproject.cpp \ genericmakestep.cpp RESOURCES += genericproject.qrc FORMS += genericmakestep.ui + +OTHER_FILES += GenericProjectManager.pluginspec diff --git a/src/plugins/git/git.pro b/src/plugins/git/git.pro index 2bd1d00d9c4..c038852a2dc 100644 --- a/src/plugins/git/git.pro +++ b/src/plugins/git/git.pro @@ -41,3 +41,5 @@ FORMS += changeselectiondialog.ui \ settingspage.ui \ gitsubmitpanel.ui \ branchdialog.ui + +OTHER_FILES += ScmGit.pluginspec diff --git a/src/plugins/help/help.pro b/src/plugins/help/help.pro index 6fd810634b5..750afe0e445 100644 --- a/src/plugins/help/help.pro +++ b/src/plugins/help/help.pro @@ -35,3 +35,5 @@ include(../../shared/help/help.pri) contains(QT_CONFIG, webkit) { QT += webkit } + +OTHER_FILES += Help.pluginspec diff --git a/src/plugins/perforce/perforce.pro b/src/plugins/perforce/perforce.pro index 992777f1723..e386aba34c1 100644 --- a/src/plugins/perforce/perforce.pro +++ b/src/plugins/perforce/perforce.pro @@ -36,3 +36,5 @@ FORMS += settingspage.ui \ submitpanel.ui RESOURCES += perforce.qrc + +OTHER_FILES += Perforce.pluginspec diff --git a/src/plugins/projectexplorer/ProjectExplorer.pluginspec b/src/plugins/projectexplorer/ProjectExplorer.pluginspec index eb8ea81324e..a9390c57afa 100644 --- a/src/plugins/projectexplorer/ProjectExplorer.pluginspec +++ b/src/plugins/projectexplorer/ProjectExplorer.pluginspec @@ -21,6 +21,7 @@ will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index e7a00ad4f22..320b89de503 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -56,6 +56,8 @@ #include "session.h" #include "sessiondialog.h" #include "buildparserfactory.h" +#include "qtversionmanager.h" +#include "qtoptionspage.h" #include #include @@ -194,6 +196,11 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er connect(m_buildManager, SIGNAL(tasksChanged()), this, SLOT(updateTaskActions())); + m_versionManager = new QtVersionManager(); + addAutoReleasedObject(m_versionManager); + + addAutoReleasedObject(new QtOptionsPage()); + addAutoReleasedObject(new CoreListenerCheckingForRunningBuild(m_buildManager)); m_outputPane = new OutputPane; @@ -1905,4 +1912,9 @@ void ProjectExplorerPlugin::setSession(QAction *action) m_session->loadSession(session); } +QtVersionManager *ProjectExplorerPlugin::qtVersionManager() const +{ + return m_versionManager; +} + Q_EXPORT_PLUGIN(ProjectExplorerPlugin) diff --git a/src/plugins/projectexplorer/projectexplorer.h b/src/plugins/projectexplorer/projectexplorer.h index 987cb323fb6..b18545a9c39 100644 --- a/src/plugins/projectexplorer/projectexplorer.h +++ b/src/plugins/projectexplorer/projectexplorer.h @@ -64,6 +64,7 @@ class RunConfiguration; class RunControl; class SessionManager; class IRunConfigurationRunner; +class QtVersionManager; namespace Internal { class ApplicationOutput; @@ -104,6 +105,8 @@ public: void showContextMenu(const QPoint &globalPos, Node *node); + QtVersionManager *qtVersionManager() const; + //PluginInterface bool initialize(const QStringList &arguments, QString *error_message); void extensionsInitialized(); @@ -246,6 +249,7 @@ private: Node *m_currentNode; BuildManager *m_buildManager; + QtVersionManager *m_versionManager; QList m_fileFactories; QStringList m_profileMimeTypes; diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 5df19ebb034..c9d0f4dce59 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -54,11 +54,13 @@ HEADERS += projectexplorer.h \ projectmodels.h \ currentprojectfind.h \ toolchain.h \ - cesdkhandler.h\ - buildparserfactory.h\ - gccparser.h\ - msvcparser.h\ - filewatcher.h + cesdkhandler.h \ + buildparserfactory.h \ + gccparser.h \ + msvcparser.h \ + filewatcher.h \ + qtversionmanager.h \ + qtoptionspage.h SOURCES += projectexplorer.cpp \ projectwindow.cpp \ buildmanager.cpp \ @@ -101,11 +103,13 @@ SOURCES += projectexplorer.cpp \ projectmodels.cpp \ currentprojectfind.cpp \ toolchain.cpp \ - cesdkhandler.cpp\ + cesdkhandler.cpp \ buildparserfactory.cpp \ - gccparser.cpp\ - msvcparser.cpp\ - filewatcher.cpp + gccparser.cpp \ + msvcparser.cpp \ + filewatcher.cpp \ + qtversionmanager.cpp \ + qtoptionspage.cpp FORMS += dependenciespanel.ui \ buildsettingspropertiespage.ui \ processstep.ui \ @@ -114,7 +118,9 @@ FORMS += dependenciespanel.ui \ sessiondialog.ui \ projectwizardpage.ui \ buildstepspage.ui \ - removefiledialog.ui + removefiledialog.ui \ + qtversionmanager.ui \ + showbuildlog.ui win32 { SOURCES += applicationlauncher_win.cpp \ winguiprocess.cpp @@ -123,3 +129,4 @@ win32 { else:unix:SOURCES += applicationlauncher_x11.cpp RESOURCES += projectexplorer.qrc DEFINES += PROJECTEXPLORER_LIBRARY +OTHER_FILES += ProjectExplorer.pluginspec diff --git a/src/plugins/projectexplorer/projectexplorer_dependencies.pri b/src/plugins/projectexplorer/projectexplorer_dependencies.pri index 674c8bbb362..b4bb9a43826 100644 --- a/src/plugins/projectexplorer/projectexplorer_dependencies.pri +++ b/src/plugins/projectexplorer/projectexplorer_dependencies.pri @@ -3,3 +3,4 @@ include(../../plugins/quickopen/quickopen.pri) include(../../plugins/find/find.pri) include(../../plugins/coreplugin/coreplugin.pri) include(../../plugins/texteditor/texteditor.pri) +include(../../plugins/help/help.pri) diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index 77ea8d8292e..0a749cc7bd5 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -177,7 +177,10 @@ const char * const RESOURCE_MIMETYPE = "application/vnd.nokia.xml.qt.resource"; const char * const BUILD_PARSER_MSVC = "BuildParser.MSVC"; const char * const BUILD_PARSER_GCC = "BuildParser.Gcc"; - +//Qt4 settings pages +const char * const QT_CATEGORY = "Qt4"; +const char * const QTVERSION_PAGE = "Qt Versions"; +const char * const BUILD_ENVIRONMENT_PAGE = "Build Environments"; } // namespace Constants } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/qtoptionspage.cpp b/src/plugins/projectexplorer/qtoptionspage.cpp new file mode 100644 index 00000000000..c0ebf08ee18 --- /dev/null +++ b/src/plugins/projectexplorer/qtoptionspage.cpp @@ -0,0 +1,464 @@ +#include "qtoptionspage.h" +#include "ui_showbuildlog.h" +#include "ui_qtversionmanager.h" +#include "projectexplorerconstants.h" +#include "qtversionmanager.h" +#include + +#include + +using namespace ProjectExplorer; +using namespace ProjectExplorer::Internal; +/// +// QtOptionsPage +/// + +QtOptionsPage::QtOptionsPage() +{ + +} + +QtOptionsPage::~QtOptionsPage() +{ + +} + +QString QtOptionsPage::id() const +{ + return QLatin1String(Constants::QTVERSION_PAGE); +} + +QString QtOptionsPage::trName() const +{ + return tr(Constants::QTVERSION_PAGE); +} + +QString QtOptionsPage::category() const +{ + return Constants::QT_CATEGORY; +} + +QString QtOptionsPage::trCategory() const +{ + return tr(Constants::QT_CATEGORY); +} + +QWidget *QtOptionsPage::createPage(QWidget *parent) +{ + QtVersionManager *vm = QtVersionManager::instance(); + m_widget = new QtOptionsPageWidget(parent, vm->versions(), vm->currentQtVersion()); + return m_widget; +} + +void QtOptionsPage::apply() +{ + m_widget->finish(); + + QtVersionManager *vm = QtVersionManager::instance(); + vm->setNewQtVersions(m_widget->versions(), m_widget->defaultVersion()); +} + +//----------------------------------------------------- +QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList versions, QtVersion *defaultVersion) + : QWidget(parent) + , m_defaultVersion(versions.indexOf(defaultVersion)) + , m_specifyNameString(tr("")) + , m_specifyPathString(tr("")) +{ + // Initialize m_versions + foreach(QtVersion *version, versions) { + m_versions.append(new QtVersion(*version)); + } + + + m_ui = new Internal::Ui::QtVersionManager(); + m_ui->setupUi(this); + m_ui->qtPath->setExpectedKind(Core::Utils::PathChooser::Directory); + m_ui->qtPath->setPromptDialogTitle(tr("Select QTDIR")); + m_ui->mingwPath->setExpectedKind(Core::Utils::PathChooser::Directory); + m_ui->qtPath->setPromptDialogTitle(tr("Select the Qt Directory")); + + m_ui->addButton->setIcon(QIcon(Core::Constants::ICON_PLUS)); + m_ui->delButton->setIcon(QIcon(Core::Constants::ICON_MINUS)); + + for (int i = 0; i < m_versions.count(); ++i) { + const QtVersion * const version = m_versions.at(i); + QTreeWidgetItem *item = new QTreeWidgetItem(m_ui->qtdirList); + item->setText(0, version->name()); + item->setText(1, QDir::toNativeSeparators(version->path())); + item->setData(0, Qt::UserRole, version->uniqueId()); + + if (version->isValid()) { + if (version->hasDebuggingHelper()) + item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); + else + item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); + } else { + item->setData(2, Qt::DecorationRole, QIcon()); + } + + m_ui->defaultCombo->addItem(version->name()); + if (i == m_defaultVersion) + m_ui->defaultCombo->setCurrentIndex(i); + } + + connect(m_ui->nameEdit, SIGNAL(textEdited(const QString &)), + this, SLOT(updateCurrentQtName())); + + + connect(m_ui->qtPath, SIGNAL(changed()), + this, SLOT(updateCurrentQtPath())); + connect(m_ui->mingwPath, SIGNAL(changed()), + this, SLOT(updateCurrentMingwDirectory())); + + connect(m_ui->addButton, SIGNAL(clicked()), + this, SLOT(addQtDir())); + connect(m_ui->delButton, SIGNAL(clicked()), + this, SLOT(removeQtDir())); + + connect(m_ui->qtPath, SIGNAL(browsingFinished()), + this, SLOT(onQtBrowsed())); + connect(m_ui->mingwPath, SIGNAL(browsingFinished()), + this, SLOT(onMingwBrowsed())); + + connect(m_ui->qtdirList, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), + this, SLOT(versionChanged(QTreeWidgetItem *, QTreeWidgetItem *))); + connect(m_ui->defaultCombo, SIGNAL(currentIndexChanged(int)), + this, SLOT(defaultChanged(int))); + + connect(m_ui->msvcComboBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(msvcVersionChanged())); + + connect(m_ui->rebuildButton, SIGNAL(clicked()), + this, SLOT(buildDebuggingHelper())); + connect(m_ui->showLogButton, SIGNAL(clicked()), + this, SLOT(showDebuggingBuildLog())); + + showEnvironmentPage(0); + updateState(); +} + +void QtOptionsPageWidget::buildDebuggingHelper() +{ + // Find the qt version for this button.. + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + if (!currentItem) + return; + + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + QtVersion *version = m_versions[currentItemIndex]; + + QString result = m_versions.at(currentItemIndex)->buildDebuggingHelperLibrary(); + currentItem->setData(2, Qt::UserRole, result); + + if (version->hasDebuggingHelper()) { + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); + currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); + } else { + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); + currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); + } + m_ui->showLogButton->setEnabled(true); +} + +void QtOptionsPageWidget::showDebuggingBuildLog() +{ + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + if (!currentItem) + return; + + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + QDialog dlg; + Ui_ShowBuildLog ui; + ui.setupUi(&dlg); + ui.log->setPlainText(m_ui->qtdirList->topLevelItem(currentItemIndex)->data(2, Qt::UserRole).toString()); + dlg.exec(); +} + +QtOptionsPageWidget::~QtOptionsPageWidget() +{ + qDeleteAll(m_versions); + delete m_ui; +} + +void QtOptionsPageWidget::addQtDir() +{ + QtVersion *newVersion = new QtVersion(m_specifyNameString, m_specifyPathString); + m_versions.append(newVersion); + + QTreeWidgetItem *item = new QTreeWidgetItem(m_ui->qtdirList); + item->setText(0, newVersion->name()); + item->setText(1, QDir::toNativeSeparators(newVersion->path())); + item->setData(0, Qt::UserRole, newVersion->uniqueId()); + item->setData(2, Qt::DecorationRole, QIcon()); + + m_ui->qtdirList->setCurrentItem(item); + + m_ui->nameEdit->setText(newVersion->name()); + m_ui->qtPath->setPath(newVersion->path()); + m_ui->defaultCombo->addItem(newVersion->name()); + m_ui->nameEdit->setFocus(); + m_ui->nameEdit->selectAll(); +} + +void QtOptionsPageWidget::removeQtDir() +{ + QTreeWidgetItem *item = m_ui->qtdirList->currentItem(); + int index = m_ui->qtdirList->indexOfTopLevelItem(item); + if (index < 0) + return; + + for (int i = 0; i < m_ui->defaultCombo->count(); ++i) { + if (m_ui->defaultCombo->itemText(i) == item->text(0)) { + m_ui->defaultCombo->removeItem(i); + break; + } + } + + delete item; + + delete m_versions.takeAt(index); + updateState(); +} + +void QtOptionsPageWidget::updateState() +{ + bool enabled = (m_ui->qtdirList->currentItem() != 0); + bool isSystemVersion = (enabled + && m_versions.at(m_ui->qtdirList->indexOfTopLevelItem(m_ui->qtdirList->currentItem()))->isSystemVersion()); + m_ui->delButton->setEnabled(enabled && !isSystemVersion); + m_ui->nameEdit->setEnabled(enabled && !isSystemVersion); + m_ui->qtPath->setEnabled(enabled && !isSystemVersion); + m_ui->mingwPath->setEnabled(enabled); + + bool hasLog = enabled && !m_ui->qtdirList->currentItem()->data(2, Qt::UserRole).toString().isEmpty(); + m_ui->showLogButton->setEnabled(hasLog); + + QtVersion *version = 0; + if (enabled) + version = m_versions.at(m_ui->qtdirList->indexOfTopLevelItem(m_ui->qtdirList->currentItem())); + if (version) { + m_ui->rebuildButton->setEnabled(version->isValid()); + if (version->hasDebuggingHelper()) + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); + else + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); + } else { + m_ui->rebuildButton->setEnabled(false); + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap()); + } +} +void QtOptionsPageWidget::makeMingwVisible(bool visible) +{ + m_ui->mingwLabel->setVisible(visible); + m_ui->mingwPath->setVisible(visible); +} + +void QtOptionsPageWidget::showEnvironmentPage(QTreeWidgetItem *item) +{ + m_ui->msvcComboBox->setVisible(false); + if (item) { + int index = m_ui->qtdirList->indexOfTopLevelItem(item); + m_ui->errorLabel->setText(""); + ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->toolchainType(); + if (t == ProjectExplorer::ToolChain::MinGW) { + m_ui->msvcComboBox->setVisible(false); + makeMingwVisible(true); + m_ui->mingwPath->setPath(m_versions.at(index)->mingwDirectory()); + } else if (t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE){ + m_ui->msvcComboBox->setVisible(false); + makeMingwVisible(false); + QStringList msvcEnvironments = ProjectExplorer::ToolChain::availableMSVCVersions(); + if (msvcEnvironments.count() == 0) { + } else if (msvcEnvironments.count() == 1) { + } else { + m_ui->msvcComboBox->setVisible(true); + bool block = m_ui->msvcComboBox->blockSignals(true); + m_ui->msvcComboBox->clear(); + foreach(const QString &msvcenv, msvcEnvironments) { + m_ui->msvcComboBox->addItem(msvcenv); + if (msvcenv == m_versions.at(index)->msvcVersion()) { + m_ui->msvcComboBox->setCurrentIndex(m_ui->msvcComboBox->count() - 1); + } + } + m_ui->msvcComboBox->blockSignals(block); + } + } else if (t == ProjectExplorer::ToolChain::INVALID) { + m_ui->msvcComboBox->setVisible(false); + makeMingwVisible(false); + if (!m_versions.at(index)->isInstalled()) + m_ui->errorLabel->setText(tr("The Qt Version %1 is not installed. Run make install") + .arg(QDir::toNativeSeparators(m_versions.at(index)->path()))); + else + m_ui->errorLabel->setText(tr("%1 is not a valid qt directory").arg(QDir::toNativeSeparators(m_versions.at(index)->path()))); + } else { //ProjectExplorer::ToolChain::GCC + m_ui->msvcComboBox->setVisible(false); + makeMingwVisible(false); + m_ui->errorLabel->setText(tr("Found Qt version %1, using mkspec %2") + .arg(m_versions.at(index)->qtVersionString(), + m_versions.at(index)->mkspec())); + } + } else { + m_ui->msvcComboBox->setVisible(false); + makeMingwVisible(false); + } +} + +void QtOptionsPageWidget::versionChanged(QTreeWidgetItem *item, QTreeWidgetItem *old) +{ + if (old) { + fixQtVersionName(m_ui->qtdirList->indexOfTopLevelItem(old)); + } + if (item) { + m_ui->nameEdit->setText(item->text(0)); + m_ui->qtPath->setPath(item->text(1)); + } else { + m_ui->nameEdit->clear(); + m_ui->qtPath->setPath(""); // clear() + } + showEnvironmentPage(item); + updateState(); +} + +void QtOptionsPageWidget::onQtBrowsed() +{ + const QString dir = m_ui->qtPath->path(); + if (dir.isEmpty()) + return; + + updateCurrentQtPath(); + if (m_ui->nameEdit->text().isEmpty() || m_ui->nameEdit->text() == m_specifyNameString) { + QStringList dirSegments = dir.split(QDir::separator(), QString::SkipEmptyParts); + if (!dirSegments.isEmpty()) + m_ui->nameEdit->setText(dirSegments.last()); + updateCurrentQtName(); + } + updateState(); +} + +void QtOptionsPageWidget::onMingwBrowsed() +{ + const QString dir = m_ui->mingwPath->path(); + if (dir.isEmpty()) + return; + + updateCurrentMingwDirectory(); + updateState(); +} + +void QtOptionsPageWidget::defaultChanged(int) +{ + for (int i=0; idefaultCombo->count(); ++i) { + if (m_versions.at(i)->name() == m_ui->defaultCombo->currentText()) { + m_defaultVersion = i; + return; + } + } + + m_defaultVersion = 0; +} + +void QtOptionsPageWidget::updateCurrentQtName() +{ + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + Q_ASSERT(currentItem); + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + m_versions[currentItemIndex]->setName(m_ui->nameEdit->text()); + currentItem->setText(0, m_versions[currentItemIndex]->name()); + + m_ui->defaultCombo->setItemText(currentItemIndex, m_versions[currentItemIndex]->name()); +} + + +void QtOptionsPageWidget::finish() +{ + if (QTreeWidgetItem *item = m_ui->qtdirList->currentItem()) + fixQtVersionName(m_ui->qtdirList->indexOfTopLevelItem(item)); +} + +/* Checks that the qt version name is unique + * and otherwise changes the name + * + */ +void QtOptionsPageWidget::fixQtVersionName(int index) +{ + int count = m_versions.count(); + for (int i = 0; i < count; ++i) { + if (i != index) { + if (m_versions.at(i)->name() == m_versions.at(index)->name()) { + // Same name, find new name + QString name = m_versions.at(index)->name(); + QRegExp regexp("^(.*)\\((\\d)\\)$"); + if (regexp.exactMatch(name)) { + // Alreay in Name (#) format + name = regexp.cap(1) + "(" + QString().setNum(regexp.cap(2).toInt() + 1) + ")"; + } else { + name = name + " (2)"; + } + // set new name + m_versions[index]->setName(name); + m_ui->qtdirList->topLevelItem(index)->setText(0, name); + m_ui->defaultCombo->setItemText(index, name); + + // Now check again... + fixQtVersionName(index); + } + } + } +} + +void QtOptionsPageWidget::updateCurrentQtPath() +{ + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + Q_ASSERT(currentItem); + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + if (m_versions[currentItemIndex]->path() == m_ui->qtPath->path()) + return; + m_versions[currentItemIndex]->setPath(m_ui->qtPath->path()); + currentItem->setText(1, QDir::toNativeSeparators(m_versions[currentItemIndex]->path())); + + showEnvironmentPage(currentItem); + + if (m_versions[currentItemIndex]->isValid()) { + bool hasLog = !currentItem->data(2, Qt::UserRole).toString().isEmpty(); + bool hasHelper = m_versions[currentItemIndex]->hasDebuggingHelper(); + if (hasHelper) { + currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); + } else { + currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); + } + m_ui->showLogButton->setEnabled(hasLog); + } else { + currentItem->setData(2, Qt::DecorationRole, QIcon()); + m_ui->debuggingHelperStateLabel->setPixmap(QPixmap()); + } +} + +void QtOptionsPageWidget::updateCurrentMingwDirectory() +{ + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + Q_ASSERT(currentItem); + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + m_versions[currentItemIndex]->setMingwDirectory(m_ui->mingwPath->path()); +} + +void QtOptionsPageWidget::msvcVersionChanged() +{ + const QString &msvcVersion = m_ui->msvcComboBox->currentText(); + QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem(); + Q_ASSERT(currentItem); + int currentItemIndex = m_ui->qtdirList->indexOfTopLevelItem(currentItem); + m_versions[currentItemIndex]->setMsvcVersion(msvcVersion); +} + +QList QtOptionsPageWidget::versions() const +{ + return m_versions; +} + +int QtOptionsPageWidget::defaultVersion() const +{ + return m_defaultVersion; +} diff --git a/src/plugins/projectexplorer/qtoptionspage.h b/src/plugins/projectexplorer/qtoptionspage.h new file mode 100644 index 00000000000..4d7df925343 --- /dev/null +++ b/src/plugins/projectexplorer/qtoptionspage.h @@ -0,0 +1,107 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** 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. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ +#ifndef QTOPTIONSPAGE_H +#define QTOPTIONSPAGE_H + +#include + +#include + +QT_BEGIN_NAMESPACE +class QTreeWidgetItem; +QT_END_NAMESPACE + +namespace ProjectExplorer { + +class QtVersion; + +namespace Internal { +namespace Ui { +class QtVersionManager; +} + +class QtOptionsPageWidget : public QWidget +{ + Q_OBJECT +public: + QtOptionsPageWidget(QWidget *parent, QList versions, QtVersion *defaultVersion); + ~QtOptionsPageWidget(); + QList versions() const; + int defaultVersion() const; + void finish(); + +private: + void showEnvironmentPage(QTreeWidgetItem * item); + void fixQtVersionName(int index); + int indexForWidget(QWidget *debuggingHelperWidget) const; + Internal::Ui::QtVersionManager *m_ui; + QList m_versions; + int m_defaultVersion; + QString m_specifyNameString; + QString m_specifyPathString; + +private slots: + void versionChanged(QTreeWidgetItem *item, QTreeWidgetItem *old); + void addQtDir(); + void removeQtDir(); + void updateState(); + void makeMingwVisible(bool visible); + void onQtBrowsed(); + void onMingwBrowsed(); + void defaultChanged(int index); + void updateCurrentQtName(); + void updateCurrentQtPath(); + void updateCurrentMingwDirectory(); + void msvcVersionChanged(); + void buildDebuggingHelper(); + void showDebuggingBuildLog(); +}; + +class QtOptionsPage : public Core::IOptionsPage +{ + Q_OBJECT +public: + QtOptionsPage(); + ~QtOptionsPage(); + QString id() const; + QString trName() const; + QString category() const; + QString trCategory() const; + QWidget *createPage(QWidget *parent); + void apply(); + void finish() { } +private: + QtOptionsPageWidget *m_widget; +}; + +} //namespace Internal +} //namespace ProjectExplorer + + +#endif // QTOPTIONSPAGE_H diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/projectexplorer/qtversionmanager.cpp similarity index 68% rename from src/plugins/qt4projectmanager/qtversionmanager.cpp rename to src/plugins/projectexplorer/qtversionmanager.cpp index 4b3a2b344ad..dae9faddca4 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/projectexplorer/qtversionmanager.cpp @@ -29,36 +29,24 @@ #include "qtversionmanager.h" -#include "qt4projectmanagerconstants.h" -#include "ui_showbuildlog.h" +#include "projectexplorerconstants.h" +#include "cesdkhandler.h" + +#include "projectexplorer.h" #include -#include #include -#include -#include #include #include -#include #include #include -#include #include - -#include -#include -#include -#include -#include #include #include -#include -#include -using namespace Qt4ProjectManager::Internal; - -using ProjectExplorer::Environment; +using namespace ProjectExplorer; +using namespace ProjectExplorer::Internal; static const char *QtVersionsSectionName = "QtVersions"; static const char *defaultQtVersionKey = "DefaultQtVersion"; @@ -90,7 +78,6 @@ QtVersionManager::QtVersionManager() id, s->value("IsSystemVersion", false).toBool()); version->setMingwDirectory(s->value("MingwDirectory").toString()); - version->setPrependPath(s->value("PrependPath").toString()); version->setMsvcVersion(s->value("msvcVersion").toString()); m_versions.append(version); } @@ -113,6 +100,11 @@ QtVersionManager::~QtVersionManager() m_emptyVersion = 0; } +QtVersionManager *QtVersionManager::instance() +{ + return ProjectExplorerPlugin::instance()->qtVersionManager(); +} + void QtVersionManager::addVersion(QtVersion *version) { m_versions.append(version); @@ -140,34 +132,6 @@ int QtVersionManager::getUniqueId() return m_idcount++; } -QString QtVersionManager::id() const -{ - return QLatin1String(Constants::QTVERSION_PAGE); -} - -QString QtVersionManager::trName() const -{ - return tr(Constants::QTVERSION_PAGE); -} - -QString QtVersionManager::category() const -{ - return Constants::QT_CATEGORY; -} - -QString QtVersionManager::trCategory() const -{ - return tr(Constants::QT_CATEGORY); -} - -QWidget *QtVersionManager::createPage(QWidget *parent) -{ - if (m_widget) - delete m_widget; - m_widget = new QtDirWidget(parent, m_versions, m_defaultVersion); - return m_widget; -} - void QtVersionManager::updateUniqueIdToIndexMap() { m_uniqueIdToIndex.clear(); @@ -175,40 +139,6 @@ void QtVersionManager::updateUniqueIdToIndexMap() m_uniqueIdToIndex.insert(m_versions.at(i)->uniqueId(), i); } -void QtVersionManager::apply() -{ - m_widget->finish(); - QList newVersions = m_widget->versions(); - bool versionPathsChanged = m_versions.size() != newVersions.size(); - if (!versionPathsChanged) { - for (int i = 0; i < m_versions.size(); ++i) { - if (m_versions.at(i)->path() != newVersions.at(i)->path()) { - versionPathsChanged = true; - break; - } - } - } - qDeleteAll(m_versions); - m_versions.clear(); - foreach(QtVersion *version, m_widget->versions()) - m_versions.append(new QtVersion(*version)); - if (versionPathsChanged) - updateDocumentation(); - updateUniqueIdToIndexMap(); - - bool emitDefaultChanged = false; - if (m_defaultVersion != m_widget->defaultVersion()) { - m_defaultVersion = m_widget->defaultVersion(); - emitDefaultChanged = true; - } - - emit qtVersionsChanged(); - if (emitDefaultChanged) - emit defaultQtVersionChanged(); - - writeVersionsIntoSettings(); -} - void QtVersionManager::writeVersionsIntoSettings() { QSettings *s = Core::ICore::instance()->settings(); @@ -220,7 +150,6 @@ void QtVersionManager::writeVersionsIntoSettings() s->setValue("Path", m_versions.at(i)->path()); s->setValue("Id", m_versions.at(i)->uniqueId()); s->setValue("MingwDirectory", m_versions.at(i)->mingwDirectory()); - s->setValue("PrependPath", m_versions.at(i)->prependPath()); s->setValue("msvcVersion", m_versions.at(i)->msvcVersion()); s->setValue("IsSystemVersion", m_versions.at(i)->isSystemVersion()); } @@ -271,8 +200,6 @@ void QtVersionManager::addNewVersionsFromInstaller() QtVersion *version = new QtVersion(newVersionData[0], newVersionData[1], m_idcount++ ); if (newVersionData.count() >= 3) version->setMingwDirectory(newVersionData[2]); - if (newVersionData.count() >= 4) - version->setPrependPath(newVersionData[3]); bool versionWasAlreadyInList = false; foreach(const QtVersion * const it, m_versions) { @@ -378,408 +305,39 @@ QtVersion *QtVersionManager::currentQtVersion() const return m_emptyVersion; } -//----------------------------------------------------- -QtDirWidget::QtDirWidget(QWidget *parent, QList versions, int defaultVersion) - : QWidget(parent) - , m_defaultVersion(defaultVersion) - , m_specifyNameString(tr("")) - , m_specifyPathString(tr("")) +void QtVersionManager::setNewQtVersions(QList newVersions, int newDefaultVersion) { - // Initialize m_versions - foreach(QtVersion *version, versions) { - m_versions.append(new QtVersion(*version)); - } - - - m_ui.setupUi(this); - m_ui.qtPath->setExpectedKind(Core::Utils::PathChooser::Directory); - m_ui.qtPath->setPromptDialogTitle(tr("Select QTDIR")); - m_ui.mingwPath->setExpectedKind(Core::Utils::PathChooser::Directory); - m_ui.qtPath->setPromptDialogTitle(tr("Select the Qt Directory")); - - m_ui.addButton->setIcon(QIcon(Core::Constants::ICON_PLUS)); - m_ui.delButton->setIcon(QIcon(Core::Constants::ICON_MINUS)); - - for (int i = 0; i < m_versions.count(); ++i) { - const QtVersion * const version = m_versions.at(i); - QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.qtdirList); - item->setText(0, version->name()); - item->setText(1, QDir::toNativeSeparators(version->path())); - item->setData(0, Qt::UserRole, version->uniqueId()); - - if (version->isValid()) { - if (version->hasDebuggingHelper()) - item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); - else - item->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); - } else { - item->setData(2, Qt::DecorationRole, QIcon()); + bool versionPathsChanged = m_versions.size() != newVersions.size(); + if (!versionPathsChanged) { + for (int i = 0; i < m_versions.size(); ++i) { + if (m_versions.at(i)->path() != newVersions.at(i)->path()) { + versionPathsChanged = true; + break; + } } - - m_ui.defaultCombo->addItem(version->name()); - if (i == m_defaultVersion) - m_ui.defaultCombo->setCurrentIndex(i); } - - connect(m_ui.nameEdit, SIGNAL(textEdited(const QString &)), - this, SLOT(updateCurrentQtName())); - - - connect(m_ui.qtPath, SIGNAL(changed()), - this, SLOT(updateCurrentQtPath())); - connect(m_ui.mingwPath, SIGNAL(changed()), - this, SLOT(updateCurrentMingwDirectory())); - - connect(m_ui.addButton, SIGNAL(clicked()), - this, SLOT(addQtDir())); - connect(m_ui.delButton, SIGNAL(clicked()), - this, SLOT(removeQtDir())); - - connect(m_ui.qtPath, SIGNAL(browsingFinished()), - this, SLOT(onQtBrowsed())); - connect(m_ui.mingwPath, SIGNAL(browsingFinished()), - this, SLOT(onMingwBrowsed())); - - connect(m_ui.qtdirList, SIGNAL(currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)), - this, SLOT(versionChanged(QTreeWidgetItem *, QTreeWidgetItem *))); - connect(m_ui.defaultCombo, SIGNAL(currentIndexChanged(int)), - this, SLOT(defaultChanged(int))); - - connect(m_ui.msvcComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(msvcVersionChanged())); - - connect(m_ui.rebuildButton, SIGNAL(clicked()), - this, SLOT(buildDebuggingHelper())); - connect(m_ui.showLogButton, SIGNAL(clicked()), - this, SLOT(showDebuggingBuildLog())); - - showEnvironmentPage(0); - updateState(); -} - -void QtDirWidget::buildDebuggingHelper() -{ - // Find the qt version for this button.. - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - if (!currentItem) - return; - - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - QtVersion *version = m_versions[currentItemIndex]; - - QString result = m_versions.at(currentItemIndex)->buildDebuggingHelperLibrary(); - currentItem->setData(2, Qt::UserRole, result); - - if (version->hasDebuggingHelper()) { - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); - currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); - } else { - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); - currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); - } - m_ui.showLogButton->setEnabled(true); -} - -void QtDirWidget::showDebuggingBuildLog() -{ - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - if (!currentItem) - return; - - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - QDialog dlg; - Ui_ShowBuildLog ui; - ui.setupUi(&dlg); - ui.log->setPlainText(m_ui.qtdirList->topLevelItem(currentItemIndex)->data(2, Qt::UserRole).toString()); - dlg.exec(); -} - -QtDirWidget::~QtDirWidget() -{ qDeleteAll(m_versions); -} + m_versions.clear(); + foreach(QtVersion *version, newVersions) + m_versions.append(new QtVersion(*version)); + if (versionPathsChanged) + updateDocumentation(); + updateUniqueIdToIndexMap(); -void QtDirWidget::addQtDir() -{ - QtVersion *newVersion = new QtVersion(m_specifyNameString, m_specifyPathString); - m_versions.append(newVersion); - - QTreeWidgetItem *item = new QTreeWidgetItem(m_ui.qtdirList); - item->setText(0, newVersion->name()); - item->setText(1, QDir::toNativeSeparators(newVersion->path())); - item->setData(0, Qt::UserRole, newVersion->uniqueId()); - item->setData(2, Qt::DecorationRole, QIcon()); - - m_ui.qtdirList->setCurrentItem(item); - - m_ui.nameEdit->setText(newVersion->name()); - m_ui.qtPath->setPath(newVersion->path()); - m_ui.defaultCombo->addItem(newVersion->name()); - m_ui.nameEdit->setFocus(); - m_ui.nameEdit->selectAll(); -} - -void QtDirWidget::removeQtDir() -{ - QTreeWidgetItem *item = m_ui.qtdirList->currentItem(); - int index = m_ui.qtdirList->indexOfTopLevelItem(item); - if (index < 0) - return; - - for (int i = 0; i < m_ui.defaultCombo->count(); ++i) { - if (m_ui.defaultCombo->itemText(i) == item->text(0)) { - m_ui.defaultCombo->removeItem(i); - break; - } + bool emitDefaultChanged = false; + if (m_defaultVersion != newDefaultVersion) { + m_defaultVersion = newDefaultVersion; + emitDefaultChanged = true; } - delete item; + emit qtVersionsChanged(); + if (emitDefaultChanged) + emit defaultQtVersionChanged(); - delete m_versions.takeAt(index); - updateState(); -} - -void QtDirWidget::updateState() -{ - bool enabled = (m_ui.qtdirList->currentItem() != 0); - bool isSystemVersion = (enabled - && m_versions.at(m_ui.qtdirList->indexOfTopLevelItem(m_ui.qtdirList->currentItem()))->isSystemVersion()); - m_ui.delButton->setEnabled(enabled && !isSystemVersion); - m_ui.nameEdit->setEnabled(enabled && !isSystemVersion); - m_ui.qtPath->setEnabled(enabled && !isSystemVersion); - m_ui.mingwPath->setEnabled(enabled); - - bool hasLog = enabled && !m_ui.qtdirList->currentItem()->data(2, Qt::UserRole).toString().isEmpty(); - m_ui.showLogButton->setEnabled(hasLog); - - QtVersion *version = 0; - if (enabled) - version = m_versions.at(m_ui.qtdirList->indexOfTopLevelItem(m_ui.qtdirList->currentItem())); - if (version) { - m_ui.rebuildButton->setEnabled(version->isValid()); - if (version->hasDebuggingHelper()) - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); - else - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); - } else { - m_ui.rebuildButton->setEnabled(false); - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap()); - } -} -void QtDirWidget::makeMingwVisible(bool visible) -{ - m_ui.mingwLabel->setVisible(visible); - m_ui.mingwPath->setVisible(visible); -} - -void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item) -{ - m_ui.msvcComboBox->setVisible(false); - if (item) { - int index = m_ui.qtdirList->indexOfTopLevelItem(item); - m_ui.errorLabel->setText(""); - ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->toolchainType(); - if (t == ProjectExplorer::ToolChain::MinGW) { - m_ui.msvcComboBox->setVisible(false); - makeMingwVisible(true); - m_ui.mingwPath->setPath(m_versions.at(index)->mingwDirectory()); - } else if (t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE){ - m_ui.msvcComboBox->setVisible(false); - makeMingwVisible(false); - QStringList msvcEnvironments = ProjectExplorer::ToolChain::availableMSVCVersions(); - if (msvcEnvironments.count() == 0) { - } else if (msvcEnvironments.count() == 1) { - } else { - m_ui.msvcComboBox->setVisible(true); - bool block = m_ui.msvcComboBox->blockSignals(true); - m_ui.msvcComboBox->clear(); - foreach(const QString &msvcenv, msvcEnvironments) { - m_ui.msvcComboBox->addItem(msvcenv); - if (msvcenv == m_versions.at(index)->msvcVersion()) { - m_ui.msvcComboBox->setCurrentIndex(m_ui.msvcComboBox->count() - 1); - } - } - m_ui.msvcComboBox->blockSignals(block); - } - } else if (t == ProjectExplorer::ToolChain::INVALID) { - m_ui.msvcComboBox->setVisible(false); - makeMingwVisible(false); - if (!m_versions.at(index)->isInstalled()) - m_ui.errorLabel->setText(tr("The Qt Version %1 is not installed. Run make install") - .arg(QDir::toNativeSeparators(m_versions.at(index)->path()))); - else - m_ui.errorLabel->setText(tr("%1 is not a valid qt directory").arg(QDir::toNativeSeparators(m_versions.at(index)->path()))); - } else { //ProjectExplorer::ToolChain::GCC - m_ui.msvcComboBox->setVisible(false); - makeMingwVisible(false); - m_ui.errorLabel->setText(tr("Found Qt version %1, using mkspec %2") - .arg(m_versions.at(index)->qtVersionString(), - m_versions.at(index)->mkspec())); - } - } else { - m_ui.msvcComboBox->setVisible(false); - makeMingwVisible(false); - } -} - -void QtDirWidget::versionChanged(QTreeWidgetItem *item, QTreeWidgetItem *old) -{ - if (old) { - fixQtVersionName(m_ui.qtdirList->indexOfTopLevelItem(old)); - } - if (item) { - m_ui.nameEdit->setText(item->text(0)); - m_ui.qtPath->setPath(item->text(1)); - } else { - m_ui.nameEdit->clear(); - m_ui.qtPath->setPath(""); // clear() - } - showEnvironmentPage(item); - updateState(); -} - -void QtDirWidget::onQtBrowsed() -{ - const QString dir = m_ui.qtPath->path(); - if (dir.isEmpty()) - return; - - updateCurrentQtPath(); - if (m_ui.nameEdit->text().isEmpty() || m_ui.nameEdit->text() == m_specifyNameString) { - QStringList dirSegments = dir.split(QDir::separator(), QString::SkipEmptyParts); - if (!dirSegments.isEmpty()) - m_ui.nameEdit->setText(dirSegments.last()); - updateCurrentQtName(); - } - updateState(); -} - -void QtDirWidget::onMingwBrowsed() -{ - const QString dir = m_ui.mingwPath->path(); - if (dir.isEmpty()) - return; - - updateCurrentMingwDirectory(); - updateState(); -} - -void QtDirWidget::defaultChanged(int) -{ - for (int i=0; icount(); ++i) { - if (m_versions.at(i)->name() == m_ui.defaultCombo->currentText()) { - m_defaultVersion = i; - return; - } - } - - m_defaultVersion = 0; -} - -void QtDirWidget::updateCurrentQtName() -{ - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - Q_ASSERT(currentItem); - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - m_versions[currentItemIndex]->setName(m_ui.nameEdit->text()); - currentItem->setText(0, m_versions[currentItemIndex]->name()); - - m_ui.defaultCombo->setItemText(currentItemIndex, m_versions[currentItemIndex]->name()); + writeVersionsIntoSettings(); } -void QtDirWidget::finish() -{ - if (QTreeWidgetItem *item = m_ui.qtdirList->currentItem()) - fixQtVersionName(m_ui.qtdirList->indexOfTopLevelItem(item)); -} - -/* Checks that the qt version name is unique - * and otherwise changes the name - * - */ -void QtDirWidget::fixQtVersionName(int index) -{ - int count = m_versions.count(); - for (int i = 0; i < count; ++i) { - if (i != index) { - if (m_versions.at(i)->name() == m_versions.at(index)->name()) { - // Same name, find new name - QString name = m_versions.at(index)->name(); - QRegExp regexp("^(.*)\\((\\d)\\)$"); - if (regexp.exactMatch(name)) { - // Alreay in Name (#) format - name = regexp.cap(1) + "(" + QString().setNum(regexp.cap(2).toInt() + 1) + ")"; - } else { - name = name + " (2)"; - } - // set new name - m_versions[index]->setName(name); - m_ui.qtdirList->topLevelItem(index)->setText(0, name); - m_ui.defaultCombo->setItemText(index, name); - - // Now check again... - fixQtVersionName(index); - } - } - } -} - -void QtDirWidget::updateCurrentQtPath() -{ - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - Q_ASSERT(currentItem); - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - if (m_versions[currentItemIndex]->path() == m_ui.qtPath->path()) - return; - m_versions[currentItemIndex]->setPath(m_ui.qtPath->path()); - currentItem->setText(1, QDir::toNativeSeparators(m_versions[currentItemIndex]->path())); - - showEnvironmentPage(currentItem); - - if (m_versions[currentItemIndex]->isValid()) { - bool hasLog = !currentItem->data(2, Qt::UserRole).toString().isEmpty(); - bool hasHelper = m_versions[currentItemIndex]->hasDebuggingHelper(); - if (hasHelper) { - currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/ok.png")); - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); - } else { - currentItem->setData(2, Qt::DecorationRole, QIcon(":/extensionsystem/images/error.png")); - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); - } - m_ui.showLogButton->setEnabled(hasLog); - } else { - currentItem->setData(2, Qt::DecorationRole, QIcon()); - m_ui.debuggingHelperStateLabel->setPixmap(QPixmap()); - } -} - -void QtDirWidget::updateCurrentMingwDirectory() -{ - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - Q_ASSERT(currentItem); - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - m_versions[currentItemIndex]->setMingwDirectory(m_ui.mingwPath->path()); -} - -void QtDirWidget::msvcVersionChanged() -{ - const QString &msvcVersion = m_ui.msvcComboBox->currentText(); - QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); - Q_ASSERT(currentItem); - int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); - m_versions[currentItemIndex]->setMsvcVersion(msvcVersion); -} - -QList QtDirWidget::versions() const -{ - return m_versions; -} - -int QtDirWidget::defaultVersion() const -{ - return m_defaultVersion; -} /// /// QtVersion @@ -918,7 +476,6 @@ void QtVersion::updateSourcePath() // QtVersion *QtVersionManager::qtVersionForDirectory(const QString directory); QString QtVersionManager::findQtVersionFromMakefile(const QString &directory) { - QString result = QString::null; bool debugAdding = false; QFile makefile(directory + "/Makefile" ); if (makefile.exists() && makefile.open(QFile::ReadOnly)) { @@ -934,14 +491,12 @@ QString QtVersionManager::findQtVersionFromMakefile(const QString &directory) QString qtDir = binDir.absolutePath(); if (debugAdding) qDebug() << "#~~ QtDir:"<getObject(); - return vm->getUniqueId(); + return QtVersionManager::instance()->getUniqueId(); } bool QtVersion::isValid() const diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/projectexplorer/qtversionmanager.h similarity index 69% rename from src/plugins/qt4projectmanager/qtversionmanager.h rename to src/plugins/projectexplorer/qtversionmanager.h index 867f24875ed..990214769fb 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/projectexplorer/qtversionmanager.h @@ -30,24 +30,22 @@ #ifndef QTVERSIONMANAGER_H #define QTVERSIONMANAGER_H -#include "ui_qtversionmanager.h" +#include "environment.h" +#include "toolchain.h" +#include "projectexplorer_export.h" -#include -#include -#include +#include -#include -#include -#include +namespace ProjectExplorer { -namespace Qt4ProjectManager { namespace Internal { +class QtOptionsPageWidget; +class QtOptionsPage; +} -class QtDirWidget; - -class QtVersion +class PROJECTEXPLORER_EXPORT QtVersion { - friend class QtDirWidget; //for changing name and path + friend class Internal::QtOptionsPageWidget; //for changing name and path friend class QtVersionManager; public: QtVersion(const QString &name, const QString &path); @@ -74,12 +72,11 @@ public: QString mingwDirectory() const; void setMingwDirectory(const QString &directory); - QString prependPath() const; - void setPrependPath(const QString &string); QString msvcVersion() const; QString wincePlatform() const; void setMsvcVersion(const QString &version); void addToEnvironment(ProjectExplorer::Environment &env); + bool hasDebuggingHelper() const; // Builds a debugging library // returns the output of the commands @@ -98,6 +95,7 @@ public: QString dumperLibrary() const; private: static int getUniqueId(); + // Also used by QtOptionsPageWidget void setName(const QString &name); void setPath(const QString &path); void updateSourcePath(); @@ -126,87 +124,42 @@ private: bool m_hasDebuggingHelper; }; - -class QtDirWidget : public QWidget +class PROJECTEXPLORER_EXPORT QtVersionManager : public QObject { Q_OBJECT + // for getUniqueId(); + friend class QtVersion; + friend class Internal::QtOptionsPage; public: - QtDirWidget(QWidget *parent, QList versions, int defaultVersion); - ~QtDirWidget(); - QList versions() const; - int defaultVersion() const; - void finish(); - -private: - void showEnvironmentPage(QTreeWidgetItem * item); - void fixQtVersionName(int index); - int indexForWidget(QWidget *debuggingHelperWidget) const; - Ui::QtVersionManager m_ui; - QList m_versions; - int m_defaultVersion; - QString m_specifyNameString; - QString m_specifyPathString; - -private slots: - void versionChanged(QTreeWidgetItem *item, QTreeWidgetItem *old); - void addQtDir(); - void removeQtDir(); - void updateState(); - void makeMingwVisible(bool visible); - void onQtBrowsed(); - void onMingwBrowsed(); - void defaultChanged(int index); - void updateCurrentQtName(); - void updateCurrentQtPath(); - void updateCurrentMingwDirectory(); - void msvcVersionChanged(); - void buildDebuggingHelper(); - void showDebuggingBuildLog(); -}; - -class QtVersionManager : public Core::IOptionsPage -{ - Q_OBJECT - -public: + static QtVersionManager *instance(); QtVersionManager(); ~QtVersionManager(); - QString id() const; - QString trName() const; - QString category() const; - QString trCategory() const; - - QWidget *createPage(QWidget *parent); - void apply(); - void finish() { } - - void writeVersionsIntoSettings(); - QList versions() const; - QtVersion * version(int id) const; - QtVersion * currentQtVersion() const; + QtVersion *version(int id) const; + QtVersion *currentQtVersion() const; - // internal - int getUniqueId(); - - QtVersion::QmakeBuildConfig scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig); - QString findQtVersionFromMakefile(const QString &directory); QtVersion *qtVersionForDirectory(const QString &directory); - // Used by the projectloadwizard void addVersion(QtVersion *version); - + + // Static Methods // returns something like qmake4, qmake, qmake-qt4 or whatever distributions have chosen (used by QtVersion) static QStringList possibleQMakeCommands(); // return true if the qmake at qmakePath is qt4 (used by QtVersion) static QString qtVersionForQMake(const QString &qmakePath); + static QtVersion::QmakeBuildConfig scanMakefileForQmakeConfig(const QString &directory, QtVersion::QmakeBuildConfig defaultBuildConfig); + static QString findQtVersionFromMakefile(const QString &directory); signals: void defaultQtVersionChanged(); void qtVersionsChanged(); private: - + // Used by QtOptionsPage + void setNewQtVersions(QList newVersions, int newDefaultVersion); + // Used by QtVersion + int getUniqueId(); + void writeVersionsIntoSettings(); void addNewVersionsFromInstaller(); void updateSystemVersion(); void updateDocumentation(); @@ -214,8 +167,6 @@ private: static int indexOfVersionInList(const QtVersion * const version, const QList &list); void updateUniqueIdToIndexMap(); - QPointer m_widget; - QtVersion *m_emptyVersion; int m_defaultVersion; QList m_versions; @@ -223,7 +174,6 @@ private: int m_idcount; }; -} // namespace Internal -} // namespace Qt4ProjectManager +} // namespace ProjectExplorer #endif // QTVERSIONMANAGER_H diff --git a/src/plugins/qt4projectmanager/qtversionmanager.ui b/src/plugins/projectexplorer/qtversionmanager.ui similarity index 97% rename from src/plugins/qt4projectmanager/qtversionmanager.ui rename to src/plugins/projectexplorer/qtversionmanager.ui index 2dd168325ce..dd8b252299d 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.ui +++ b/src/plugins/projectexplorer/qtversionmanager.ui @@ -1,7 +1,7 @@ - Qt4ProjectManager::Internal::QtVersionManager - + ProjectExplorer::Internal::QtVersionManager + 0 diff --git a/src/plugins/qt4projectmanager/showbuildlog.ui b/src/plugins/projectexplorer/showbuildlog.ui similarity index 100% rename from src/plugins/qt4projectmanager/showbuildlog.ui rename to src/plugins/projectexplorer/showbuildlog.ui diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 95bdd4febfd..c3d9b595752 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -43,6 +43,7 @@ using ProjectExplorer::IBuildParserFactory; using ProjectExplorer::BuildParserInterface; using ProjectExplorer::Environment; +using ProjectExplorer::QtVersion; using ExtensionSystem::PluginManager; using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; @@ -64,7 +65,7 @@ MakeStep::~MakeStep() m_buildParser = 0; } -ProjectExplorer::BuildParserInterface *MakeStep::buildParser(const QtVersion * const version) +ProjectExplorer::BuildParserInterface *MakeStep::buildParser(const QtVersion *const version) { QString buildParser; ProjectExplorer::ToolChain::ToolChainType type = version->toolchainType(); diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h index e59711786c3..91af6a69eca 100644 --- a/src/plugins/qt4projectmanager/makestep.h +++ b/src/plugins/qt4projectmanager/makestep.h @@ -30,16 +30,17 @@ #ifndef MAKESTEP_H #define MAKESTEP_H -#include "qtversionmanager.h" #include "ui_makestep.h" #include #include +#include namespace ProjectExplorer { class BuildStep; class IBuildStepFactory; class Project; +class QtVersion; } namespace Qt4ProjectManager { @@ -81,7 +82,7 @@ private slots: void addDirectory(const QString &dir); void removeDirectory(const QString &dir); private: - ProjectExplorer::BuildParserInterface *buildParser(const Internal::QtVersion * const version); + ProjectExplorer::BuildParserInterface *buildParser(const ProjectExplorer::QtVersion *const version); Qt4Project *m_project; ProjectExplorer::BuildParserInterface *m_buildParser; bool m_skipMakeClean; diff --git a/src/plugins/qt4projectmanager/profilereader.cpp b/src/plugins/qt4projectmanager/profilereader.cpp index 32b600cd288..109a3ffd918 100644 --- a/src/plugins/qt4projectmanager/profilereader.cpp +++ b/src/plugins/qt4projectmanager/profilereader.cpp @@ -35,6 +35,8 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::QtVersion; + ProFileReader::ProFileReader() { } diff --git a/src/plugins/qt4projectmanager/profilereader.h b/src/plugins/qt4projectmanager/profilereader.h index eef60c5d153..79833c02dff 100644 --- a/src/plugins/qt4projectmanager/profilereader.h +++ b/src/plugins/qt4projectmanager/profilereader.h @@ -31,7 +31,7 @@ #define PROFILEREADER_H #include "profileevaluator.h" -#include "qtversionmanager.h" +#include #include #include @@ -39,7 +39,6 @@ namespace Qt4ProjectManager { namespace Internal { - class ProFileReader : public QObject, public ProFileEvaluator { Q_OBJECT @@ -48,7 +47,7 @@ public: ProFileReader(); ~ProFileReader(); - void setQtVersion(QtVersion *qtVersion); + void setQtVersion(ProjectExplorer::QtVersion *qtVersion); bool readProFile(const QString &fileName); QList includeFiles() const; diff --git a/src/plugins/qt4projectmanager/projectloadwizard.cpp b/src/plugins/qt4projectmanager/projectloadwizard.cpp index acd6c764124..31c0da2cde1 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.cpp +++ b/src/plugins/qt4projectmanager/projectloadwizard.cpp @@ -34,6 +34,8 @@ #include "qmakestep.h" #include "makestep.h" +#include + #include #include #include @@ -43,12 +45,14 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::QtVersion; + ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::WindowFlags flags) : QWizard(parent, flags), m_project(project), m_importVersion(0), m_temporaryVersion(false) { - QtVersionManager * vm = project->qt4ProjectManager()->versionManager(); + ProjectExplorer::QtVersionManager * vm = ProjectExplorer::QtVersionManager::instance(); QString directory = QFileInfo(project->file()->fileName()).absolutePath(); - QString importVersion = vm->findQtVersionFromMakefile(directory); + QString importVersion = ProjectExplorer::QtVersionManager::findQtVersionFromMakefile(directory); if (!importVersion.isNull()) { // This also means we have a build in there @@ -61,7 +65,7 @@ ProjectLoadWizard::ProjectLoadWizard(Qt4Project *project, QWidget *parent, Qt::W } m_importBuildConfig = m_importVersion->defaultBuildConfig(); - m_importBuildConfig= vm->scanMakefileForQmakeConfig(directory, m_importBuildConfig); + m_importBuildConfig= ProjectExplorer::QtVersionManager::scanMakefileForQmakeConfig(directory, m_importBuildConfig); } // So now we have the version and the configuration for that version @@ -125,6 +129,7 @@ void ProjectLoadWizard::addBuildConfiguration(QString name, QtVersion *qtversion void ProjectLoadWizard::done(int result) { + ProjectExplorer::QtVersionManager *vm = ProjectExplorer::QtVersionManager::instance(); QWizard::done(result); // This normally happens on showing the final page, but since we // don't show it anymore, do it here @@ -133,7 +138,7 @@ void ProjectLoadWizard::done(int result) if (m_importVersion && importCheckbox->isChecked()) { // Importing if (m_temporaryVersion) - m_project->qt4ProjectManager()->versionManager()->addVersion(m_importVersion); + vm->addVersion(m_importVersion); // Import the existing stuff // qDebug()<<"Creating m_buildconfiguration entry from imported stuff"; // qDebug()<<((m_importBuildConfig& QtVersion::BuildAll)? "debug_and_release" : "")<<((m_importBuildConfig & QtVersion::DebugBuild)? "debug" : "release"); @@ -156,7 +161,7 @@ void ProjectLoadWizard::done(int result) delete m_importVersion; // Create default bool buildAll = false; - QtVersion *defaultVersion = m_project->qt4ProjectManager()->versionManager()->version(0); + QtVersion *defaultVersion = vm->version(0); if (defaultVersion && defaultVersion->isValid() && (defaultVersion->defaultBuildConfig() & QtVersion::BuildAll)) buildAll = true; if (buildAll) { diff --git a/src/plugins/qt4projectmanager/projectloadwizard.h b/src/plugins/qt4projectmanager/projectloadwizard.h index b6d886fe150..add96b6e7a9 100644 --- a/src/plugins/qt4projectmanager/projectloadwizard.h +++ b/src/plugins/qt4projectmanager/projectloadwizard.h @@ -30,7 +30,7 @@ #ifndef PROJECTLOADWIZARD_H #define PROJECTLOADWIZARD_H -#include "qtversionmanager.h" +#include #include @@ -57,14 +57,14 @@ public: void execDialog(); private: - void addBuildConfiguration(QString name, QtVersion *qtversion, QtVersion::QmakeBuildConfig buildConfiguration); - void setupImportPage(QtVersion *version, QtVersion::QmakeBuildConfig buildConfig); + void addBuildConfiguration(QString name, ProjectExplorer::QtVersion *qtversion, ProjectExplorer::QtVersion::QmakeBuildConfig buildConfiguration); + void setupImportPage(ProjectExplorer::QtVersion *version, ProjectExplorer::QtVersion::QmakeBuildConfig buildConfig); Qt4Project *m_project; // Only used for imported stuff - QtVersion *m_importVersion; - QtVersion::QmakeBuildConfig m_importBuildConfig; + ProjectExplorer::QtVersion *m_importVersion; + ProjectExplorer::QtVersion::QmakeBuildConfig m_importBuildConfig; // Those that we might add bool m_temporaryVersion; diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index 514feb9f371..b333016c0eb 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -33,10 +33,10 @@ #include "qt4projectmanagerconstants.h" #include "qt4projectmanager.h" #include "makestep.h" -#include "qtversionmanager.h" #include #include +#include #include #include diff --git a/src/plugins/qt4projectmanager/qt4nodes.cpp b/src/plugins/qt4projectmanager/qt4nodes.cpp index 66c32661c35..ac790dbfa10 100644 --- a/src/plugins/qt4projectmanager/qt4nodes.cpp +++ b/src/plugins/qt4projectmanager/qt4nodes.cpp @@ -64,6 +64,7 @@ using namespace Qt4ProjectManager; using namespace Qt4ProjectManager::Internal; +using ProjectExplorer::QtVersion; namespace { bool debug = false; diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index ee4b5da2693..a97303cf323 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -36,7 +36,6 @@ #include "qmakestep.h" #include "deployhelper.h" #include "qt4runconfiguration.h" -#include "qtversionmanager.h" #include "qt4nodes.h" #include "qt4projectconfigwidget.h" #include "qt4buildenvironmentwidget.h" @@ -51,6 +50,7 @@ #include #include #include +#include #include #include @@ -236,9 +236,11 @@ Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) : { m_manager->registerProject(this); - connect(qt4ProjectManager()->versionManager(), SIGNAL(defaultQtVersionChanged()), + ProjectExplorer::QtVersionManager *vm = ProjectExplorer::QtVersionManager::instance(); + + connect(vm, SIGNAL(defaultQtVersionChanged()), this, SLOT(defaultQtVersionChanged())); - connect(qt4ProjectManager()->versionManager(), SIGNAL(qtVersionsChanged()), + connect(vm, SIGNAL(qtVersionsChanged()), this, SLOT(qtVersionsChanged())); m_updateCodeModelTimer.setSingleShot(true); @@ -266,8 +268,9 @@ void Qt4Project::defaultQtVersionChanged() void Qt4Project::qtVersionsChanged() { + QtVersionManager *vm = QtVersionManager::instance(); foreach (QString bc, buildConfigurations()) { - if (!qt4ProjectManager()->versionManager()->version(qtVersionId(bc))->isValid()) { + if (!vm->version(qtVersionId(bc))->isValid()) { setQtVersion(bc, 0); if (bc == activeBuildConfiguration()) m_rootProjectNode->update(); @@ -740,18 +743,19 @@ QString Qt4Project::qtDir(const QString &buildConfiguration) const QtVersion *Qt4Project::qtVersion(const QString &buildConfiguration) const { - return m_manager->versionManager()->version(qtVersionId(buildConfiguration)); + return QtVersionManager::instance()->version(qtVersionId(buildConfiguration)); } int Qt4Project::qtVersionId(const QString &buildConfiguration) const { + QtVersionManager *vm = QtVersionManager::instance(); if (debug) qDebug()<<"Looking for qtVersion ID of "<versionManager()->version(id)->isValid()) { + if (vm->version(id)->isValid()) { return id; } else { const_cast(this)->setValue(buildConfiguration, "QtVersionId", 0); @@ -763,7 +767,7 @@ int Qt4Project::qtVersionId(const QString &buildConfiguration) const if (debug) qDebug()<<" Backward compatibility reading QtVersion"< &versions = m_manager->versionManager()->versions(); + const QList &versions = vm->versions(); foreach (const QtVersion * const version, versions) { if (version->name() == vname) { if (debug) diff --git a/src/plugins/qt4projectmanager/qt4project.h b/src/plugins/qt4projectmanager/qt4project.h index 3351d148134..c27be2be3fb 100644 --- a/src/plugins/qt4projectmanager/qt4project.h +++ b/src/plugins/qt4projectmanager/qt4project.h @@ -30,7 +30,6 @@ #ifndef QT4PROJECT_H #define QT4PROJECT_H -#include "qtversionmanager.h" #include "qt4nodes.h" #include "qmakestep.h" #include "makestep.h" @@ -39,6 +38,7 @@ #include #include #include +#include #include #include @@ -148,7 +148,7 @@ public: //returns the qtVersion, if the project is set to use the default qt version, then // that is returned // to check wheter the project uses the default qt version use qtVersionId - Internal::QtVersion *qtVersion(const QString &buildConfiguration) const; + ProjectExplorer::QtVersion *qtVersion(const QString &buildConfiguration) const; // returns the id of the qt version, if the project is using the default qt version // this function returns 0 diff --git a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp index ee217479507..a50d23bd98c 100644 --- a/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4projectconfigwidget.cpp @@ -38,9 +38,14 @@ #include #include +#include +#include #include +using ProjectExplorer::QtVersionManager; +using ProjectExplorer::QtVersion; + namespace { bool debug = false; } @@ -79,7 +84,9 @@ Qt4ProjectConfigWidget::Qt4ProjectConfigWidget(Qt4Project *project) connect(m_ui->manageQtVersionPushButtons, SIGNAL(clicked()), this, SLOT(manageQtVersions())); - connect(m_pro->qt4ProjectManager()->versionManager(), SIGNAL(qtVersionsChanged()), + ProjectExplorer::QtVersionManager *vm = ProjectExplorer::QtVersionManager::instance(); + + connect(vm, SIGNAL(qtVersionsChanged()), this, SLOT(setupQtVersionsComboBox())); } @@ -91,7 +98,7 @@ Qt4ProjectConfigWidget::~Qt4ProjectConfigWidget() void Qt4ProjectConfigWidget::manageQtVersions() { Core::ICore *core = Core::ICore::instance(); - core->showOptionsDialog(Constants::QT_CATEGORY, Constants::QTVERSION_PAGE); + core->showOptionsDialog(ProjectExplorer::Constants::QT_CATEGORY, ProjectExplorer::Constants::QTVERSION_PAGE); } @@ -139,7 +146,7 @@ void Qt4ProjectConfigWidget::setupQtVersionsComboBox() m_ui->invalidQtWarningLabel->setVisible(false); } // Add Qt Versions to the combo box - QtVersionManager *vm = m_pro->qt4ProjectManager()->versionManager(); + QtVersionManager *vm = QtVersionManager::instance(); const QList &versions = vm->versions(); for (int i = 0; i < versions.size(); ++i) { m_ui->qtVersionComboBox->addItem(versions.at(i)->name(), versions.at(i)->uniqueId()); @@ -177,7 +184,7 @@ void Qt4ProjectConfigWidget::updateImportLabel() { m_ui->importLabel->setVisible(false); if (m_ui->shadowBuildCheckBox->isChecked()) { - QString qtPath = m_pro->qt4ProjectManager()->versionManager()->findQtVersionFromMakefile(m_ui->shadowBuildDirEdit->path()); + QString qtPath = ProjectExplorer::QtVersionManager::findQtVersionFromMakefile(m_ui->shadowBuildDirEdit->path()); if (!qtPath.isEmpty()) { m_ui->importLabel->setVisible(true); } @@ -211,16 +218,16 @@ void Qt4ProjectConfigWidget::importLabelClicked() if (m_ui->shadowBuildCheckBox->isChecked()) { QString directory = m_ui->shadowBuildDirEdit->path(); if (!directory.isEmpty()) { - QtVersionManager *vm = m_pro->qt4ProjectManager()->versionManager(); - QString qtPath = vm->findQtVersionFromMakefile(directory); + QString qtPath = QtVersionManager::findQtVersionFromMakefile(directory); if (!qtPath.isEmpty()) { + QtVersionManager *vm = QtVersionManager::instance(); QtVersion *version = vm->qtVersionForDirectory(qtPath); if (!version) { version = new QtVersion(QFileInfo(qtPath).baseName(), qtPath); vm->addVersion(version); } QtVersion::QmakeBuildConfig qmakeBuildConfig = version->defaultBuildConfig(); - qmakeBuildConfig = vm->scanMakefileForQmakeConfig(directory, qmakeBuildConfig); + qmakeBuildConfig = QtVersionManager::scanMakefileForQmakeConfig(directory, qmakeBuildConfig); // So we got all the information now apply it... m_pro->setQtVersion(m_buildConfiguration, version->uniqueId()); @@ -261,7 +268,8 @@ void Qt4ProjectConfigWidget::qtVersionComboBoxCurrentIndexChanged(const QString } else { newQtVersion = m_ui->qtVersionComboBox->itemData(m_ui->qtVersionComboBox->currentIndex()).toInt(); } - bool isValid = m_pro->qt4ProjectManager()->versionManager()->version(newQtVersion)->isValid(); + ProjectExplorer::QtVersionManager *vm = ProjectExplorer::QtVersionManager::instance(); + bool isValid = vm->version(newQtVersion)->isValid(); m_ui->invalidQtWarningLabel->setVisible(!isValid); if (newQtVersion != m_pro->qtVersionId(m_buildConfiguration)) { m_pro->setQtVersion(m_buildConfiguration, newQtVersion); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.cpp b/src/plugins/qt4projectmanager/qt4projectmanager.cpp index 0f460242b11..697deb5025c 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanager.cpp @@ -34,7 +34,6 @@ #include "qt4nodes.h" #include "qt4project.h" #include "profilereader.h" -#include "qtversionmanager.h" #include "qmakestep.h" #include @@ -47,6 +46,7 @@ #include #include #include +#include #include #include @@ -68,6 +68,8 @@ using ProjectExplorer::SourceType; using ProjectExplorer::FormType; using ProjectExplorer::ResourceType; using ProjectExplorer::UnknownFileType; +using ProjectExplorer::QtVersion; +using ProjectExplorer::QtVersionManager; // Known file types of a Qt 4 project static const char* qt4FileTypes[] = { @@ -187,11 +189,6 @@ ProjectExplorer::Project *Qt4Manager::contextProject() const return m_contextProject; } -QtVersionManager *Qt4Manager::versionManager() const -{ - return m_plugin->versionManager(); -} - void Qt4Manager::runQMake() { runQMake(m_projectExplorer->currentProject()); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.h b/src/plugins/qt4projectmanager/qt4projectmanager.h index d33c5b4b740..43b64937cfe 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.h +++ b/src/plugins/qt4projectmanager/qt4projectmanager.h @@ -43,6 +43,7 @@ class PluginManager; namespace ProjectExplorer { class Project; class ProjectExplorerPlugin; +class QtVersionManager; } namespace Qt4ProjectManager { @@ -51,7 +52,6 @@ namespace Internal { class Qt4Builder; class ProFileEditor; class Qt4ProjectManagerPlugin; -class QtVersionManager; } class Qt4Project; @@ -85,8 +85,6 @@ public: void setContextProject(ProjectExplorer::Project *project); ProjectExplorer::Project *contextProject() const; - Internal::QtVersionManager *versionManager() const; - // Return the id string of a file static QString fileTypeId(ProjectExplorer::FileType type); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 7f5bf334f38..d471edb8cc0 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -5,7 +5,6 @@ include(../../qworkbenchplugin.pri) include(qt4projectmanager_dependencies.pri) HEADERS = qt4projectmanagerplugin.h \ qt4projectmanager.h \ - qtversionmanager.h \ qt4project.h \ qt4nodes.h \ profileeditor.h \ @@ -36,7 +35,6 @@ HEADERS = qt4projectmanagerplugin.h \ projectloadwizard.h SOURCES = qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ - qtversionmanager.cpp \ qt4project.cpp \ qt4nodes.cpp \ profileeditor.cpp \ @@ -63,17 +61,17 @@ SOURCES = qt4projectmanagerplugin.cpp \ qt4projectconfigwidget.cpp \ qt4buildenvironmentwidget.cpp \ projectloadwizard.cpp -FORMS = qtversionmanager.ui \ - envvariablespage.ui \ +FORMS = envvariablespage.ui \ enveditdialog.ui \ proeditorcontainer.ui \ makestep.ui \ qmakestep.ui \ qt4projectconfigwidget.ui \ embeddedpropertiespage.ui \ - qt4buildenvironmentwidget.ui \ - showbuildlog.ui + qt4buildenvironmentwidget.ui RESOURCES = qt4projectmanager.qrc \ wizards/wizards.qrc include(../../shared/proparser/proparser.pri) DEFINES += QT_NO_CAST_TO_ASCII + +OTHER_FILES += Qt4ProjectManager.pluginspec diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 14f77bdbbb6..5da496dde9c 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -37,11 +37,6 @@ namespace Constants { const char * const C_PROFILEEDITOR = ".pro File Editor"; const char * const C_PROFILEEDITOR_PANEL = ".pro File Editor (embedded)"; -//settings pages -const char * const QT_CATEGORY = "Qt4"; -const char * const QTVERSION_PAGE = "Qt Versions"; -const char * const BUILD_ENVIRONMENT_PAGE = "Build Environments"; - // kinds const char * const PROJECT_KIND = "Qt4"; const char * const PROFILE_EDITOR = ".pro File Editor"; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index fa43c9133bb..22db266f46c 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -36,7 +36,6 @@ #include "profileeditorfactory.h" #include "qt4projectmanagerconstants.h" #include "qt4project.h" -#include "qtversionmanager.h" #include "embeddedpropertiespage.h" #include "qt4runconfiguration.h" #include "profilereader.h" @@ -48,6 +47,7 @@ #include #include #include +#include #include #include #include @@ -64,15 +64,13 @@ using namespace Qt4ProjectManager::Internal; using namespace Qt4ProjectManager; using ProjectExplorer::Project; +using ProjectExplorer::QtVersionManager; Qt4ProjectManagerPlugin::~Qt4ProjectManagerPlugin() { //removeObject(m_embeddedPropertiesPage); //delete m_embeddedPropertiesPage; - removeObject(m_qtVersionManager); - delete m_qtVersionManager; - removeObject(m_proFileEditorFactory); delete m_proFileEditorFactory; removeObject(m_qt4ProjectManager); @@ -124,9 +122,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new QMakeStepFactory); addAutoReleasedObject(new MakeStepFactory); - m_qtVersionManager = new QtVersionManager; - addObject(m_qtVersionManager); - addAutoReleasedObject(new Qt4RunConfigurationFactory); addAutoReleasedObject(new Qt4RunConfigurationFactoryUser); @@ -190,11 +185,6 @@ void Qt4ProjectManagerPlugin::updateContextMenu(Project *project, } } -QtVersionManager *Qt4ProjectManagerPlugin::versionManager() const -{ - return m_qtVersionManager; -} - void Qt4ProjectManagerPlugin::currentProjectChanged() { m_runQMakeAction->setEnabled(!m_projectExplorer->buildManager()->isBuilding(m_projectExplorer->currentProject())); diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h index a274d531fd5..7dce30081e9 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h @@ -33,6 +33,10 @@ #include #include +namespace ProjectExplorer { + class QtVersionManager; +} + namespace Qt4ProjectManager { class Qt4Manager; @@ -46,7 +50,6 @@ class QMakeStepFactory; class MakeStepFactory; class GccParserFactory; class MsvcParserFactory; -class QtVersionManager; class EmbeddedPropertiesPage; class Qt4ProjectManagerPlugin : public ExtensionSystem::IPlugin @@ -59,8 +62,6 @@ public: void extensionsInitialized(); int projectContext() const { return m_projectContext; } - QtVersionManager *versionManager() const; - private slots: void updateContextMenu(ProjectExplorer::Project *project, @@ -77,8 +78,6 @@ private: ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer; ProFileEditorFactory *m_proFileEditorFactory; Qt4Manager *m_qt4ProjectManager; - QtVersionManager *m_qtVersionManager; - EmbeddedPropertiesPage *m_embeddedPropertiesPage; int m_projectContext; diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index 7cb7578cb79..3741b8a20fc 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -51,6 +51,7 @@ using namespace Qt4ProjectManager; using ProjectExplorer::ApplicationRunConfiguration; using ProjectExplorer::PersistentSettingsReader; using ProjectExplorer::PersistentSettingsWriter; +using ProjectExplorer::QtVersion; Qt4RunConfiguration::Qt4RunConfiguration(Qt4Project *pro, const QString &proFilePath) : ApplicationRunConfiguration(pro), diff --git a/src/plugins/quickopen/quickopen.pro b/src/plugins/quickopen/quickopen.pro index dbacef6df53..f5a7dd9ce01 100644 --- a/src/plugins/quickopen/quickopen.pro +++ b/src/plugins/quickopen/quickopen.pro @@ -29,3 +29,5 @@ FORMS += settingspage.ui \ filesystemfilter.ui \ directoryfilter.ui RESOURCES += quickopen.qrc + +OTHER_FILES += QuickOpen.pluginspec diff --git a/src/plugins/resourceeditor/resourceeditor.pro b/src/plugins/resourceeditor/resourceeditor.pro index 5df0d635e57..c90cafffe53 100644 --- a/src/plugins/resourceeditor/resourceeditor.pro +++ b/src/plugins/resourceeditor/resourceeditor.pro @@ -22,3 +22,5 @@ resourcewizard.cpp \ resourceeditorw.cpp RESOURCES += resourceeditor.qrc + +OTHER_FILES += ResourceEditor.pluginspec diff --git a/src/plugins/subversion/subversion.pro b/src/plugins/subversion/subversion.pro index 993d22eb6a3..270693347c3 100644 --- a/src/plugins/subversion/subversion.pro +++ b/src/plugins/subversion/subversion.pro @@ -29,3 +29,5 @@ SOURCES += annotationhighlighter.cpp \ FORMS += settingspage.ui RESOURCES += subversion.qrc + +OTHER_FILES += Subversion.pluginspec diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp index 76df5c71d18..e821bce1239 100644 --- a/src/plugins/texteditor/basetexteditor.cpp +++ b/src/plugins/texteditor/basetexteditor.cpp @@ -188,6 +188,10 @@ BaseTextEditor::BaseTextEditor(QWidget *parent) d->m_parenthesesMatchingTimer->setSingleShot(true); connect(d->m_parenthesesMatchingTimer, SIGNAL(timeout()), this, SLOT(_q_matchParentheses())); + d->m_highlightBlocksTimer = new QTimer(this); + d->m_highlightBlocksTimer->setSingleShot(true); + connect(d->m_highlightBlocksTimer, SIGNAL(timeout()), this, SLOT(_q_highlightBlocks())); + d->m_searchResultFormat.setBackground(QColor(0xffef0b)); @@ -429,6 +433,23 @@ bool DocumentMarker::addMark(TextEditor::ITextMark *mark, int line) return false; } +int BaseTextEditorPrivate::visualIndent(const QTextBlock &block) const +{ + if (!block.isValid()) + return 0; + const QTextDocument *document = block.document(); + int i = 0; + while (i < block.length()) { + if (!document->characterAt(block.position() + i).isSpace()) { + QTextCursor cursor(block); + cursor.setPosition(block.position() + i); + return q->cursorRect(cursor).x(); + } + ++i; + } + + return 0; +} TextEditor::TextMarks DocumentMarker::marksAt(int line) const { @@ -693,7 +714,10 @@ void BaseTextEditor::moveLineUpDown(bool up) { QTextCursor cursor = textCursor(); QTextCursor move = cursor; - move.beginEditBlock(); + if (d->m_moveLineUndoHack) + move.joinPreviousEditBlock(); + else + move.beginEditBlock(); bool hasSelection = cursor.hasSelection(); @@ -701,7 +725,7 @@ void BaseTextEditor::moveLineUpDown(bool up) move.setPosition(cursor.selectionStart()); move.movePosition(QTextCursor::StartOfBlock); move.setPosition(cursor.selectionEnd(), QTextCursor::KeepAnchor); - move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); + move.movePosition(move.atBlockStart() ? QTextCursor::Left: QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); } else { move.movePosition(QTextCursor::StartOfBlock); move.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); @@ -739,6 +763,7 @@ void BaseTextEditor::moveLineUpDown(bool up) move.endEditBlock(); setTextCursor(move); + d->m_moveLineUndoHack = true; } void BaseTextEditor::cleanWhitespace() @@ -748,6 +773,7 @@ void BaseTextEditor::cleanWhitespace() void BaseTextEditor::keyPressEvent(QKeyEvent *e) { + d->m_moveLineUndoHack = false; d->clearVisibleCollapsedBlock(); QKeyEvent *original_e = e; @@ -1034,10 +1060,7 @@ bool BaseTextEditor::event(QEvent *e) d->m_contentsChanged = false; switch (e->type()) { case QEvent::ShortcutOverride: - if (static_cast(e)->key() == Qt::Key_Backspace) - e->accept(); - else - e->ignore(); // we are a really nice citizen + e->ignore(); // we are a really nice citizen return true; default: break; @@ -1201,8 +1224,11 @@ bool BaseTextEditor::lineSeparatorsAllowed() const void BaseTextEditor::setHighlightBlocks(bool b) { - d->m_highlightBlocks = b & d->m_codeFoldingSupported; - viewport()->update(); + if (d->m_highlightBlocks == b) + return; + d->m_highlightBlocks = b; + d->m_highlightBlocksInfo = BaseTextEditorPrivateHighlightBlocks(); + _q_highlightBlocks(); } bool BaseTextEditor::highlightBlocks() const @@ -1284,7 +1310,8 @@ BaseTextEditorPrivate::BaseTextEditorPrivate() m_actionHack(0), m_inBlockSelectionMode(false), m_lastEventWasBlockSelectionEvent(false), - m_blockSelectionExtraX(0) + m_blockSelectionExtraX(0), + m_moveLineUndoHack(false) { } @@ -1719,11 +1746,11 @@ void BaseTextEditor::paintEvent(QPaintEvent *e) painter.fillRect(QRectF(lineX, 0, viewportRect.width() - lineX, viewportRect.height()), blendColor); } - // keep right margin clean from full-width selection - int maxX = offset.x() + qMax((qreal)viewportRect.width(), documentLayout->documentSize().width()) - - doc->documentMargin(); - er.setRight(qMin(er.right(), maxX)); - painter.setClipRect(er); +// // keep right margin clean from full-width selection +// int maxX = offset.x() + qMax((qreal)viewportRect.width(), documentLayout->documentSize().width()) +// - doc->documentMargin(); +// er.setRight(qMin(er.right(), maxX)); +// painter.setClipRect(er); bool editable = !isReadOnly(); @@ -1758,22 +1785,30 @@ void BaseTextEditor::paintEvent(QPaintEvent *e) QTextBlock visibleCollapsedBlock; QPointF visibleCollapsedBlockOffset; + + while (block.isValid()) { QRectF r = blockBoundingRect(block).translated(offset); if (d->m_highlightBlocks) { - QTextBlock previousBlock = block.previous(); - if (previousBlock.isValid()){ - int thisBraceDepth = block.userState(); - if (thisBraceDepth >= 0) - thisBraceDepth >>= 8; - int braceDepth = block.previous().userState(); - if (braceDepth >= 0) - braceDepth >>= 8; - int minBraceDepth = qMin(thisBraceDepth, braceDepth); - if (minBraceDepth > 0) { - painter.fillRect(r, calcBlendColor(baseColor, minBraceDepth)); + + int n = block.blockNumber(); + int depth = 0; + foreach (int i, d->m_highlightBlocksInfo.open) + if (n >= i) + ++depth; + foreach (int i, d->m_highlightBlocksInfo.close) + if (n > i) + --depth; + + int count = d->m_highlightBlocksInfo.visualIndent.size(); + if (count) { + QRectF rr = r; + rr.setWidth(viewport()->width()); + for(int i = 0; i <= depth; ++i) { + int vi = i > 0 ? d->m_highlightBlocksInfo.visualIndent.at(i-1) : 0; + painter.fillRect(rr.adjusted(vi, 0, -8*i, 0), calcBlendColor(baseColor, count - i)); } } } @@ -1817,7 +1852,7 @@ void BaseTextEditor::paintEvent(QPaintEvent *e) else selections.append(o); } else if (!range.cursor.hasSelection() && range.format.hasProperty(QTextFormat::FullWidthSelection) - && block.contains(range.cursor.position())) { + && block.contains(range.cursor.position())) { // for full width selections we don't require an actual selection, just // a position to specify the line. that's more convenience in usage. QTextLayout::FormatRange o; @@ -1884,7 +1919,6 @@ void BaseTextEditor::paintEvent(QPaintEvent *e) // invisible blocks do have zero line count block = doc->findBlockByLineNumber(block.firstLineNumber()); } - } if (backgroundVisible() && !block.isValid() && offset.y() <= er.bottom() @@ -2393,6 +2427,10 @@ void BaseTextEditor::slotCursorPositionChanged() } setExtraSelections(CurrentLineSelection, extraSelections); + + if (d->m_highlightBlocks) { + d->m_highlightBlocksTimer->start(100); + } } void BaseTextEditor::slotUpdateBlockNotify(const QTextBlock &block) @@ -3142,6 +3180,67 @@ bool TextBlockUserData::findNextClosingParenthesis(QTextCursor *cursor, bool sel return false; } +bool TextBlockUserData::findPreviousBlockOpenParenthesis(QTextCursor *cursor) +{ + QTextBlock block = cursor->block(); + int position = cursor->position(); + int ignore = 0; + while (block.isValid()) { + Parentheses parenList = TextEditDocumentLayout::parentheses(block); + if (!parenList.isEmpty() && !TextEditDocumentLayout::ifdefedOut(block)) { + for (int i = parenList.count()-1; i >= 0; --i) { + Parenthesis paren = parenList.at(i); + if (paren.chr != QLatin1Char('{') && paren.chr != QLatin1Char('}') + && paren.chr != QLatin1Char('+') && paren.chr != QLatin1Char('-')) + continue; + if (block == cursor->block() && + (position - block.position() <= paren.pos)) + continue; + if (paren.type == Parenthesis::Closed) { + ++ignore; + } else if (ignore > 0) { + --ignore; + } else { + cursor->setPosition(block.position() + paren.pos); + return true; + } + } + } + block = block.previous(); + } + return false; +} + +bool TextBlockUserData::findNextBlockClosingParenthesis(QTextCursor *cursor) +{ + QTextBlock block = cursor->block(); + int position = cursor->position(); + int ignore = 0; + while (block.isValid()) { + Parentheses parenList = TextEditDocumentLayout::parentheses(block); + if (!parenList.isEmpty() && !TextEditDocumentLayout::ifdefedOut(block)) { + for (int i = 0; i < parenList.count(); ++i) { + Parenthesis paren = parenList.at(i); + if (paren.chr != QLatin1Char('{') && paren.chr != QLatin1Char('}') + && paren.chr != QLatin1Char('+') && paren.chr != QLatin1Char('-')) + continue; + if (block == cursor->block() && position - block.position() >= paren.pos) + continue; + if (paren.type == Parenthesis::Opened) { + ++ignore; + } else if (ignore > 0) { + --ignore; + } else { + cursor->setPosition(block.position() + paren.pos+1); + return true; + } + } + } + block = block.next(); + } + return false; +} + TextBlockUserData::MatchType TextBlockUserData::matchCursorBackward(QTextCursor *cursor) { cursor->clearSelection(); @@ -3277,6 +3376,23 @@ void BaseTextEditor::_q_matchParentheses() setExtraSelections(ParenthesesMatchingSelection, extraSelections); } +void BaseTextEditor::_q_highlightBlocks() +{ + QTextCursor cursor = textCursor(); + QTextCursor closeCursor = cursor; + BaseTextEditorPrivateHighlightBlocks highlightBlocksInfo; + while (TextBlockUserData::findPreviousBlockOpenParenthesis(&cursor)) { + highlightBlocksInfo.open.prepend(cursor.blockNumber()); + highlightBlocksInfo.visualIndent.prepend(d->visualIndent(cursor.block())); + if (TextBlockUserData::findNextBlockClosingParenthesis(&closeCursor)) + highlightBlocksInfo.close.append(closeCursor.blockNumber()); + } + if (d->m_highlightBlocksInfo != highlightBlocksInfo) { + d->m_highlightBlocksInfo = highlightBlocksInfo; + viewport()->update(); + } +} + void BaseTextEditor::setActionHack(QObject *hack) { d->m_actionHack = hack; diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h index 19ce6b36799..f0669a71046 100644 --- a/src/plugins/texteditor/basetexteditor.h +++ b/src/plugins/texteditor/basetexteditor.h @@ -167,6 +167,9 @@ public: static bool findPreviousOpenParenthesis(QTextCursor *cursor, bool select = false); static bool findNextClosingParenthesis(QTextCursor *cursor, bool select = false); + static bool findPreviousBlockOpenParenthesis(QTextCursor *cursor); + static bool findNextBlockClosingParenthesis(QTextCursor *cursor); + private: TextMarks m_marks; @@ -464,6 +467,7 @@ private: // parentheses matcher private slots: void _q_matchParentheses(); + void _q_highlightBlocks(); void slotSelectionChanged(); }; diff --git a/src/plugins/texteditor/basetexteditor_p.h b/src/plugins/texteditor/basetexteditor_p.h index 74f158dab5e..844d3777689 100644 --- a/src/plugins/texteditor/basetexteditor_p.h +++ b/src/plugins/texteditor/basetexteditor_p.h @@ -114,6 +114,17 @@ private: //================BaseTextEditorPrivate============== +struct BaseTextEditorPrivateHighlightBlocks +{ + QList open; + QList close; + QList visualIndent; + inline bool operator==(const BaseTextEditorPrivateHighlightBlocks &o) const { + return (open == o.open && close == o.close && visualIndent == o.visualIndent); + } + inline bool operator!=(const BaseTextEditorPrivateHighlightBlocks &o) const { return !(*this == o); } +}; + class BaseTextEditorPrivate { BaseTextEditorPrivate(const BaseTextEditorPrivate &); @@ -214,11 +225,17 @@ public: void clearBlockSelection(); QString copyBlockSelection(); void removeBlockSelection(const QString &text = QString()); + bool m_moveLineUndoHack; QTextCursor m_findScope; QTextCursor m_selectBlockAnchor; void moveCursorVisible(bool ensureVisible = true); + + int visualIndent(const QTextBlock &block) const; + BaseTextEditorPrivateHighlightBlocks m_highlightBlocksInfo; + QTimer *m_highlightBlocksTimer; + }; } // namespace Internal diff --git a/src/plugins/texteditor/displaysettings.cpp b/src/plugins/texteditor/displaysettings.cpp index 47e9ad4d474..27480d3dcc5 100644 --- a/src/plugins/texteditor/displaysettings.cpp +++ b/src/plugins/texteditor/displaysettings.cpp @@ -39,9 +39,9 @@ static const char * const textWrappingKey = "TextWrapping"; static const char * const showWrapColumnKey = "ShowWrapColumn"; static const char * const wrapColumnKey = "WrapColumn"; static const char * const visualizeWhitespaceKey = "VisualizeWhitespace"; -static const char * const displayFoldingMarkersKey = "DisplayFoldingMarkers"; +static const char * const displayFoldingMarkersKey = "DisplayFoldingMarkersV2"; static const char * const highlightCurrentLineKey = "HighlightCurrentLineKey"; -static const char * const highlightBlocksKey = "HighlightBlocksKey"; +static const char * const highlightBlocksKey = "HighlightBlocksKeyV2"; static const char * const groupPostfix = "DisplaySettings"; namespace TextEditor { @@ -52,9 +52,9 @@ DisplaySettings::DisplaySettings() : m_showWrapColumn(false), m_wrapColumn(80), m_visualizeWhitespace(false), - m_displayFoldingMarkers(true), + m_displayFoldingMarkers(false), m_highlightCurrentLine(true), - m_highlightBlocks(false) + m_highlightBlocks(true) { } diff --git a/src/plugins/texteditor/texteditor.pro b/src/plugins/texteditor/texteditor.pro index 61f8477dd80..a16a898b1d7 100644 --- a/src/plugins/texteditor/texteditor.pro +++ b/src/plugins/texteditor/texteditor.pro @@ -59,3 +59,5 @@ FORMS += behaviorsettingspage.ui \ displaysettingspage.ui \ fontsettingspage.ui RESOURCES += texteditor.qrc + +OTHER_FILES += TextEditor.pluginspec diff --git a/src/plugins/vcsbase/vcsbase.pro b/src/plugins/vcsbase/vcsbase.pro index 58bbc0dd4e8..510dbf59826 100644 --- a/src/plugins/vcsbase/vcsbase.pro +++ b/src/plugins/vcsbase/vcsbase.pro @@ -37,3 +37,5 @@ RESOURCES += vcsbase.qrc FORMS += vcsbasesettingspage.ui \ nicknamedialog.ui + +OTHER_FILES += VCSBase.pluginspec