/*************************************************************************** * Copyright (C) 2005 by Nicolas Ternisien * * nicolas.ternisien@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, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ //TQt includes #include #include #include #include #include #include #include //KDE includes #include #include #include //For compatibility with old versions of KDE #include //Project includes #include "itemFactory.h" #include "parentLogLine.h" #include "logMode.h" #include "ksystemlogConfig.h" #include "logListItem.h" LogListItem::LogListItem(TQListView* list, LogLine* l) : TDEListViewItem(list), line(l) { } LogListItem::LogListItem(TQListViewItem* parent, LogLine* l) : TDEListViewItem(parent), line(l) { } LogListItem::~LogListItem() { } TQString LogListItem::getFormattedText() { return(ItemFactory::createFormattedText(line)); } TQString LogListItem::getToolTipText() { return(ItemFactory::createToolTipText(line)); } LogLine* LogListItem::getLogLine() { return(line); } int LogListItem::compare(TQListViewItem* it, int col, bool ascending) const { if (col==0) { LogListItem* item=dynamic_cast (it); if (item!=NULL) { if (line->getTime() < item->getTime()) return(-1); else if (line->getTime() == item->getTime()) return(0); else return(1); } return(1); } else { return(TQListViewItem::compare(it, col, ascending)); } } TQDateTime& LogListItem::getTime() { return(line->getTime()); } TQString LogListItem::exportToText() { int columnCount=listView()->columns(); TQString exporting; if (columnCount==0) return(exporting); int i=0; while(i0) { exporting.append('\t'); } exporting.append(this->text(i)); i++; } return(exporting); } /** * Method inspired from a paintCell method of Amarok. * Many thanks for the team (and the GPL, of course!) * TODO Retest this method */ void LogListItem::paintCell(TQPainter* p, const TQColorGroup& cg, int column, int width, int align) { /* For debugging TDEListViewItem::paintCell( p, cg, column, width, align ); return; */ //Get the TDEListView item TDEListView* lv = (TDEListView *) listView(); if (lv==NULL) { kdDebug() << "LogListItem::paintCell() : TDEListView null" << endl; TDEListViewItem::paintCell( p, cg, column, width, align ); return; } //flicker-free drawing static TQPixmap buffer; buffer.resize(width, height()); //If there is a problem, let TDEListViewItem class draw this item if( buffer.isNull() ) { kdDebug() << "LogListItem::paintCell() : TQPixmap null" << endl; TDEListViewItem::paintCell(p, cg, column, width, align); return; } //kdDebug() << "LogListItem::paintCell() : Painting the cell" << endl; //Initialize our drawing object TQPainter pBuf( &buffer, true ); //Use or not an alternate background #if defined(TDE_MAKE_VERSION) && TDE_VERSION >= TDE_MAKE_VERSION(3,4,0) if (line->isParentLogLine()==true && column==0) pBuf.fillRect( buffer.rect(), isSelected() ? cg.highlight() : cg.highlight() ); else pBuf.fillRect( buffer.rect(), isSelected() ? cg.highlight() : backgroundColor(column) ); #else pBuf.fillRect( buffer.rect(), isSelected() ? cg.highlight() : backgroundColor() ); #endif //Change the pen color pBuf.setPen(cg.button()); //Draw a line at the right pBuf.drawLine(width-1, 0, width-1, height()); //Gets the current font and font metric TQFont font(p->font()); TQFontMetrics fm(p->fontMetrics()); if (line->isParentLogLine()==true && column==0) { //Draw 3 gray lines around the parent item pBuf.setPen(cg.button()); pBuf.drawLine(0, 0, width, 0); pBuf.drawLine(0, height()-1, width, height()-1); //if (column==0) { pBuf.drawLine(width-1, 0, width-1, height()-1); pBuf.drawLine(0, 0, 0, height()-1); //} } //Draw the item name in bold if it is a recent one if (line->isRecent()==true && column==lv->columns()-1) font.setBold(true); //Draw in italic and bold if it's a parent item else if (line->isParentLogLine()==true && column==0) { font.setItalic(true); font.setBold(true); } //Normal drawing else font.setBold(false); pBuf.setFont(font); TQFontMetrics fmName(font); //Draw the pixmap m_loadingPix if (pixmap(column)) { pBuf.drawPixmap( (lv->treeStepSize() - pixmap(column)->width())/2, (height() - pixmap(column)->height())/2, *pixmap(column) ); } int text_x; if (column==0) text_x=lv->treeStepSize() + 3; else text_x=1; //If this is the first column and also a parent log line if (line->isParentLogLine()==true && column==0) { if (KSystemLogConfig::colorizeLogLines() && ((ParentLogLine*)line)->getGroupBy()==GROUP_BY_LOG_LEVEL) pBuf.setPen( isSelected() ? cg.text() : line->getLogLevel()->color); else pBuf.setPen( isSelected() ? cg.text() : cg.highlightedText()); } //If this is the last column and the colorizeLogLines options is enabled else if (KSystemLogConfig::colorizeLogLines() && column==lv->columns()-1) { pBuf.setPen( isSelected() ? cg.highlightedText() : line->getLogLevel()->color ); } //Normal line else { pBuf.setPen( isSelected() ? cg.highlightedText() : cg.text() ); } TQString name = text(column); if( fmName.width(name) + text_x + lv->itemMargin()*2 > width ) { int ellWidth = fmName.width( "..." ); TQString text = TQString::fromLatin1(""); int i = 0; int len = name.length(); while ( i < len && fmName.width( text + name[ i ] ) + ellWidth < width - text_x - lv->itemMargin()*2 ) { text += name[ i ]; i++; } name = text + "..."; } int textHeight = fm.lineSpacing() + lv->itemMargin() + 1; pBuf.drawText( text_x, 0, width, textHeight, AlignVCenter, name ); //End the draw pBuf.end(); p->drawPixmap( 0, 0, buffer ); } /* Amarok source code bool detailedView = PlaylistBrowser::instance()->viewMode() == PlaylistBrowser::DetailedView; //flicker-free drawing static TQPixmap buffer; buffer.resize( width, height() ); if( buffer.isNull() ) { TDEListViewItem::paintCell( p, cg, column, width, align ); return; } TQPainter pBuf( &buffer, true ); // use alternate background pBuf.fillRect( buffer.rect(), isSelected() ? cg.highlight() : backgroundColor() ); if( detailedView ) { // draw a line at the top pBuf.setPen( cg.text() ); pBuf.drawLine( 0, 0, width, 0 ); } TDEListView *lv = (TDEListView *)listView(); TQRect rect( ((lv->treeStepSize()-9) / 2) + 1, (height()-9) / 2, 9, 9 ); if( m_loading && m_loadingPix ) { pBuf.drawPixmap( (lv->treeStepSize() - m_loadingPix->width())/2, (height() - m_loadingPix->height())/2, *m_loadingPix ); } else if( m_trackCount ) { //draw +/- symbol to expande/collapse the playlist pBuf.setPen( cg.mid() ); pBuf.drawRect( rect ); //fill the rect with base color if the item has alternate color and viceversa TQColor color = backgroundColor() == lv->alternateBackground() ? cg.base() : lv->alternateBackground(); pBuf.fillRect( rect.x()+1, rect.y()+1, rect.width()-2, rect.height()-2, color ); // +/- drawing pBuf.setPen( cg.text() ); pBuf.drawLine( rect.x()+2, rect.y()+4, rect.x()+6, rect.y()+4 ); if( !isOpen() ) pBuf.drawLine( rect.x()+4, rect.y()+2, rect.x()+4, rect.y()+6 ); } TQFont font( p->font() ); TQFontMetrics fm( p->fontMetrics() ); // Use underlined font for "Current Playlist" if ( m_url.protocol() == "cur" ) font.setUnderline( true ); // Use italic font for "Cool-Streams" if ( text( 0 ) == "Cool-Streams" ) font.setItalic( true ); int text_x = lv->treeStepSize() + 3; int textHeight = detailedView ? fm.lineSpacing() + lv->itemMargin() + 1 : height(); pBuf.setPen( isSelected() ? cg.highlightedText() : cg.text() ); //if the playlist has been modified a save icon is shown if( m_modified && m_savePix ) { pBuf.drawPixmap( text_x, (textHeight - m_savePix->height())/2, *m_savePix ); text_x += m_savePix->width()+4; } else if( pixmap(0) ) { int y = (textHeight - pixmap(0)->height())/2; if( detailedView ) y++; pBuf.drawPixmap( text_x, y, *pixmap(0) ); text_x += pixmap(0)->width()+4; } // draw the playlist name in bold font.setBold( PlaylistBrowser::instance()->viewMode() == PlaylistBrowser::DetailedView ); pBuf.setFont( font ); TQFontMetrics fmName( font ); TQString name = text(0); if( fmName.width( name ) + text_x + lv->itemMargin()*2 > width ) { int ellWidth = fmName.width( "..." ); TQString text = TQString::fromLatin1(""); int i = 0; int len = name.length(); while ( i < len && fmName.width( text + name[ i ] ) + ellWidth < width - text_x - lv->itemMargin()*2 ) { text += name[ i ]; i++; } name = text + "..."; } pBuf.drawText( text_x, 0, width, textHeight, AlignVCenter, name ); if( detailedView ) { TQString info; text_x = lv->treeStepSize() + 3; font.setBold( false ); pBuf.setFont( font ); if ( m_url.protocol() != "cur" ) { if( m_loading ) info = i18n( "Loading..." ); else { //playlist loaded // draw the number of tracks and the total length of the playlist info += i18n("1 Track", "%n Tracks", m_trackCount); if( m_length ) info += TQString(" - [%2]").arg( MetaBundle::prettyTime( m_length ) ); } pBuf.drawText( text_x, textHeight, width, fm.lineSpacing(), AlignVCenter, info); } } pBuf.end(); p->drawPixmap( 0, 0, buffer ); */