diff --git a/src/plugins/help/openedviewerswidget.cpp b/src/plugins/help/openedviewerswidget.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9661ed9f428948808ee859f26ca7e8cce9ebacbe --- /dev/null +++ b/src/plugins/help/openedviewerswidget.cpp @@ -0,0 +1,242 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (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 http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "openedviewerswidget.h" + +#include "centralwidget.h" +#include "helpviewer.h" + +#include <QtGui/QApplication> +#include <QtGui/QKeyEvent> +#include <QtGui/QMenu> +#include <QtGui/QPainter> + +#include <coreplugin/coreconstants.h> + +using namespace Help::Internal; + +OpenedViewersDelegate::OpenedViewersDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ +} + +void OpenedViewersDelegate::paint(QPainter *painter, + const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (option.state & QStyle::State_MouseOver) { + if ((QApplication::mouseButtons() & Qt::LeftButton) == 0) + pressedIndex = QModelIndex(); + + QBrush brush = option.palette.alternateBase(); + if (index == pressedIndex) + brush = option.palette.dark(); + + painter->fillRect(option.rect, brush); + } + + QStyledItemDelegate::paint(painter, option, index); + + if (index.column() == 1 && option.state & QStyle::State_MouseOver) { + QIcon icon((option.state & QStyle::State_Selected) + ? ":/core/images/closebutton.png" : ":/core/images/darkclosebutton.png"); + + QRect iconRect(option.rect.right() - option.rect.height(), + option.rect.top(), option.rect.height(), option.rect.height()); + + icon.paint(painter, iconRect, Qt::AlignRight | Qt::AlignVCenter); + } +} + + +// OpenedViewersWidget + + +OpenedViewersWidget::OpenedViewersWidget(QWidget *parent) + : QWidget(parent) + , m_delegate(new OpenedViewersDelegate(this)) +{ + m_ui.setupUi(this); + + setFocusProxy(m_ui.viewerList); + setWindowTitle(tr("Open Documents")); + setWindowIcon(QIcon(Core::Constants::ICON_DIR)); + + m_ui.viewerList->installEventFilter(this); + m_ui.viewerList->setItemDelegate(m_delegate); + m_ui.viewerList->viewport()->setAttribute(Qt::WA_Hover); + m_ui.viewerList->setContextMenuPolicy(Qt::CustomContextMenu); + m_ui.viewerList->setAttribute(Qt::WA_MacShowFocusRect, false); + + m_model = new QStandardItemModel(0, 2, this); + m_ui.viewerList->setModel(m_model); + + m_ui.viewerList->header()->setResizeMode(1, QHeaderView::Fixed); + m_ui.viewerList->header()->setResizeMode(0, QHeaderView::Stretch); + m_ui.viewerList->header()->resizeSection(1, 16); + + CentralWidget *widget = CentralWidget::instance(); + connect(widget, SIGNAL(sourceChanged(QUrl)), this, + SLOT(resetWidgetModel())); + connect(widget, SIGNAL(currentViewerChanged(int)), this, + SLOT(updateViewerWidgetModel(int))); + connect(widget, SIGNAL(viewerAboutToBeRemoved(int)), this, + SLOT(removeViewerFromWidgetModel(int))); + + connect(m_ui.viewerList, SIGNAL(clicked(QModelIndex)), this, + SLOT(handleClicked(QModelIndex))); + connect(m_ui.viewerList, SIGNAL(pressed(QModelIndex)), this, + SLOT(handlePressed(QModelIndex))); + connect(m_ui.viewerList, SIGNAL(customContextMenuRequested(QPoint)), this, + SLOT(contextMenuRequested(QPoint))); +} + +OpenedViewersWidget::~OpenedViewersWidget() +{ +} + +bool OpenedViewersWidget::eventFilter(QObject *obj, QEvent *event) +{ + if (obj == m_ui.viewerList && event->type() == QEvent::KeyPress + && m_ui.viewerList->currentIndex().isValid()) { + QKeyEvent *ke = static_cast<QKeyEvent*>(event); + const int key = ke->key(); + if ((key == Qt::Key_Return || key == Qt::Key_Enter) + && ke->modifiers() == 0) { + handlePressed(m_ui.viewerList->currentIndex()); + return true; + } else if ((key == Qt::Key_Delete || key == Qt::Key_Backspace) + && ke->modifiers() == 0) { + handleClicked(m_ui.viewerList->currentIndex()); + return true; + } + } + return QWidget::eventFilter(obj, event); +} + +void OpenedViewersWidget::resetWidgetModel() +{ + m_model->clear(); + + int i = 0; + CentralWidget *widget = CentralWidget::instance(); + QStandardItem *parentItem = m_model->invisibleRootItem(); + while (HelpViewer *viewer = widget->helpViewerAtIndex(i++)) { + QList<QStandardItem*> list; + list.append(new QStandardItem(viewer->documentTitle())); + list.append(new QStandardItem()); + parentItem->appendRow(list); + } + + m_ui.viewerList->header()->setStretchLastSection(false); + m_ui.viewerList->header()->setResizeMode(0, QHeaderView::Stretch); + m_ui.viewerList->header()->setResizeMode(1, QHeaderView::Fixed); + m_ui.viewerList->header()->resizeSection(1, 16); + m_ui.viewerList->setEditTriggers(QAbstractItemView::NoEditTriggers); + + int row = widget->indexOf(widget->currentHelpViewer()); + if (row >= 0) + m_ui.viewerList->setCurrentIndex(m_model->index(row, 0)); +} + +void OpenedViewersWidget::updateViewerWidgetModel(int index) +{ + if (index >= 0) + m_ui.viewerList->setCurrentIndex(m_model->index(index, 0)); +} + +void OpenedViewersWidget::removeViewerFromWidgetModel(int index) +{ + if (index >= 0) + m_model->removeRow(index); +} + +void OpenedViewersWidget::handleClicked(const QModelIndex &index) +{ + if (index.isValid() && index.column() == 1) { + // the funky close button + CentralWidget::instance()->closeTab(index.row()); + + // work around a bug in itemviews where the delegate wouldn't get the + // QStyle::State_MouseOver + QPoint cursorPos = QCursor::pos(); + QWidget *vp = m_ui.viewerList->viewport(); + QMouseEvent e(QEvent::MouseMove, vp->mapFromGlobal(cursorPos), + cursorPos, Qt::NoButton, 0, 0); + QCoreApplication::sendEvent(vp, &e); + } +} + +void OpenedViewersWidget::handlePressed(const QModelIndex &index) +{ + if (index.isValid()) { + switch (index.column()) { + case 0: + CentralWidget::instance()->activateTab(index.row()); + break; + + case 1: + m_delegate->pressedIndex = index; + break; + } + } +} + +void OpenedViewersWidget::contextMenuRequested(const QPoint &pos) +{ + const QModelIndex &index = m_ui.viewerList->indexAt(pos); + if (!index.isValid()) + return; + + CentralWidget *widget = CentralWidget::instance(); + HelpViewer *viewer = widget->helpViewerAtIndex(index.row()); + if (widget->count() <= 1 || !viewer) + return; + + QMenu contextMenu; + const QString &title = viewer->documentTitle(); + QAction *close = contextMenu.addAction(tr("Close %1").arg(title)); + QAction *closeOther = contextMenu.addAction(tr("Close All Except %1").arg(title)); + + if (QAction *action = contextMenu.exec(m_ui.viewerList->mapToGlobal(pos))) { + if (action == closeOther) { + int currentPage = widget->indexOf(viewer); + for (int i = widget->count() - 1; i >= 0; --i) { + viewer = widget->helpViewerAtIndex(i); + if (i != currentPage && viewer) { + widget->closeTab(i); + if (i < currentPage) + --currentPage; + } + } + } + + if (action == close) + widget->closeTab(index.row()); + } +} diff --git a/src/plugins/help/openedviewerswidget.h b/src/plugins/help/openedviewerswidget.h new file mode 100644 index 0000000000000000000000000000000000000000..e37a5310bf8810b0f69b3b47d3b183ca4050d5f1 --- /dev/null +++ b/src/plugins/help/openedviewerswidget.h @@ -0,0 +1,81 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (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 http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef OPENEDVIEWERSWIDGET_H +#define OPENEDVIEWERSWIDGET_H + +#include <QtGui/QStyledItemDelegate> +#include <QtGui/QStandardItemModel> +#include <QtGui/QWidget> + +#include "ui_openedviewerswidget.h" + +namespace Help { + namespace Internal { + +class OpenedViewersDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + OpenedViewersDelegate(QObject *parent = 0); + + void paint(QPainter *painter, const QStyleOptionViewItem &option, + const QModelIndex &index) const; + + mutable QModelIndex pressedIndex; +}; + +class OpenedViewersWidget : public QWidget +{ + Q_OBJECT +public: + OpenedViewersWidget(QWidget *parent = 0); + ~OpenedViewersWidget(); + + bool eventFilter(QObject *obj, QEvent *event); + +private slots: + void resetWidgetModel(); + void updateViewerWidgetModel(int index); + void removeViewerFromWidgetModel(int index); + + void handleClicked(const QModelIndex &index); + void handlePressed(const QModelIndex &index); + void contextMenuRequested(const QPoint &pos); + +private: + Ui::OpenedViewersWidget m_ui; + QStandardItemModel *m_model; + OpenedViewersDelegate *m_delegate; +}; + + } // Internal +} // Help + +#endif // OPENEDVIEWERSWIDGET_H diff --git a/src/plugins/help/openedviewerswidget.ui b/src/plugins/help/openedviewerswidget.ui new file mode 100644 index 0000000000000000000000000000000000000000..e6630283fd8b99e09938ce0efc7507c9314f4b3d --- /dev/null +++ b/src/plugins/help/openedviewerswidget.ui @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>OpenedViewersWidget</class> + <widget class="QWidget" name="OpenedViewersWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>263</width> + <height>217</height> + </rect> + </property> + <layout class="QGridLayout"> + <property name="margin"> + <number>0</number> + </property> + <property name="spacing"> + <number>0</number> + </property> + <item row="0" column="0"> + <widget class="QTreeView" name="viewerList"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="frameShadow"> + <enum>QFrame::Sunken</enum> + </property> + <property name="textElideMode"> + <enum>Qt::ElideMiddle</enum> + </property> + <property name="indentation"> + <number>0</number> + </property> + <property name="uniformRowHeights"> + <bool>true</bool> + </property> + <property name="headerHidden"> + <bool>true</bool> + </property> + <attribute name="headerStretchLastSection"> + <bool>false</bool> + </attribute> + <attribute name="headerStretchLastSection"> + <bool>false</bool> + </attribute> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp index 6f02c10e33624e22d21b1220cc29134fd54ac3cf..4e2286aecf3acca171a2bff193131800858a84a4 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.cpp @@ -40,8 +40,11 @@ #include <coreplugin/modemanager.h> #include <extensionsystem/pluginmanager.h> +#include <QtCore/QDir> +#include <QtCore/QFile> #include <QtCore/QList> #include <QtCore/QMutexLocker> +#include <QtCore/QTextStream> #include <QtGui/QAction> @@ -89,6 +92,30 @@ MaemoManager *MaemoManager::instance() return m_instance; } +bool +MaemoManager::isValidMaemoQtVersion(const Qt4ProjectManager::QtVersion *version) const +{ + QString path = QDir::cleanPath(version->qmakeCommand()); + path = path.remove(QLatin1String("/bin/qmake" EXEC_SUFFIX)); + + QDir dir(path); + dir.cdUp(); dir.cdUp(); + + QFile file(dir.absolutePath() + QLatin1String("/cache/madde.conf")); + if (file.exists() && file.open(QIODevice::ReadOnly | QIODevice::Text)) { + const QString &target = path.mid(path.lastIndexOf(QLatin1Char('/')) + 1); + QTextStream stream(&file); + while (!stream.atEnd()) { + const QString &line = stream.readLine().trimmed(); + if (line.startsWith(QLatin1String("target")) + && line.endsWith(target)) { + return true; + } + } + } + return false; +} + ProjectExplorer::ToolChain* MaemoManager::maemoToolChain(const QtVersion *version) const { diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h index b57d2d9c9bbb7b3f45771371940d2f6d5cde01d1..0ea6ebd63346b53394d76cb17148d343fffe3aa6 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemomanager.h @@ -66,6 +66,7 @@ class MaemoManager : public QObject public: static MaemoManager *instance(); + bool isValidMaemoQtVersion(const Qt4ProjectManager::QtVersion *version) const; void addVersion(const Qt4ProjectManager::QtVersion *version) { Q_UNUSED(version); } ToolChain *maemoToolChain(const Qt4ProjectManager::QtVersion *version) const; diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.cpp b/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.cpp index dd59b891fcaf2fe3347515de2568c7001cca2564..383f96beabb7c9482bca3fb22f0f9c5dca507aaa 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.cpp +++ b/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.cpp @@ -36,12 +36,6 @@ using namespace ProjectExplorer; using namespace Qt4ProjectManager::Internal; -#ifdef Q_OS_WIN32 -#define EXEC_SUFFIX ".exe" -#else -#define EXEC_SUFFIX "" -#endif - namespace { const char *GCC_MAEMO_COMMAND = "arm-none-linux-gnueabi-gcc" EXEC_SUFFIX; } diff --git a/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.h b/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.h index 74b143d91965e398cb90ae3cd71ca07977dd8859..b03f47b2af9c9c441c43e90c900a7440183ff05d 100644 --- a/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.h +++ b/src/plugins/qt4projectmanager/qt-maemo/maemotoolchain.h @@ -36,6 +36,12 @@ namespace Qt4ProjectManager { class QtVersion; namespace Internal { +#ifdef Q_OS_WIN32 +#define EXEC_SUFFIX ".exe" +#else +#define EXEC_SUFFIX "" +#endif + class MaemoToolChain : public ProjectExplorer::GccToolChain { public: diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 7e0493a66be89ad2fc8d4d77b1d853fa1b1824fa..1d7f11eb2363e2104a341497b5424742d2969985 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -1252,7 +1252,8 @@ void QtVersion::updateToolChainAndMkspec() const } } else if (qt_arch == "arm") { #ifdef QTCREATOR_WITH_MAEMO - m_toolChains << ToolChainPtr(MaemoManager::instance()->maemoToolChain(this)); + if (MaemoManager::instance()->isValidMaemoQtVersion(this)) + m_toolChains << ToolChainPtr(MaemoManager::instance()->maemoToolChain(this)); #endif } else if (qmakeCXX == "cl" || qmakeCXX == "icl") { // TODO proper support for intel cl