diff options
author | con <qtc-commiter@nokia.com> | 2008-12-02 12:01:29 +0100 |
---|---|---|
committer | con <qtc-commiter@nokia.com> | 2008-12-02 12:01:29 +0100 |
commit | 05c35356abc31549c5db6eba31fb608c0365c2a0 (patch) | |
tree | be044530104267afaff13f8943889cb97f8c8bad /src/libs/utils/submiteditorwidget.cpp | |
download | qt-creator-05c35356abc31549c5db6eba31fb608c0365c2a0.tar.gz |
Initial import
Diffstat (limited to 'src/libs/utils/submiteditorwidget.cpp')
-rw-r--r-- | src/libs/utils/submiteditorwidget.cpp | 305 |
1 files changed, 305 insertions, 0 deletions
diff --git a/src/libs/utils/submiteditorwidget.cpp b/src/libs/utils/submiteditorwidget.cpp new file mode 100644 index 0000000000..aeafcd828d --- /dev/null +++ b/src/libs/utils/submiteditorwidget.cpp @@ -0,0 +1,305 @@ +/*************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** +** Non-Open Source Usage +** +** Licensees may use this file in accordance with the Qt Beta Version +** License Agreement, Agreement version 2.2 provided with the Software or, +** alternatively, in accordance with the terms contained in a written +** agreement between you and Nokia. +** +** GNU General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the packaging +** of this file. Please review the following information to ensure GNU +** General Public Licensing requirements will be met: +** +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt GPL Exception version +** 1.2, included in the file GPL_EXCEPTION.txt in this package. +** +***************************************************************************/ +#include "submiteditorwidget.h" +#include "ui_submiteditorwidget.h" + +#include <QtCore/QDebug> +#include <QtCore/QPointer> + +enum { debug= 0 }; + +namespace Core { +namespace Utils { + +struct SubmitEditorWidgetPrivate { + SubmitEditorWidgetPrivate(); + + Ui::SubmitEditorWidget m_ui; + bool m_filesSelected; + bool m_filesChecked; +}; + +SubmitEditorWidgetPrivate::SubmitEditorWidgetPrivate() : + m_filesSelected(false), + m_filesChecked(false) +{ +} + +SubmitEditorWidget::SubmitEditorWidget(QWidget *parent) : + QWidget(parent), + m_d(new SubmitEditorWidgetPrivate) +{ + m_d->m_ui.setupUi(this); + // File List + m_d->m_ui.fileList->setSelectionMode(QAbstractItemView::ExtendedSelection); + connect(m_d->m_ui.fileList, SIGNAL(itemActivated(QListWidgetItem*)), this, SLOT(triggerDiffSelected())); + connect(m_d->m_ui.fileList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(fileItemChanged(QListWidgetItem*))); + connect(m_d->m_ui.fileList, SIGNAL(itemSelectionChanged()), this, SLOT(fileSelectionChanged())); + + // Text + m_d->m_ui.description->setFont(QFont(QLatin1String("Courier"))); + + setFocusPolicy(Qt::StrongFocus); + setFocusProxy(m_d->m_ui.description); +} + +SubmitEditorWidget::~SubmitEditorWidget() +{ + delete m_d; +} + +void SubmitEditorWidget::registerActions(QAction *editorUndoAction, QAction *editorRedoAction, + QAction *submitAction, QAction *diffAction) +{ + if (editorUndoAction) { + editorUndoAction->setEnabled(m_d->m_ui.description->document()->isUndoAvailable()); + connect(m_d->m_ui.description, SIGNAL(undoAvailable(bool)), editorUndoAction, SLOT(setEnabled(bool))); + connect(editorUndoAction, SIGNAL(triggered()), m_d->m_ui.description, SLOT(undo())); + } + if (editorRedoAction) { + editorRedoAction->setEnabled(m_d->m_ui.description->document()->isRedoAvailable()); + connect(m_d->m_ui.description, SIGNAL(redoAvailable(bool)), editorRedoAction, SLOT(setEnabled(bool))); + connect(editorRedoAction, SIGNAL(triggered()), m_d->m_ui.description, SLOT(redo())); + } + + if (submitAction) { + if (debug) + qDebug() << submitAction << m_d->m_ui.fileList->count() << "items" << m_d->m_filesChecked; + submitAction->setEnabled(m_d->m_filesChecked); + connect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + } + if (diffAction) { + if (debug) + qDebug() << diffAction << m_d->m_filesSelected; + diffAction->setEnabled(m_d->m_filesSelected); + connect(this, SIGNAL(fileSelectionChanged(bool)), diffAction, SLOT(setEnabled(bool))); + connect(diffAction, SIGNAL(triggered()), this, SLOT(triggerDiffSelected())); + } +} + +void SubmitEditorWidget::unregisterActions(QAction *editorUndoAction, QAction *editorRedoAction, + QAction *submitAction, QAction *diffAction) +{ + if (editorUndoAction) { + disconnect(m_d->m_ui.description, SIGNAL(undoAvailableChanged(bool)), editorUndoAction, SLOT(setEnabled(bool))); + disconnect(editorUndoAction, SIGNAL(triggered()), m_d->m_ui.description, SLOT(undo())); + } + if (editorRedoAction) { + disconnect(m_d->m_ui.description, SIGNAL(redoAvailableChanged(bool)), editorRedoAction, SLOT(setEnabled(bool))); + disconnect(editorRedoAction, SIGNAL(triggered()), m_d->m_ui.description, SLOT(redo())); + } + + if (submitAction) + disconnect(this, SIGNAL(fileCheckStateChanged(bool)), submitAction, SLOT(setEnabled(bool))); + + if (diffAction) { + disconnect(this, SIGNAL(fileSelectionChanged(bool)), diffAction, SLOT(setEnabled(bool))); + disconnect(diffAction, SIGNAL(triggered()), this, SLOT(triggerDiffSelected())); + } +} + + +QString SubmitEditorWidget::trimmedDescriptionText() const +{ + // Make sure we have one terminating NL + QString text = descriptionText().trimmed(); + text += QLatin1Char('\n'); + return text; +} + +QString SubmitEditorWidget::descriptionText() const +{ + return m_d->m_ui.description->toPlainText(); +} + +void SubmitEditorWidget::setDescriptionText(const QString &text) +{ + m_d->m_ui.description->setPlainText(text); +} + +QStringList SubmitEditorWidget::fileList() const +{ + QStringList rc; + const int count = m_d->m_ui.fileList->count(); + for (int i = 0; i < count; i++) + rc.push_back(m_d->m_ui.fileList->item(i)->text()); + return rc; +} + +void SubmitEditorWidget::addFilesUnblocked(const QStringList &list, bool checked, bool userCheckable) +{ + if (debug) + qDebug() << Q_FUNC_INFO << list << checked << userCheckable; + foreach (const QString &f, list) { + QListWidgetItem *item = new QListWidgetItem(f); + item->setCheckState(checked ? Qt::Checked : Qt::Unchecked); + if (!userCheckable) + item->setFlags(item->flags() & ~Qt::ItemIsUserCheckable); + m_d->m_ui.fileList->addItem(item); + } +} + +void SubmitEditorWidget::addFiles(const QStringList &list, bool checked, bool userCheckable) +{ + if (list.empty()) + return; + + const bool blocked = m_d->m_ui.fileList->blockSignals(true); + addFilesUnblocked(list, checked, userCheckable); + m_d->m_ui.fileList->blockSignals(blocked); + // Did we gain any checked files..update action accordingly + if (!m_d->m_filesChecked && checked) { + m_d->m_filesChecked = true; + emit fileCheckStateChanged(m_d->m_filesChecked); + } +} + +void SubmitEditorWidget::setFileList(const QStringList &list) +{ + // Trigger enabling of menu action + m_d->m_ui.fileList->clearSelection(); + + const bool blocked = m_d->m_ui.fileList->blockSignals(true); + m_d->m_ui.fileList->clear(); + if (!list.empty()) { + addFilesUnblocked(list, true, true); + // Checked files added? + if (!m_d->m_filesChecked) { + m_d->m_filesChecked = true; + emit fileCheckStateChanged(m_d->m_filesChecked); + } + } + m_d->m_ui.fileList->blockSignals(blocked); +} + +static bool containsCheckState(const QListWidget *lw, Qt::CheckState cs) +{ + const int count = lw->count(); + for (int i = 0; i < count; i++) + if (lw->item(i)->checkState() == cs) + return true; + return false; +} + +QStringList SubmitEditorWidget::selectedFiles() const +{ + QStringList rc; + const int count = m_d->m_ui.fileList->count(); + for (int i = 0; i < count; i++) { + const QListWidgetItem *item = m_d->m_ui.fileList->item(i); + if (item->isSelected()) + rc.push_back(item->text()); + } + return rc; +} + +QStringList SubmitEditorWidget::checkedFiles() const +{ + QStringList rc; + const int count = m_d->m_ui.fileList->count(); + for (int i = 0; i < count; i++) { + const QListWidgetItem *item = m_d->m_ui.fileList->item(i); + if (item->checkState() == Qt::Checked) + rc.push_back(item->text()); + } + return rc; +} + +QPlainTextEdit *SubmitEditorWidget::descriptionEdit() const +{ + return m_d->m_ui.description; +} + +void SubmitEditorWidget::triggerDiffSelected() +{ + const QStringList sel = selectedFiles(); + if (!sel.empty()) + emit diffSelected(sel); +} + +void SubmitEditorWidget::fileItemChanged(QListWidgetItem *item) +{ + const Qt::CheckState st = item->checkState(); + if (debug) + qDebug() << Q_FUNC_INFO << st << item->text() << m_d->m_filesChecked; + // Enable the actions according to check state + switch (st) { + case Qt::Unchecked: // Item was unchecked: Any checked items left? + if (m_d->m_filesChecked && !containsCheckState(m_d->m_ui.fileList, Qt::Checked)) { + m_d->m_filesChecked = false; + emit fileCheckStateChanged(m_d->m_filesChecked); + } + break; + case Qt::Checked: + // Item was Checked. First one? + if (!m_d->m_filesChecked) { + m_d->m_filesChecked = true; + emit fileCheckStateChanged(m_d->m_filesChecked); + } + break; + case Qt::PartiallyChecked: // Errm? + break; + } +} + +void SubmitEditorWidget::fileSelectionChanged() +{ + const bool newFilesSelected = !m_d->m_ui.fileList->selectedItems().empty(); + if (debug) + qDebug() << Q_FUNC_INFO << newFilesSelected; + if (m_d->m_filesSelected != newFilesSelected) { + m_d->m_filesSelected = newFilesSelected; + emit fileSelectionChanged(m_d->m_filesSelected); + if (debug) + qDebug() << Q_FUNC_INFO << m_d->m_filesSelected; + } +} + +void SubmitEditorWidget::changeEvent(QEvent *e) +{ + switch(e->type()) { + case QEvent::LanguageChange: + m_d->m_ui.retranslateUi(this); + break; + default: + break; + } +} + +void SubmitEditorWidget::insertTopWidget(QWidget *w) +{ + m_d->m_ui.vboxLayout->insertWidget(0, w); +} + +} // namespace Utils +} // namespace Core |