diff options
Diffstat (limited to 'src/libgui/log_view.cpp')
-rw-r--r-- | src/libgui/log_view.cpp | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/libgui/log_view.cpp b/src/libgui/log_view.cpp new file mode 100644 index 0000000..158c281 --- /dev/null +++ b/src/libgui/log_view.cpp @@ -0,0 +1,135 @@ +/*************************************************************************** + * Copyright (C) 2005 Nicolas Hadacek <hadacek@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. * + ***************************************************************************/ +#include "log_view.h" + +#include <qpopupmenu.h> +#include <qeventloop.h> +#include <qapplication.h> +#include <kiconloader.h> + +#include "global_config.h" +#include "common/gui/purl_gui.h" +#include "common/gui/misc_gui.h" + +Log::Widget::Widget(QWidget *parent, const char *name) + : QTextEdit(parent, name) +{ + setTextFormat(LogText); + setMinimumWidth(300); +} + +void Log::Widget::updateDebugLevel() +{ + setDebugLevel(GlobalConfig::debugLevel()); +} + +void Log::Widget::logExtra(const QString &text) +{ + _text += text; + if ( GlobalConfig::logOutputType()==GuiConsole ) fprintf(stdout, "%s", text.latin1()); +} + +void Log::Widget::doLog(LineType type, const QString &text, Action action) +{ + doLog(text, type.data().color, type.data().bold, action); +} + +void Log::Widget::doLog(DebugLevel level, const QString &text, Action action) +{ + doLog(text, level.data().color, false, action); +} + +void Log::Widget::doLog(const QString &text, const QString &color, bool bold, Action action) +{ + logExtra(text + "\n"); + QString s = QString("<font color=%1>").arg(color); + if (bold) s += "<b>"; + s += escapeXml(text); + if (bold) s += "</b>"; + s += "</font>"; + QTextEdit::append(s); + updateContents(); // #### fix bug in Qt (display is messed up) + ensureVisible(0, contentsHeight()); + if ( action==Immediate) + QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput); +} + +void Log::Widget::appendToLastLine(const QString &text) +{ + logExtra(text); + uint p = paragraphs() - 1; + insertAt(escapeXml(text), p, paragraphLength(p)); + updateContents(); // #### fix bug in Qt (display is messed up) + ensureVisible(0, contentsHeight()); + // immediately visible... + QApplication::eventLoop()->processEvents(QEventLoop::ExcludeUserInput); +} + +QPopupMenu *Log::Widget::createPopupMenu(const QPoint &pos) +{ + updateDebugLevel(); + _popup = QTextEdit::createPopupMenu(pos); + KIconLoader loader; + QIconSet iset = loader.loadIconSet("filesave", KIcon::Small, 0); + _popup->insertItem(iset, "Save As...", this, SLOT(saveAs())); + iset = loader.loadIconSet("fileclose", KIcon::Small, 0); + _popup->insertItem(iset, "Clear", this, SLOT(clear())); + _popup->insertSeparator(); + FOR_EACH(DebugLevel, level) { + _id[level.type()] = _popup->insertItem(level.label()); + _popup->setItemChecked(_id[level.type()], _debugLevel==level); + } + _popup->insertSeparator(); + int id = _popup->insertItem(i18n("Output in console"), this, SLOT(toggleConsoleOutput())); + _popup->setItemChecked(id, GlobalConfig::logOutputType()==GuiConsole); + connect(_popup, SIGNAL(activated(int)), SLOT(toggleVisible(int))); + return _popup; +} + +void Log::Widget::toggleVisible(int id) +{ + FOR_EACH(DebugLevel, level) { + if ( _id[level.type()]==id ) { + _debugLevel = level; + GlobalConfig::writeDebugLevel(level); + break; + } + } +} + +void Log::Widget::toggleConsoleOutput() +{ + GlobalConfig::writeLogOutputType(GlobalConfig::logOutputType()==GuiOnly ? GuiConsole : GuiOnly); +} + +void Log::Widget::sorry(const QString &message, const QString &details) +{ + logExtra(message + " [" + details + "]\n"); + MessageBox::detailedSorry(message, details, Log::Show); +} + +bool Log::Widget::askContinue(const QString &message) +{ + bool ok = MessageBox::askContinue(message); + logExtra(message + " [" + (ok ? "continue" : "cancel") + "]\n"); + return ok; +} + +void Log::Widget::clear() +{ + QTextEdit::clear(); + _text = QString::null; +} + +void Log::Widget::saveAs() +{ + PURL::Url url = PURL::getSaveUrl(":save_log", "text/x-log", this, i18n("Save log to file"), PURL::AskOverwrite); + if ( url.isEmpty() ) return; + url.write(_text, *this); +} |