/*************************************************************************** messageoutput.cpp - description ------------------- begin : Thu Feb 24 2000 copyright : (C) 2000 by Yacovlev Alexander & Dmitry Poplavski (C) 2003-2005 Andras Mantia ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ // KDE includes #include #include #include #include #include #include #include // Qt includes #include #include #include #include "messageoutput.h" #include "messageitem.h" MessageOutput::MessageOutput(QWidget *parent, const char *name ) : QListBox(parent,name) { m_maxItems = 2000; QPalette pal = palette(); pal.setColor(QColorGroup::HighlightedText, pal.color(QPalette::Normal, QColorGroup::Text)); pal.setColor(QColorGroup::Highlight, pal.color(QPalette::Normal, QColorGroup::Mid)); setPalette(pal); setFocusPolicy( NoFocus ); m_popupMenu = new KPopupMenu(this); connect(this, SIGNAL(contextMenuRequested(QListBoxItem*, const QPoint&)), this, SLOT(showMenu(QListBoxItem*, const QPoint&))); m_popupMenu->insertItem( SmallIconSet("editcopy"), i18n("&Copy"), this, SLOT(copyContent()) ) ; m_popupMenu->insertItem( SmallIconSet("filesaveas"), i18n("&Save As..."), this, SLOT(saveContent()) ) ; m_popupMenu->insertSeparator(); m_popupMenu->insertItem( SmallIconSet("editclear"), i18n("Clear"), this, SLOT(clear()) ) ; connect( this, SIGNAL(clicked(QListBoxItem*)), SLOT(clickItem(QListBoxItem*)) ); } MessageOutput::~MessageOutput() { } MessageItem *MessageOutput::insertItem(const QString& s) { checkMaxItems(); MessageItem *it = new MessageItem(this, s); setBottomItem(count()>0?count()-1:0); return it; } void MessageOutput::addToLastItem(const QString& s) { int ind = count() - 1; if ( ind != -1 ) { MessageItem *it = dynamic_cast( item(ind) ); if ( it ) it->addText( s ); else changeItem( text( ind )+ s, ind ); } } void MessageOutput::showMessage(int line, int col, const QString &fileName, const QString& s, bool append) { MessageItem *it = 0L; QString message = s; int endPos; if ( !count() || (!append && !text(count()-1).stripWhiteSpace().isEmpty()) ) it = insertItem(""); while ( ( endPos = message.find('\n') ) != -1 ) { if (it) { it->setLine(line); it->setColumn(col); it->setFileName(fileName); } addToLastItem( message.left(endPos) ); it = insertItem(""); message.remove(0,endPos+1); } if (!message.isEmpty()) { if (it) { it->setLine(line); it->setColumn(col); it->setFileName(fileName); } addToLastItem( message); } setBottomItem(count()>0?count()-1:0); } void MessageOutput::showMessage(const QString& s, bool append) { showMessage(-1, -1, "", s, append); } void MessageOutput::checkMaxItems() { if ( count() >= m_maxItems ) removeItem( index(firstItem()) ); } void MessageOutput::clickItem( QListBoxItem * l_item ) { MessageItem *item = dynamic_cast(l_item); if ( item ) { // kdDebug(24000) << "Column: " << item->column() << endl; if ( item->line() != -1 ) emit clicked( item->fileName(), item->line() - 1, item->column() - 1); } } void MessageOutput::showMenu( QListBoxItem*, const QPoint& l_point ) { m_popupMenu->exec(l_point); } QString MessageOutput::content() { QString p_content; for (uint i=0; iclipboard()->setText(content(), QClipboard::Clipboard); } void MessageOutput::saveContent() { KURL url=KFileDialog::getSaveURL(QDir::currentDirPath(), i18n("*.log|Log Files (*.log)\n*|All Files"), this, i18n("Save Log File")); if (url.isEmpty()) return; QFileInfo fileinfo(url.path()); if (fileinfo.exists() && KMessageBox::warningContinueCancel(0, i18n("File
%1
already exists. Overwrite it?
") .arg(url.path()), QString::null, i18n("Overwrite")) == KMessageBox::Cancel) return; QFile file(url.path()); if (!file.open(IO_WriteOnly)) { KMessageBox::error(0, i18n("Cannot save log file
%1
") .arg(url.url())); return; } QTextStream textfile(&file); textfile << content(); file.close(); } #include "messageoutput.moc"