main.cpp
drkonqidialog.cpp
statuswidget.cpp
- reportassistantdialog.cpp
- reportassistantpage.cpp
- reportassistantpages_base.cpp
- reportinterface.cpp
backtraceratingwidget.cpp
backtracewidget.cpp
backtracegenerator.cpp
kde4_add_ui_files(drkonqi_SRCS
ui/maindialog.ui
ui/backtracewidget.ui
- ui/assistantpage_introduction.ui
- ui/assistantpage_bugawareness.ui
- ui/assistantpage_conclusions.ui
- ui/assistantpage_conclusions_dialog.ui
)
# if BACKTRACE_PARSER_DEBUG is enabled, it will show both the
#include <KDebug>
#include <KCmdLineArgs>
#include <KToolInvocation>
+#include <kglobalsettings.h>
+#include <kurl.h>
#include "drkonqi.h"
+#include "backtracegenerator.h"
#include "backtracewidget.h"
-#include "reportassistantdialog.h"
#include "crashedapplication.h"
#include "debuggermanager.h"
#include "debuggerlaunchers.h"
crashedApp->fakeExecutableBaseName(),
crashedApp->pid(),
crashedApp->signalName(),
- #if defined(Q_OS_UNIX)
crashedApp->signalNumber(),
- #else
- //windows uses weird big numbers for exception codes,
- //so it doesn't make sense to display them in decimal
- QString().sprintf("0x%8x", crashedApp->signalNumber()),
- #endif
KGlobal::locale()->formatDate(crashedApp->datetime().date(), KLocale::ShortDate),
KGlobal::locale()->formatTime(crashedApp->datetime().time(), true)
void DrKonqiDialog::startBugReportAssistant()
{
- ReportAssistantDialog * bugReportAssistant = new ReportAssistantDialog();
- close();
- bugReportAssistant->show();
+ BacktraceGenerator *btGenerator = DrKonqi::debuggerManager()->backtraceGenerator();
+ QString query = QString(BUG_REPORT_URL) + "/new?title=&body=";
+ query += btGenerator->backtrace();
+
+ KToolInvocation::invokeBrowser(KUrl(query).url());
}
void DrKonqiDialog::applicationRestarted(bool success)
+++ /dev/null
-/*******************************************************************
-* reportassistantdialog.cpp
-* Copyright 2009,2010 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#include "reportassistantdialog.h"
-
-#include <QCloseEvent>
-
-#include <KMessageBox>
-
-#include "drkonqi.h"
-
-#include "parser/backtraceparser.h"
-#include "debuggermanager.h"
-#include "backtracegenerator.h"
-
-#include "crashedapplication.h"
-#include "reportassistantpages_base.h"
-#include "reportinterface.h"
-
-ReportAssistantDialog::ReportAssistantDialog(QWidget * parent) :
- KAssistantDialog(parent),
- m_reportInterface(new ReportInterface(this)),
- m_canClose(false)
-{
- KGlobal::ref();
- setAttribute(Qt::WA_DeleteOnClose, true);
-
- //Set window properties
- setWindowTitle(i18nc("@title:window","Crash Reporting Assistant"));
- setWindowIcon(KIcon("tools-report-bug"));
-
- connect(this, SIGNAL(currentPageChanged(KPageWidgetItem*,KPageWidgetItem*)),
- this, SLOT(currentPageChanged_slot(KPageWidgetItem*,KPageWidgetItem*)));
- connect(this, SIGNAL(helpClicked()), this, SLOT(showHelp()));
-
- //Create the assistant pages
-
- //-Introduction Page
- KConfigGroup group(KGlobal::config(), "ReportAssistant");
- const bool skipIntroduction = group.readEntry("SkipIntroduction", false);
-
- if (!skipIntroduction) {
- IntroductionPage * m_introduction = new IntroductionPage(this);
-
- KPageWidgetItem * m_introductionPage = new KPageWidgetItem(m_introduction,
- QLatin1String(PAGE_INTRODUCTION_ID));
- m_pageWidgetMap.insert(QLatin1String(PAGE_INTRODUCTION_ID),m_introductionPage);
- m_introductionPage->setHeader(i18nc("@title","Welcome to the Reporting Assistant"));
- m_introductionPage->setIcon(KIcon("tools-report-bug"));
-
- addPage(m_introductionPage);
- }
-
- //-Bug Awareness Page
- BugAwarenessPage * m_awareness = new BugAwarenessPage(this);
- connectSignals(m_awareness);
-
- KPageWidgetItem * m_awarenessPage = new KPageWidgetItem(m_awareness,
- QLatin1String(PAGE_AWARENESS_ID));
- m_pageWidgetMap.insert(QLatin1String(PAGE_AWARENESS_ID),m_awarenessPage);
- m_awarenessPage->setHeader(i18nc("@title","What do you know about the crash?"));
- m_awarenessPage->setIcon(KIcon("checkbox"));
-
- //-Crash Information Page
- CrashInformationPage * m_backtrace = new CrashInformationPage(this);
- connectSignals(m_backtrace);
-
- KPageWidgetItem * m_backtracePage = new KPageWidgetItem(m_backtrace,
- QLatin1String(PAGE_CRASHINFORMATION_ID));
- m_pageWidgetMap.insert(QLatin1String(PAGE_CRASHINFORMATION_ID),m_backtracePage);
- m_backtracePage->setHeader(i18nc("@title","Fetching the Backtrace (Automatic Crash Information)"));
- m_backtracePage->setIcon(KIcon("run-build"));
-
- //-Results Page
- ConclusionPage * m_conclusions = new ConclusionPage(this);
- connectSignals(m_conclusions);
-
- KPageWidgetItem * m_conclusionsPage = new KPageWidgetItem(m_conclusions,
- QLatin1String(PAGE_CONCLUSIONS_ID));
- m_pageWidgetMap.insert(QLatin1String(PAGE_CONCLUSIONS_ID),m_conclusionsPage);
- m_conclusionsPage->setHeader(i18nc("@title","Results of the Analyzed Crash Details"));
- m_conclusionsPage->setIcon(KIcon("dialog-information"));
- connect(m_conclusions, SIGNAL(finished(bool)), this, SLOT(assistantFinished(bool)));
-
- //TODO Remember to keep the pages ordered
- addPage(m_awarenessPage);
- addPage(m_backtracePage);
- addPage(m_conclusionsPage);
-
- setMinimumSize(QSize(600, 400));
- resize(minimumSize());
-}
-
-ReportAssistantDialog::~ReportAssistantDialog()
-{
- KGlobal::deref();
-}
-
-void ReportAssistantDialog::connectSignals(ReportAssistantPage * page)
-{
- //React to the changes in the assistant pages
- connect(page, SIGNAL(completeChanged(ReportAssistantPage*,bool)),
- this, SLOT(completeChanged(ReportAssistantPage*,bool)));
-}
-
-void ReportAssistantDialog::currentPageChanged_slot(KPageWidgetItem * current , KPageWidgetItem * before)
-{
- //Page changed
-
- enableButton(KDialog::Cancel, true);
- m_canClose = false;
-
- //Save data of the previous page
- if (before) {
- ReportAssistantPage* beforePage = dynamic_cast<ReportAssistantPage*>(before->widget());
- beforePage->aboutToHide();
- }
-
- //Load data of the current(new) page
- if (current) {
- ReportAssistantPage* currentPage = dynamic_cast<ReportAssistantPage*>(current->widget());
- enableNextButton(currentPage->isComplete());
- currentPage->aboutToShow();
- }
-}
-
-void ReportAssistantDialog::completeChanged(ReportAssistantPage* page, bool isComplete)
-{
- if (page == dynamic_cast<ReportAssistantPage*>(currentPage()->widget())) {
- enableNextButton(isComplete);
- }
-}
-
-void ReportAssistantDialog::assistantFinished(bool showBack)
-{
- //The assistant finished: allow the user to close the dialog normally
-
- enableNextButton(false);
- enableButton(KDialog::User3, showBack); //Back button
- enableButton(KDialog::User1, true);
- enableButton(KDialog::Cancel, false);
-
- m_canClose = true;
-}
-
-//Override KAssistantDialog "next" page implementation
-void ReportAssistantDialog::next()
-{
- //Allow the widget to Ask a question to the user before changing the page
- ReportAssistantPage * page = dynamic_cast<ReportAssistantPage*>(currentPage()->widget());
- if (page) {
- if (!page->showNextPage()) {
- return;
- }
- }
-
- const QString name = currentPage()->name();
-
- //If the information the user can provide is not useful, skip the backtrace page
- if (name == QLatin1String(PAGE_AWARENESS_ID))
- {
- //Force save settings in the current page
- page->aboutToHide();
-
- if (!(m_reportInterface->isBugAwarenessPageDataUseful()))
- {
- setCurrentPage(m_pageWidgetMap.value(QLatin1String(PAGE_CONCLUSIONS_ID)));
- return;
- }
- } else if (name == QLatin1String(PAGE_CRASHINFORMATION_ID)){
- //Force save settings in current page
- page->aboutToHide();
- }
-
- KAssistantDialog::next();
-}
-
-//Override KAssistantDialog "back"(previous) page implementation
-//It has to mirror the custom next() implementation
-void ReportAssistantDialog::back()
- {
- if (currentPage()->name() == QLatin1String(PAGE_CONCLUSIONS_ID))
- {
- if (!(m_reportInterface->isBugAwarenessPageDataUseful()))
- {
- setCurrentPage(m_pageWidgetMap.value(QLatin1String(PAGE_AWARENESS_ID)));
- return;
- }
- }
-
- KAssistantDialog::back();
-}
-
-void ReportAssistantDialog::enableNextButton(bool enabled)
-{
- enableButton(KDialog::User2, enabled);
-}
-
-void ReportAssistantDialog::reject()
-{
- close();
-}
-
-void ReportAssistantDialog::closeEvent(QCloseEvent * event)
-{
- //Handle the close event
- if (!m_canClose) {
- //If the assistant didn't finished yet, offer the user the possibilities to
- //Close, Cancel, or Save the bug report and Close"
-
- KGuiItem closeItem = KStandardGuiItem::close();
- closeItem.setText(i18nc("@action:button", "Close the assistant"));
-
- KGuiItem keepOpenItem = KStandardGuiItem::cancel();
- keepOpenItem.setText(i18nc("@action:button", "Cancel"));
-
- BacktraceParser::Usefulness use =
- DrKonqi::debuggerManager()->backtraceGenerator()->parser()->backtraceUsefulness();
- if (use == BacktraceParser::ReallyUseful || use == BacktraceParser::MayBeUseful) {
- //Backtrace is still useful, let the user save it.
- KGuiItem saveBacktraceItem = KStandardGuiItem::save();
- saveBacktraceItem.setText(i18nc("@action:button", "Save information and close"));
-
- int ret = KMessageBox::questionYesNoCancel(this,
- i18nc("@info","Do you really want to close the bug reporting assistant? "
- "<note>The crash information is still valid, so "
- "you can save the report before closing if you want.</note>"),
- i18nc("@title:window","Close the Assistant"),
- closeItem, saveBacktraceItem, keepOpenItem, QString(), KMessageBox::Dangerous);
- if(ret == KMessageBox::Yes)
- {
- event->accept();
- } else if (ret == KMessageBox::No) {
- //Save backtrace and accept event (dialog will be closed)
- DrKonqi::saveReport(reportInterface()->generateReportFullText(false));
- event->accept();
- } else {
- event->ignore();
- }
- } else {
- if (KMessageBox::questionYesNo(this, i18nc("@info","Do you really want to close the bug "
- "reporting assistant?"),
- i18nc("@title:window","Close the Assistant"),
- closeItem, keepOpenItem, QString(), KMessageBox::Dangerous)
- == KMessageBox::Yes) {
- event->accept();
- } else {
- event->ignore();
- }
- }
- } else {
- event->accept();
- }
-}
+++ /dev/null
-/*******************************************************************
-* reportassistantdialog.h
-* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#ifndef REPORTASSISTANTDIALOG__H
-#define REPORTASSISTANTDIALOG__H
-
-#include <QtCore/QPointer>
-
-#include <KAssistantDialog>
-
-class ReportAssistantPage;
-class AboutBugReportingDialog;
-class ReportInterface;
-class QCloseEvent;
-
-class ReportAssistantDialog: public KAssistantDialog
-{
- Q_OBJECT
-
-public:
- explicit ReportAssistantDialog(QWidget * parent = 0);
- ~ReportAssistantDialog();
-
- ReportInterface *reportInterface() const {
- return m_reportInterface;
- }
-
-private Q_SLOTS:
- void currentPageChanged_slot(KPageWidgetItem *, KPageWidgetItem *);
-
- void completeChanged(ReportAssistantPage*, bool);
-
- void assistantFinished(bool);
-
- void enableNextButton(bool);
-
- void next();
- void back();
-
- //Override default reject method
- void reject();
-
-private:
- void connectSignals(ReportAssistantPage *);
- void closeEvent(QCloseEvent*);
-
- QHash<QLatin1String, KPageWidgetItem*> m_pageWidgetMap;
-
- QPointer<AboutBugReportingDialog> m_aboutBugReportingDialog;
- ReportInterface * m_reportInterface;
-
- bool m_canClose;
-};
-
-#endif
+++ /dev/null
-/*******************************************************************
-* reportassistantpage.cpp
-* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#include "reportassistantpage.h"
-#include "reportinterface.h"
-
-ReportAssistantPage::ReportAssistantPage(ReportAssistantDialog * parent)
- : QWidget(parent), m_assistant(parent)
-{
-}
-
-bool ReportAssistantPage::isComplete()
-{
- return true;
-}
-
-bool ReportAssistantPage::showNextPage()
-{
- return true;
-}
-
-ReportInterface * ReportAssistantPage::reportInterface() const
-{
- return m_assistant->reportInterface();
-}
-
-ReportAssistantDialog * ReportAssistantPage::assistant() const
-{
- return m_assistant;
-}
-
-void ReportAssistantPage::emitCompleteChanged()
-{
- emit completeChanged(this, isComplete());
-}
+++ /dev/null
-/*******************************************************************
-* reportassistantpage.h
-* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#ifndef REPORTASSISTANTPAGE__H
-#define REPORTASSISTANTPAGE__H
-
-#include <QWidget>
-
-#include "reportassistantdialog.h"
-
-class BugzillaManager;
-
-/** BASE interface which implements some signals, and
-** aboutTo(Show|Hide) functions (also reimplements QWizard behaviour) **/
-class ReportAssistantPage: public QWidget
-{
- Q_OBJECT
-
-public:
- explicit ReportAssistantPage(ReportAssistantDialog * parent);
-
- /** Load the widget data if empty **/
- virtual void aboutToShow() {}
- /** Save the widget data **/
- virtual void aboutToHide() {}
- /** Tells the KAssistantDialog to enable the Next button **/
- virtual bool isComplete();
-
- /** Last time checks to see if you can turn the page **/
- virtual bool showNextPage();
-
- ReportInterface *reportInterface() const;
- BugzillaManager *bugzillaManager() const;
- ReportAssistantDialog * assistant() const;
-
-public Q_SLOTS:
- void emitCompleteChanged();
-
-Q_SIGNALS:
- /** Tells the KAssistantDialog that the isComplete function changed value **/
- void completeChanged(ReportAssistantPage*, bool);
-
-private:
- ReportAssistantDialog * const m_assistant;
-};
-
-#endif
+++ /dev/null
-/*******************************************************************
-* reportassistantpages_base.cpp
-* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-* Copyright 2009 A. L. Spehr <spehr@kde.org>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#include "reportassistantpages_base.h"
-
-#include <QLabel>
-#include <QCheckBox>
-#include <QToolTip>
-
-#include <KToolInvocation>
-#include <KIcon>
-#include <KUrl>
-#include <KMessageBox>
-
-#include "drkonqi.h"
-#include "debuggermanager.h"
-#include "crashedapplication.h"
-#include "reportinterface.h"
-#include "parser/backtraceparser.h"
-#include "backtracegenerator.h"
-#include "backtracewidget.h"
-#include "drkonqi_globals.h"
-#include "applicationdetailsexamples.h"
-
-//BEGIN IntroductionPage
-
-IntroductionPage::IntroductionPage(ReportAssistantDialog * parent)
- : ReportAssistantPage(parent)
-{
- ui.setupUi(this);
- ui.m_warningIcon->setPixmap(KIcon("dialog-warning").pixmap(64,64));
-}
-
-//END IntroductionPage
-
-//BEGIN CrashInformationPage
-
-CrashInformationPage::CrashInformationPage(ReportAssistantDialog * parent)
- : ReportAssistantPage(parent)
-{
- m_backtraceWidget = new BacktraceWidget(DrKonqi::debuggerManager()->backtraceGenerator(), this, true);
- connect(m_backtraceWidget, SIGNAL(stateChanged()) , this, SLOT(emitCompleteChanged()));
-
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->setContentsMargins(0,0,0,0);
- layout->addWidget(m_backtraceWidget);
- layout->addSpacing(10); //We need this for better usability until we get something better
-
- //If the backtrace was already fetched on the main dialog, save it.
- BacktraceGenerator *btGenerator = DrKonqi::debuggerManager()->backtraceGenerator();
- if (btGenerator->state() == BacktraceGenerator::Loaded) {
- BacktraceParser::Usefulness use = btGenerator->parser()->backtraceUsefulness();
- if (use != BacktraceParser::Useless && use != BacktraceParser::InvalidUsefulness) {
- reportInterface()->setBacktrace(btGenerator->backtrace());
- }
- }
-}
-
-void CrashInformationPage::aboutToShow()
-{
- m_backtraceWidget->generateBacktrace();
- m_backtraceWidget->hilightExtraDetailsLabel(false);
- emitCompleteChanged();
-}
-
-void CrashInformationPage::aboutToHide()
-{
- BacktraceGenerator *btGenerator = DrKonqi::debuggerManager()->backtraceGenerator();
- BacktraceParser::Usefulness use = btGenerator->parser()->backtraceUsefulness();
-
- if (use != BacktraceParser::Useless && use != BacktraceParser::InvalidUsefulness) {
- reportInterface()->setBacktrace(btGenerator->backtrace());
- }
- reportInterface()->setFirstBacktraceFunctions(btGenerator->parser()->firstValidFunctions());
-}
-
-bool CrashInformationPage::isComplete()
-{
- BacktraceGenerator *generator = DrKonqi::debuggerManager()->backtraceGenerator();
- return (generator->state() != BacktraceGenerator::NotLoaded &&
- generator->state() != BacktraceGenerator::Loading);
-}
-
-bool CrashInformationPage::showNextPage()
-{
- BacktraceParser::Usefulness use =
- DrKonqi::debuggerManager()->backtraceGenerator()->parser()->backtraceUsefulness();
-
- if ((use == BacktraceParser::InvalidUsefulness || use == BacktraceParser::ProbablyUseless
- || use == BacktraceParser::Useless) && m_backtraceWidget->canInstallDebugPackages()) {
- if ( KMessageBox::Yes == KMessageBox::questionYesNo(this,
- i18nc("@info","This crash information is not useful enough, "
- "do you want to try to improve it? You will need "
- "to install some debugging packages."),
- i18nc("@title:window","Crash Information is not useful enough")) ) {
- m_backtraceWidget->hilightExtraDetailsLabel(true);
- m_backtraceWidget->focusImproveBacktraceButton();
- return false; //Cancel show next, to allow the user to write more
- } else {
- return true; //Allow to continue
- }
- } else {
- return true;
- }
-}
-
-//END CrashInformationPage
-
-//BEGIN BugAwarenessPage
-
-BugAwarenessPage::BugAwarenessPage(ReportAssistantDialog * parent)
- : ReportAssistantPage(parent)
-{
- ui.setupUi(this);
-
- ui.m_actionsInsideApp->setText(i18nc("@option:check kind of information the user can provide "
- "about the crash, %1 is the application name",
- "What I was doing when the application \"%1\" crashed",
- DrKonqi::crashedApplication()->name()));
-
- connect(ui.m_rememberGroup, SIGNAL(buttonClicked(int)), this, SLOT(updateCheckBoxes()));
-
- ui.m_appSpecificDetailsExamples->setVisible(reportInterface()->appDetailsExamples()->hasExamples());
-
- connect(ui.m_appSpecificDetailsExamples, SIGNAL(linkActivated(QString)), this,
- SLOT(showApplicationDetailsExamples()));
-}
-
-void BugAwarenessPage::aboutToShow()
-{
- updateCheckBoxes();
-}
-
-void BugAwarenessPage::aboutToHide()
-{
- //Save data
- ReportInterface::Reproducible reproducible = ReportInterface::ReproducibleUnsure;
- switch(ui.m_reproducibleBox->currentIndex()) {
- case 0: {
- reproducible = ReportInterface::ReproducibleUnsure;
- break;
- }
- case 1: {
- reproducible = ReportInterface::ReproducibleNever;
- break;
- }
- case 2: {
- reproducible = ReportInterface::ReproducibleSometimes;
- break;
- }
- case 3: {
- reproducible = ReportInterface::ReproducibleEverytime;
- break;
- }
- }
-
- reportInterface()->setBugAwarenessPageData(ui.m_rememberCrashSituationYes->isChecked(),
- reproducible,
- ui.m_actionsInsideApp->isChecked(),
- ui.m_unusualSituation->isChecked(),
- ui.m_appSpecificDetails->isChecked());
-}
-
-void BugAwarenessPage::updateCheckBoxes()
-{
- const bool rememberSituation = ui.m_rememberCrashSituationYes->isChecked();
-
- ui.m_reproducibleLabel->setEnabled(rememberSituation);
- ui.m_reproducibleBox->setEnabled(rememberSituation);
-
- ui.m_informationLabel->setEnabled(rememberSituation);
- ui.m_actionsInsideApp->setEnabled(rememberSituation);
- ui.m_unusualSituation->setEnabled(rememberSituation);
-
- ui.m_appSpecificDetails->setEnabled(rememberSituation);
- ui.m_appSpecificDetailsExamples->setEnabled(rememberSituation);
-}
-
-void BugAwarenessPage::showApplicationDetailsExamples()
-{
- QToolTip::showText(QCursor::pos(),
- i18nc("@label examples about information the user can provide",
- "Examples: %1", reportInterface()->appDetailsExamples()->examples()),
- this);
-}
-
-//END BugAwarenessPage
-
-//BEGIN ConclusionPage
-
-ConclusionPage::ConclusionPage(ReportAssistantDialog * parent)
- : ReportAssistantPage(parent)
- , m_needToReport(false)
-{
- m_isBKO = DrKonqi::crashedApplication()->bugReportAddress().isKdeBugzilla();
-
- ui.setupUi(this);
-
- ui.m_showReportInformationButton->setGuiItem(
- KGuiItem2(i18nc("@action:button", "&Show Contents of the Report"),
- KIcon("document-preview"),
- i18nc("@info:tooltip", "Use this button to show the generated "
- "report information about this crash.")));
- connect(ui.m_showReportInformationButton, SIGNAL(clicked()),
- this, SLOT(openReportInformation()));
-
- ui.m_restartAppOnFinish->setVisible(false);
-}
-
-void ConclusionPage::finishClicked()
-{
- //Manual report
- if (m_needToReport && !m_isBKO) {
- const CrashedApplication *crashedApp = DrKonqi::crashedApplication();
- BugReportAddress reportAddress = crashedApp->bugReportAddress();
- QString report = reportInterface()->generateReportFullText(false);
-
- if (reportAddress.isEmail()) {
- QString subject = "[%1] [%2] Automatic crash report generated by DrKonqi";
- subject= subject.arg(crashedApp->name());
- subject= subject.arg(crashedApp->datetime().toString("yyyy-MM-dd"));
- KToolInvocation::invokeMailer(reportAddress, "", "" , subject, report);
- } else {
- if (KUrl(reportAddress).isRelative()) { //Scheme is missing
- reportAddress = QString::fromLatin1("http://%1").arg(reportAddress);
- }
- KToolInvocation::invokeBrowser(reportAddress);
- }
-
- //Show a copy of the bug reported
- openReportInformation();
- }
-
- //Restart application
- if (ui.m_restartAppOnFinish->isChecked()) {
- DrKonqi::crashedApplication()->restart();
- }
-}
-
-void ConclusionPage::aboutToShow()
-{
- connect(assistant(), SIGNAL(user1Clicked()), this, SLOT(finishClicked()));
- ui.m_restartAppOnFinish->setVisible(false);
- ui.m_restartAppOnFinish->setChecked(false);
-
- const bool isDuplicate = reportInterface()->duplicateId() && !reportInterface()->attachToBugNumber();
- m_needToReport = reportInterface()->isWorthReporting() && !isDuplicate;
- emitCompleteChanged();
-
- BugReportAddress reportAddress = DrKonqi::crashedApplication()->bugReportAddress();
- BacktraceParser::Usefulness use =
- DrKonqi::debuggerManager()->backtraceGenerator()->parser()->backtraceUsefulness();
-
- QString explanationHTML = QLatin1String("<p><ul>");
-
- bool backtraceGenerated = true;
- switch (use) {
- case BacktraceParser::ReallyUseful: {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The automatically generated "
- "crash information is useful."));
- break;
- }
- case BacktraceParser::MayBeUseful: {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The automatically generated "
- "crash information lacks some "
- "details "
- "but may be still be useful."));
- break;
- }
- case BacktraceParser::ProbablyUseless: {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The automatically generated "
- "crash information lacks important details "
- "and it is probably not helpful."));
- break;
- }
- case BacktraceParser::Useless:
- case BacktraceParser::InvalidUsefulness: {
- BacktraceGenerator::State state = DrKonqi::debuggerManager()->backtraceGenerator()->state();
- if (state == BacktraceGenerator::NotLoaded) {
- backtraceGenerated = false;
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The crash information was "
- "not generated because it was not needed."));
- } else {
- explanationHTML += QString("<li>%1<br />%2</li>").arg(
- i18nc("@info","The automatically generated crash "
- "information does not contain enough information to be "
- "helpful."),
- i18nc("@info","<note>You can improve it by "
- "installing debugging packages and reloading the crash on "
- "the Crash Information page. You can get help with the Bug "
- "Reporting Guide by clicking on the "
- "<interface>Help</interface> button.</note>"));
- //but this guide doesn't mention bt packages? that's techbase
- //->>and the help guide mention techbase page...
- }
- break;
- }
- }
-
- //User can provide enough information
- if (reportInterface()->isBugAwarenessPageDataUseful()) {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The information you can "
- "provide could be considered helpful."));
- } else {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","The information you can "
- "provide is not considered helpful enough in this case."));
- }
-
- if (isDuplicate) {
- explanationHTML += QString("<li>%1</li>").arg(i18nc("@info","Your problem has already been "
- "reported as bug <numid>%1</numid>.", reportInterface()->duplicateId()));
- }
-
- explanationHTML += QLatin1String("</ul></p>");
-
- ui.m_explanationLabel->setText(explanationHTML);
-
- //Hide the "Show contents of the report" button if the backtrace was not generated
- ui.m_showReportInformationButton->setVisible(backtraceGenerated);
-
- if (m_needToReport) {
- ui.m_conclusionsLabel->setText(QString("<p><strong>%1</strong>").arg(i18nc("@info","This "
- "report is considered helpful.")));
-
- if (m_isBKO) {
- emitCompleteChanged();
- ui.m_howToProceedLabel->setText(i18nc("@info","This application's bugs are reported "
- "to the KDE bug tracking system: click <interface>Next"
- "</interface> to start the reporting process. "
- "You can manually report at <link>%1</link>",
- reportAddress));
-
- } else {
- if (!DrKonqi::crashedApplication()->hasBeenRestarted()) {
- ui.m_restartAppOnFinish->setVisible(true);
- }
-
- ui.m_howToProceedLabel->setText(i18nc("@info","This application is not supported in the "
- "KDE bug tracking system. Click <interface>"
- "Finish</interface> to report this bug to "
- "the application maintainer. Also, you can manually "
- "report at <link>%1</link>.", reportAddress));
-
- emit finished(false);
- }
-
- } else { // (m_needToReport)
- if (!DrKonqi::crashedApplication()->hasBeenRestarted()) {
- ui.m_restartAppOnFinish->setVisible(true);
- }
-
- ui.m_conclusionsLabel->setText(QString("<p><strong>%1</strong><br />%2</p>").arg(
- i18nc("@info","This report does not contain enough information for the "
- "developers, so the automated bug reporting process is not "
- "enabled for this crash."),
- i18nc("@info","If you wish, you can go back and change your "
- "answers. ")));
-
- //Only mention "manual reporting" if the backtrace was generated.
- //FIXME separate the texts "manual reporting" / "click finish to close"
- //"manual reporting" should be ~"manual report using the contents of the report"....
- //FIXME for 4.5 (workflow, see ToDo)
- if (backtraceGenerated) {
- if (m_isBKO) {
- ui.m_howToProceedLabel->setText(i18nc("@info","You can manually report this bug "
- "at <link>%1</link>. "
- "Click <interface>Finish</interface> to close the "
- "assistant.",
- reportAddress));
- } else {
- ui.m_howToProceedLabel->setText(i18nc("@info","You can manually report this "
- "bug to its maintainer at <link>%1</link>. "
- "Click <interface>Finish</interface> to close the "
- "assistant.", reportAddress));
- }
- }
- emit finished(true);
- }
-}
-
-void ConclusionPage::aboutToHide()
-{
- assistant()->disconnect(SIGNAL(user1Clicked()), this, SLOT(finishClicked()));
-}
-
-void ConclusionPage::openReportInformation()
-{
- if (!m_infoDialog) {
- QString info = reportInterface()->generateReportFullText(false) + QLatin1Char('\n') +
- i18nc("@info/plain report to url/mail address","Report to %1",
- DrKonqi::crashedApplication()->bugReportAddress());
-
- m_infoDialog = new ReportInformationDialog(info);
- }
- m_infoDialog->show();
- m_infoDialog->raise();
- m_infoDialog->activateWindow();
-}
-
-bool ConclusionPage::isComplete()
-{
- return (m_isBKO && m_needToReport);
-}
-
-//END ConclusionPage
-
-//BEGIN ReportInformationDialog
-
-ReportInformationDialog::ReportInformationDialog(const QString & reportText)
- : KDialog()
-{
- KGlobal::ref();
- setAttribute(Qt::WA_DeleteOnClose, true);
-
- setButtons(KDialog::Close | KDialog::User1);
- setDefaultButton(KDialog::Close);
- setCaption(i18nc("@title:window","Contents of the Report"));
-
- ui.setupUi(mainWidget());
- ui.m_reportInformationBrowser->setPlainText(reportText);
-
- setButtonGuiItem(KDialog::User1, KGuiItem2(i18nc("@action:button", "&Save to File..."),
- KIcon("document-save"),
- i18nc("@info:tooltip", "Use this button to save the "
- "generated crash report information to "
- "a file. You can use this option to report the "
- "bug later.")));
- connect(this, SIGNAL(user1Clicked()), this, SLOT(saveReport()));
-
- setInitialSize(QSize(800, 600));
- KConfigGroup config(KGlobal::config(), "ReportInformationDialog");
- restoreDialogSize(config);
-}
-
-ReportInformationDialog::~ReportInformationDialog()
-{
- KConfigGroup config(KGlobal::config(), "ReportInformationDialog");
- saveDialogSize(config);
- KGlobal::deref();
-}
-
-void ReportInformationDialog::saveReport()
-{
- DrKonqi::saveReport(ui.m_reportInformationBrowser->toPlainText(), this);
-}
-
-//END ReportInformationDialog
-
+++ /dev/null
-/*******************************************************************
-* reportassistantpages_base.h
-* Copyright 2009 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#ifndef REPORTASSISTANTPAGES__BASE__H
-#define REPORTASSISTANTPAGES__BASE__H
-
-#include <QtCore/QPointer>
-
-#include "reportassistantdialog.h"
-#include "reportassistantpage.h"
-
-#include "ui_assistantpage_introduction.h"
-#include "ui_assistantpage_bugawareness.h"
-#include "ui_assistantpage_conclusions.h"
-#include "ui_assistantpage_conclusions_dialog.h"
-
-class BacktraceWidget;
-
-/** Introduction page **/
-class IntroductionPage: public ReportAssistantPage
-{
- Q_OBJECT
-
-public:
- explicit IntroductionPage(ReportAssistantDialog *);
-
-private:
- Ui::AssistantPageIntroduction ui;
-};
-
-/** Backtrace page **/
-class CrashInformationPage: public ReportAssistantPage
-{
- Q_OBJECT
-
-public:
- explicit CrashInformationPage(ReportAssistantDialog *);
-
- void aboutToShow();
- void aboutToHide();
- bool isComplete();
- bool showNextPage();
-
-private:
- BacktraceWidget * m_backtraceWidget;
-};
-
-/** Bug Awareness page **/
-class BugAwarenessPage: public ReportAssistantPage
-{
- Q_OBJECT
-
-public:
- explicit BugAwarenessPage(ReportAssistantDialog *);
-
- void aboutToShow();
- void aboutToHide();
-
-private Q_SLOTS:
- void showApplicationDetailsExamples();
-
- void updateCheckBoxes();
-
-private:
- Ui::AssistantPageBugAwareness ui;
-};
-
-/** Conclusions page **/
-class ConclusionPage : public ReportAssistantPage
-{
- Q_OBJECT
-
-public:
- explicit ConclusionPage(ReportAssistantDialog *);
-
- void aboutToShow();
- void aboutToHide();
-
- bool isComplete();
-
-private Q_SLOTS:
- void finishClicked();
-
- void openReportInformation();
-
-private:
- Ui::AssistantPageConclusions ui;
-
- QPointer<KDialog> m_infoDialog;
-
- bool m_isBKO;
- bool m_needToReport;
-
-Q_SIGNALS:
- void finished(bool);
-};
-
-class ReportInformationDialog : public KDialog
-{
- Q_OBJECT
-public:
- explicit ReportInformationDialog(const QString & reportText);
- ~ReportInformationDialog();
-
-private Q_SLOTS:
- void saveReport();
-
-private:
- Ui::AssistantPageConclusionsDialog ui;
-};
-
-#endif
+++ /dev/null
-/*******************************************************************
-* reportinterface.cpp
-* Copyright 2009,2010, 2011 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-* Copyright 2009 George Kiagiadakis <gkiagia@users.sourceforge.net>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#include "reportinterface.h"
-
-#include <KDebug>
-#include <KLocalizedString>
-
-#include "drkonqi.h"
-#include "systeminformation.h"
-#include "crashedapplication.h"
-#include "debuggermanager.h"
-#include "parser/backtraceparser.h"
-#include "backtracegenerator.h"
-#include "applicationdetailsexamples.h"
-
-ReportInterface::ReportInterface(QObject *parent)
- : QObject(parent),
- m_duplicate(0)
-{
- m_appDetailsExamples = new ApplicationDetailsExamples(this);
-
- //Information the user can provide about the crash
- m_userRememberCrashSituation = false;
- m_reproducible = ReproducibleUnsure;
- m_provideActionsApplicationDesktop = false;
- m_provideUnusualBehavior = false;
- m_provideApplicationConfigurationDetails = false;
-
- //Do not attach the bug report to any other existent report (create a new one)
- m_attachToBugNumber = 0;
-}
-
-void ReportInterface::setBugAwarenessPageData(bool rememberSituation,
- Reproducible reproducible, bool actions,
- bool unusual, bool configuration)
-{
- //Save the information the user can provide about the crash from the assistant page
- m_userRememberCrashSituation = rememberSituation;
- m_reproducible = reproducible;
- m_provideActionsApplicationDesktop = actions;
- m_provideUnusualBehavior = unusual;
- m_provideApplicationConfigurationDetails = configuration;
-}
-
-bool ReportInterface::isBugAwarenessPageDataUseful() const
-{
- //Determine if the assistant should proceed, considering the amount of information
- //the user can provide
- int rating = selectedOptionsRating();
-
- //Minimum information required even for a good backtrace.
- bool useful = m_userRememberCrashSituation &&
- (rating >= 2 || (m_reproducible==ReproducibleSometimes ||
- m_reproducible==ReproducibleEverytime));
- return useful;
-}
-
-int ReportInterface::selectedOptionsRating() const
-{
- //Check how many information the user can provide and generate a rating
- int rating = 0;
- if (m_provideActionsApplicationDesktop) {
- rating += 3;
- }
- if (m_provideApplicationConfigurationDetails) {
- rating += 2;
- }
- if (m_provideUnusualBehavior) {
- rating += 1;
- }
- return rating;
-}
-
-QString ReportInterface::backtrace() const
-{
- return m_backtrace;
-}
-
-void ReportInterface::setBacktrace(const QString & backtrace)
-{
- m_backtrace = backtrace;
-}
-
-QStringList ReportInterface::firstBacktraceFunctions() const
-{
- return m_firstBacktraceFunctions;
-}
-
-void ReportInterface::setFirstBacktraceFunctions(const QStringList & functions)
-{
- m_firstBacktraceFunctions = functions;
-}
-
-QString ReportInterface::title() const
-{
- return m_reportTitle;
-}
-
-void ReportInterface::setTitle(const QString & text)
-{
- m_reportTitle = text;
-}
-
-void ReportInterface::setDetailText(const QString & text)
-{
- m_reportDetailText = text;
-}
-
-void ReportInterface::setPossibleDuplicates(const QStringList & list)
-{
- m_possibleDuplicates = list;
-}
-
-QString ReportInterface::generateReportFullText(bool drKonqiStamp) const
-{
- //Note: no translations should be done in this function's strings
-
- const CrashedApplication * crashedApp = DrKonqi::crashedApplication();
- const SystemInformation * sysInfo = DrKonqi::systemInformation();
-
- QString report;
-
- //Program name and versions
- report.append(QString("Application: %1 (%2)\n").arg(crashedApp->fakeExecutableBaseName(),
- crashedApp->version()));
- report.append(QString("KDE Platform Version: %1").arg(sysInfo->kdeVersion()));
- if ( sysInfo->compiledSources() ) {
- report.append(QString(" (Compiled from sources)\n"));
- } else {
- report.append(QString("\n"));
- }
- report.append(QString("Qt Version: %1\n").arg(sysInfo->qtVersion()));
- report.append(QString("Operating System: %1\n").arg(sysInfo->operatingSystem()));
-
- //LSB output or manually selected distro
- if ( !sysInfo->lsbRelease().isEmpty() ) {
- report.append(QString("Distribution: %1\n").arg(sysInfo->lsbRelease()));
- }
- report.append(QLatin1String("\n"));
-
- //Details of the crash situation
- if (isBugAwarenessPageDataUseful()) {
- report.append(QString("-- Information about the crash:\n"));
- if (!m_reportDetailText.isEmpty()) {
- report.append(m_reportDetailText.trimmed());
- } else {
- //If the user manual reports this crash, he/she should know what to put in here.
- //This message is the only one translated in this function
- report.append(i18nc("@info/plain","<placeholder>In detail, tell us what you were doing "
- " when the application crashed.</placeholder>"));
- }
- report.append(QLatin1String("\n\n"));
- }
-
- //Crash reproducibility (only if useful)
- if (m_reproducible != ReproducibleUnsure) {
- if (m_reproducible == ReproducibleEverytime) {
- report.append(QString("The crash can be reproduced every time.\n\n"));
- } else if (m_reproducible == ReproducibleSometimes) {
- report.append(QString("The crash can be reproduced sometimes.\n\n"));
- } else if (m_reproducible == ReproducibleNever) {
- report.append(QString("The crash does not seem to be reproducible.\n\n"));
- }
- }
-
- //Backtrace
- report.append(QString("-- Backtrace:\n"));
- if (!m_backtrace.isEmpty()) {
- QString formattedBacktrace = m_backtrace.trimmed();
- report.append(formattedBacktrace + QLatin1String("\n"));
- } else {
- report.append(QString("A useful backtrace could not be generated\n"));
- }
-
- //Possible duplicates (selected by the user)
- if (!m_possibleDuplicates.isEmpty()) {
- report.append(QLatin1String("\n"));
- QString duplicatesString;
- Q_FOREACH(const QString & dupe, m_possibleDuplicates) {
- duplicatesString += QLatin1String("bug ") + dupe + QLatin1String(", ");
- }
- duplicatesString = duplicatesString.left(duplicatesString.length()-2) + '.';
- report.append(QString("The reporter indicates this bug may be a duplicate of or related to %1\n")
- .arg(duplicatesString));
- }
-
- //Several possible duplicates (by bugzilla query)
- if (!m_allPossibleDuplicatesByQuery.isEmpty()) {
- report.append(QLatin1String("\n"));
- QString duplicatesString;
- int count = m_allPossibleDuplicatesByQuery.count();
- for(int i=0; i < count && i < 5; i++) {
- duplicatesString += QLatin1String("bug ") + m_allPossibleDuplicatesByQuery.at(i) +
- QLatin1String(", ");
- }
- duplicatesString = duplicatesString.left(duplicatesString.length()-2) + '.';
- report.append(QString("Possible duplicates by query: %1\n").arg(duplicatesString));
- }
-
- if (drKonqiStamp) {
- report.append(QLatin1String("\nReported using DrKonqi"));
- }
-
- return report;
-}
-
-QString ReportInterface::generateAttachmentComment() const
-{
- //Note: no translations should be done in this function's strings
-
- const CrashedApplication * crashedApp = DrKonqi::crashedApplication();
- const SystemInformation * sysInfo = DrKonqi::systemInformation();
-
- QString comment;
-
- //Program name and versions
- comment.append(QString("%1 (%2) on KDE Platform %3 using Qt %4\n\n")
- .arg(crashedApp->fakeExecutableBaseName())
- .arg(crashedApp->version())
- .arg(sysInfo->kdeVersion())
- .arg(sysInfo->qtVersion()));
-
- //Details of the crash situation
- if (isBugAwarenessPageDataUseful()) {
- comment.append(QString("%1\n\n").arg(m_reportDetailText.trimmed()));
- }
-
- //Backtrace (only 6 lines)
- comment.append(QString("-- Backtrace (Reduced):\n"));
- QString reducedBacktrace =
- DrKonqi::debuggerManager()->backtraceGenerator()->parser()->simplifiedBacktrace();
- comment.append(reducedBacktrace.trimmed());
-
- return comment;
-}
-
-bool ReportInterface::isWorthReporting() const
-{
- //Evaluate if the provided information is useful enough to enable the automatic report
- bool needToReport = false;
-
- if (!m_userRememberCrashSituation) {
- //This should never happen... but...
- return false;
- }
-
- int rating = selectedOptionsRating();
-
- BacktraceParser::Usefulness use =
- DrKonqi::debuggerManager()->backtraceGenerator()->parser()->backtraceUsefulness();
-
- switch (use) {
- case BacktraceParser::ReallyUseful: {
- //Perfect backtrace: require at least one option or a 100%-50% reproducible crash
- needToReport = (rating >=2) ||
- (m_reproducible == ReproducibleEverytime || m_reproducible == ReproducibleSometimes);
- break;
- }
- case BacktraceParser::MayBeUseful: {
- //Not perfect backtrace: require at least two options or a 100% reproducible crash
- needToReport = (rating >=3) || (m_reproducible == ReproducibleEverytime);
- break;
- }
- case BacktraceParser::ProbablyUseless:
- //Bad backtrace: require at least two options and always reproducible (strict)
- needToReport = (rating >=5) && (m_reproducible == ReproducibleEverytime);
- break;
- case BacktraceParser::Useless:
- case BacktraceParser::InvalidUsefulness: {
- needToReport = false;
- }
- }
-
- return needToReport;
-}
-
-void ReportInterface::setAttachToBugNumber(uint bugNumber)
-{
- //If bugNumber>0, the report is going to be attached to bugNumber
- m_attachToBugNumber = bugNumber;
-}
-
-uint ReportInterface::attachToBugNumber() const
-{
- return m_attachToBugNumber;
-}
-
-void ReportInterface::setDuplicateId(uint duplicate)
-{
- m_duplicate = duplicate;
-}
-
-uint ReportInterface::duplicateId() const
-{
- return m_duplicate;
-}
-
-void ReportInterface::setPossibleDuplicatesByQuery(const QStringList & list)
-{
- m_allPossibleDuplicatesByQuery = list;
-}
-
-ApplicationDetailsExamples * ReportInterface::appDetailsExamples() const
-{
- return m_appDetailsExamples;
-}
-
-#include "reportinterface.moc"
+++ /dev/null
-/*******************************************************************
-* reportinterface.h
-* Copyright 2009, 2011 Dario Andres Rodriguez <andresbajotierra@gmail.com>
-* Copyright 2009 George Kiagiadakis <gkiagia@users.sourceforge.net>
-*
-* 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 2 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 <http://www.gnu.org/licenses/>.
-*
-******************************************************************/
-
-#ifndef REPORTINTERFACE__H
-#define REPORTINTERFACE__H
-
-#include <QtCore/QObject>
-#include <QtCore/QStringList>
-
-class BugReport;
-
-class ProductMapping;
-class ApplicationDetailsExamples;
-
-class ReportInterface : public QObject
-{
- Q_OBJECT
-public:
- enum Reproducible { ReproducibleUnsure, ReproducibleNever,
- ReproducibleSometimes, ReproducibleEverytime };
-
- explicit ReportInterface(QObject *parent = 0);
-
- void setBugAwarenessPageData(bool, Reproducible, bool, bool, bool);
- bool isBugAwarenessPageDataUseful() const;
-
- int selectedOptionsRating() const;
-
- QStringList firstBacktraceFunctions() const;
- void setFirstBacktraceFunctions(const QStringList & functions);
-
- QString backtrace() const;
- void setBacktrace(const QString & backtrace);
-
- QString title() const;
- void setTitle(const QString & text);
-
- void setDetailText(const QString & text);
- void setPossibleDuplicates(const QStringList & duplicatesList);
-
- QString generateReportFullText(bool drKonqiStamp) const;
-
- BugReport newBugReportTemplate() const;
- void sendBugReport() const;
-
- QStringList relatedBugzillaProducts() const;
-
- bool isWorthReporting() const;
-
- //Zero means creating a new bug report
- void setAttachToBugNumber(uint);
- uint attachToBugNumber() const;
-
- //Zero means there is no duplicate
- void setDuplicateId(uint);
- uint duplicateId() const;
-
- void setPossibleDuplicatesByQuery(const QStringList &);
-
- ApplicationDetailsExamples * appDetailsExamples() const;
-
- bool userCanProvideActionsAppDesktop() const {
- return m_provideActionsApplicationDesktop;
- }
-
- bool userCanProvideUnusualBehavior() const {
- return m_provideUnusualBehavior;
- }
-
- bool userCanProvideApplicationConfigDetails() const {
- return m_provideApplicationConfigurationDetails;
- }
-
-Q_SIGNALS:
- void reportSent(int);
- void sendReportError(const QString &, const QString &);
-
-private:
- QString generateAttachmentComment() const;
-
- //Information the user can provide
- bool m_userRememberCrashSituation;
- Reproducible m_reproducible;
- bool m_provideActionsApplicationDesktop;
- bool m_provideUnusualBehavior;
- bool m_provideApplicationConfigurationDetails;
-
-
- QString m_backtrace;
- QStringList m_firstBacktraceFunctions;
-
- QString m_reportTitle;
- QString m_reportDetailText;
- QStringList m_possibleDuplicates;
-
- QStringList m_allPossibleDuplicatesByQuery;
-
- uint m_attachToBugNumber;
- uint m_duplicate;
-
- ProductMapping * m_productMapping;
- ApplicationDetailsExamples * m_appDetailsExamples;
-};
-
-#endif
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AssistantPageBugAwareness</class>
- <widget class="QWidget" name="AssistantPageBugAwareness">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>508</width>
- <height>319</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QLabel" name="m_rememberLabel">
- <property name="text">
- <string comment="@label question"><strong>Do you remember what you were doing prior to the crash?</strong></string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_4">
- <item>
- <widget class="QRadioButton" name="m_rememberCrashSituationYes">
- <property name="text">
- <string comment="@option:radio "yes" to the question "do you remember what were you doing prior to the crash?"">Yes</string>
- </property>
- <attribute name="buttonGroup">
- <string>m_rememberGroup</string>
- </attribute>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="m_rememberCrashSituationNo">
- <property name="text">
- <string comment="@option:radio "No" to the question "do you remember what were you doing prior to the crash?"">No</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- <attribute name="buttonGroup">
- <string>m_rememberGroup</string>
- </attribute>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>10</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_reproducibleLabel">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string comment="@label question"><strong>Does the application crash again if you repeat the same situation?</strong></string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <spacer name="horizontalSpacer_4">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="KComboBox" name="m_reproducibleBox">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string comment="@info:tooltip">If you tried to repeat the situation, select how often the application crashes</string>
- </property>
- <property name="whatsThis">
- <string comment="@info:whatsthis">If you tried to repeat the situation, select how often the application crashes</string>
- </property>
- <item>
- <property name="text">
- <string comment="@item:inlistbox user didn't tried to repeat the crash situation">I did not try again</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string comment="@item:inlistbox the crash cannot be reproduce. reproduciblity->never">Never</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string comment="@item:inlistbox the bug can be reproduced sometimes">Sometimes</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string comment="@item:inlistbox the bug can be reproduced every time">Every time</string>
- </property>
- </item>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>10</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_informationLabel">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="text">
- <string comment="@label question"><strong>Please select which additional information you can provide:</strong></string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QCheckBox" name="m_actionsInsideApp">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string comment="@info:tooltip">Check this option if you can describe what were you doing inside the application before it crashed</string>
- </property>
- <property name="whatsThis">
- <string comment="@info:whatsthis">Check this option if you can describe what were you doing inside the application before it crashed</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QCheckBox" name="m_unusualSituation">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string comment="@info:tooltip">Check this option if you can describe any unusual behavior or appearance in the application or the whole desktop</string>
- </property>
- <property name="whatsThis">
- <string comment="@info:whatsthis">Check this option if you can describe any unusual behavior or appearance in the application or the whole desktop</string>
- </property>
- <property name="text">
- <string comment="@option:check kind of information the user can provide about the crash">Unusual desktop behavior I noticed</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <property name="spacing">
- <number>0</number>
- </property>
- <item>
- <widget class="QCheckBox" name="m_appSpecificDetails">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="toolTip">
- <string comment="@info:tooltip">Check this option if you can provide application specific details or settings that may be related to the crash. You can check the examples (if available.)</string>
- </property>
- <property name="whatsThis">
- <string comment="@info:whatsthis">Check this option if you can provide application specific details or settings that may be related to the crash. You can check the examples (if available.)</string>
- </property>
- <property name="text">
- <string comment="@option:check kind of information the user can provide about the crash">Custom settings of the application that may be related</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_6">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>10</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_appSpecificDetailsExamples">
- <property name="enabled">
- <bool>false</bool>
- </property>
- <property name="sizePolicy">
- <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="text">
- <string comment="@label clicking/hovering this, the user will get examples about application specific details s/he can provide"><a href="#">Examples</a></string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_5">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KComboBox</class>
- <extends>QComboBox</extends>
- <header>kcombobox.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
- <buttongroups>
- <buttongroup name="m_rememberGroup"/>
- </buttongroups>
-</ui>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AssistantPageConclusions</class>
- <widget class="QWidget" name="AssistantPageConclusions">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>506</width>
- <height>460</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="m_conclusionsLabel">
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="m_explanationLabel">
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_howToProceedLabel">
- <property name="text">
- <string/>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- <property name="openExternalLinks">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>5</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QCheckBox" name="m_restartAppOnFinish">
- <property name="text">
- <string>Restart the application when clicking the Finish button</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>5</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="KPushButton" name="m_showReportInformationButton"/>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>40</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KPushButton</class>
- <extends>QPushButton</extends>
- <header>kpushbutton.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AssistantPageConclusionsDialog</class>
- <widget class="QWidget" name="AssistantPageConclusionsDialog">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>466</width>
- <height>385</height>
- </rect>
- </property>
- <property name="minimumSize">
- <size>
- <width>450</width>
- <height>350</height>
- </size>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="KTextBrowser" name="m_reportInformationBrowser"/>
- </item>
- </layout>
- </widget>
- <customwidgets>
- <customwidget>
- <class>KTextBrowser</class>
- <extends>QTextBrowser</extends>
- <header>ktextbrowser.h</header>
- </customwidget>
- </customwidgets>
- <resources/>
- <connections/>
-</ui>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>AssistantPageIntroduction</class>
- <widget class="QWidget" name="AssistantPageIntroduction">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>536</width>
- <height>364</height>
- </rect>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="m_introLabel">
- <property name="text">
- <string comment="@info">This assistant will analyze the crash information and guide you through the bug reporting process.</string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_2">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>10</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QLabel" name="m_warningIcon">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
- <horstretch>0</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
- <property name="maximumSize">
- <size>
- <width>64</width>
- <height>64</height>
- </size>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeType">
- <enum>QSizePolicy::Fixed</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>10</width>
- <height>5</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="m_warningLabel">
- <property name="text">
- <string comment="@info note before starting the bug reporting process"><p><note>Since communication between you and the developers is required for effective debugging, to continue reporting this bug <strong>it is required for you to agree that developers may contact you.</strong></note></p><p>Feel free to close this dialog if you do not accept this.</p></string>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- <item>
- <spacer name="verticalSpacer">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>249</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>