/* * Copyright 2008 Ben Boeckel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ // Header include #include "ValidationDialog.h" // Sigmod includes #include "../sigmod/Object.h" // KDE includes #include #include #include // Qt includes #include #include #include Sigmodr::ValidationDialog::ValidationDialog(Sigmod::Object* object, QWidget* parent) : QWidget(parent), m_processed(false), m_object(object), m_valTree(NULL) { connect(m_object, SIGNAL(changed()), this, SLOT(objectChanged())); } int Sigmodr::ValidationDialog::errors() const { return m_errors; } int Sigmodr::ValidationDialog::warnings() const { return m_warnings; } void Sigmodr::ValidationDialog::process() { if (!m_processed) { m_errors = 0; m_warnings = 0; m_valTree = new QTreeWidget; m_valTree->setHeaderHidden(true); m_parents.clear(); m_parents.push(ObjectErrorCount(m_valTree->invisibleRootItem(), 0)); KProgressDialog* progress = new KProgressDialog(this, "Validating", "Please wait"); progress->progressBar()->setRange(0, 0); progress->setAllowCancel(false); progress->setModal(true); progress->show(); connect(m_object, SIGNAL(valMessage(QString)), this, SLOT(addMessage(QString))); connect(m_object, SIGNAL(valWarning(QString)), this, SLOT(addWarning(QString))); connect(m_object, SIGNAL(valError(QString)), this, SLOT(addError(QString))); m_object->validate(); disconnect(m_object, SIGNAL(valMessage(QString)), this, SLOT(addMessage(QString))); disconnect(m_object, SIGNAL(valWarning(QString)), this, SLOT(addWarning(QString))); disconnect(m_object, SIGNAL(valError(QString)), this, SLOT(addError(QString))); delete progress; m_valTree->addTopLevelItem(m_parents.top().first); } m_processed = true; } void Sigmodr::ValidationDialog::show() { if (!m_processed) process(); if (m_parents.top().second) { KDialog* dialog = new KDialog(this); dialog->setCaption("Validation Messages"); dialog->setButtons(KDialog::Ok); QWidget* widget = new QWidget; QVBoxLayout* layout = new QVBoxLayout; layout->addWidget(new QLabel(QString("Warnings: %1\nErrors: %2").arg(m_warnings).arg(m_errors))); layout->addWidget(m_valTree); widget->setLayout(layout); dialog->setMainWidget(widget); dialog->exec(); delete dialog; m_processed = false; } else KMessageBox::information(this, "No messages", "Validation"); } void Sigmodr::ValidationDialog::insertMessage(const QString& msg, const QBrush& brush) { ++m_parents.top().second; QTreeWidgetItem* item = new QTreeWidgetItem(m_parents.top().first, QStringList(msg)); item->setBackground(0, brush); } void Sigmodr::ValidationDialog::addMessage(const QString& msg) { if (msg.startsWith("++")) m_parents.push(ObjectErrorCount(new QTreeWidgetItem(QStringList(msg.mid(2))), 0)); else if (msg.startsWith("--")) { ObjectErrorCount count = m_parents.pop(); if (count.second) { m_parents.top().first->addChild(count.first); ++m_parents.top().second; } } else insertMessage(msg, KStatefulBrush(KColorScheme::View, KColorScheme::PositiveBackground).brush(QPalette::Normal)); } void Sigmodr::ValidationDialog::addError(const QString& msg) { insertMessage(msg, KStatefulBrush(KColorScheme::View, KColorScheme::NegativeBackground).brush(QPalette::Normal)); ++m_errors; } void Sigmodr::ValidationDialog::addWarning(const QString& msg) { insertMessage(msg, KStatefulBrush(KColorScheme::View, KColorScheme::NeutralBackground).brush(QPalette::Normal)); ++m_warnings; } void Sigmodr::ValidationDialog::objectChanged() { m_processed = false; }