#include #include "kmmimeparttree.h" #include "kmreaderwin.h" #include "partNode.h" #include "kmmsgpart.h" #include "kmkernel.h" #include "kmcommands.h" #include #include #include #include #include #include #include #include KMMimePartTree::KMMimePartTree( KMReaderWin* readerWin, QWidget* parent, const char* name ) : KListView( parent, name ), mReaderWin( readerWin ), mSizeColumn(0) { setStyleDependantFrameWidth(); addColumn( i18n("Description") ); addColumn( i18n("Type") ); addColumn( i18n("Encoding") ); mSizeColumn = addColumn( i18n("Size") ); setColumnAlignment( 3, Qt::AlignRight ); restoreLayoutIfPresent(); connect( this, SIGNAL( clicked( QListViewItem* ) ), this, SLOT( itemClicked( QListViewItem* ) ) ); connect( this, SIGNAL( contextMenuRequested( QListViewItem*, const QPoint&, int ) ), this, SLOT( itemRightClicked( QListViewItem*, const QPoint& ) ) ); setSelectionMode( QListView::Extended ); setRootIsDecorated( false ); setAllColumnsShowFocus( true ); setShowToolTips( true ); setSorting(-1); } static const char configGroup[] = "MimePartTree"; KMMimePartTree::~KMMimePartTree() { saveLayout( KMKernel::config(), configGroup ); } void KMMimePartTree::restoreLayoutIfPresent() { // first column: soaks up the rest of the space: setColumnWidthMode( 0, Manual ); header()->setStretchEnabled( true, 0 ); // rest of the columns: if ( KMKernel::config()->hasGroup( configGroup ) ) { // there is a saved layout. use it... restoreLayout( KMKernel::config(), configGroup ); // and disable Maximum mode: for ( int i = 1 ; i < 4 ; ++i ) setColumnWidthMode( i, Manual ); } else { // columns grow with their contents: for ( int i = 1 ; i < 4 ; ++i ) setColumnWidthMode( i, Maximum ); } } void KMMimePartTree::itemClicked( QListViewItem* item ) { if ( const KMMimePartTreeItem * i = dynamic_cast( item ) ) { if( mReaderWin->mRootNode == i->node() ) mReaderWin->update( true ); // Force update else mReaderWin->setMsgPart( i->node() ); } else kdWarning(5006) << "Item was not a KMMimePartTreeItem!" << endl; } void KMMimePartTree::itemRightClicked( QListViewItem* item, const QPoint& point ) { // TODO: remove this member var? mCurrentContextMenuItem = dynamic_cast( item ); if ( 0 == mCurrentContextMenuItem ) { kdDebug(5006) << "Item was not a KMMimePartTreeItem!" << endl; } else { kdDebug(5006) << "\n**\n** KMMimePartTree::itemRightClicked() **\n**" << endl; QPopupMenu* popup = new QPopupMenu; popup->insertItem( SmallIcon("filesaveas"),i18n( "Save &As..." ), this, SLOT( slotSaveAs() ) ); popup->insertItem( i18n( "Save as &Encoded..." ), this, SLOT( slotSaveAsEncoded() ) ); popup->insertItem( i18n( "Save All Attachments..." ), this, SLOT( slotSaveAll() ) ); popup->exec( point ); delete popup; mCurrentContextMenuItem = 0; } } //----------------------------------------------------------------------------- void KMMimePartTree::slotSaveAs() { saveSelectedBodyParts( false ); } //----------------------------------------------------------------------------- void KMMimePartTree::slotSaveAsEncoded() { saveSelectedBodyParts( true ); } //----------------------------------------------------------------------------- void KMMimePartTree::saveSelectedBodyParts( bool encoded ) { QPtrList selected = selectedItems(); Q_ASSERT( !selected.isEmpty() ); if ( selected.isEmpty() ) return; QPtrListIterator it( selected ); QPtrList parts; while ( it.current() ) { parts.append( static_cast(it.current())->node() ); ++it; } mReaderWin->setUpdateAttachment(); KMSaveAttachmentsCommand *command = new KMSaveAttachmentsCommand( this, parts, mReaderWin->message(), encoded ); command->start(); } //----------------------------------------------------------------------------- void KMMimePartTree::slotSaveAll() { if( childCount() == 0) return; mReaderWin->setUpdateAttachment(); KMCommand *command = new KMSaveAttachmentsCommand( this, mReaderWin->message() ); command->start(); } //----------------------------------------------------------------------------- void KMMimePartTree::setStyleDependantFrameWidth() { // set the width of the frame to a reasonable value for the current GUI style int frameWidth; if( style().isA("KeramikStyle") ) frameWidth = style().pixelMetric( QStyle::PM_DefaultFrameWidth ) - 1; else frameWidth = style().pixelMetric( QStyle::PM_DefaultFrameWidth ); if ( frameWidth < 0 ) frameWidth = 0; if ( frameWidth != lineWidth() ) setLineWidth( frameWidth ); } //----------------------------------------------------------------------------- void KMMimePartTree::styleChange( QStyle& oldStyle ) { setStyleDependantFrameWidth(); KListView::styleChange( oldStyle ); } //----------------------------------------------------------------------------- void KMMimePartTree::correctSize( QListViewItem * item ) { if (!item) return; KIO::filesize_t totalSize = 0; QListViewItem * myChild = item->firstChild(); while ( myChild ) { totalSize += static_cast(myChild)->origSize(); myChild = myChild->nextSibling(); } if ( totalSize > static_cast(item)->origSize() ) item->setText( mSizeColumn, KIO::convertSize(totalSize) ); if ( item->parent() ) correctSize( item->parent() ); } //============================================================================= KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTree * parent, partNode* node, const QString & description, const QString & mimetype, const QString & encoding, KIO::filesize_t size ) : QListViewItem( parent, description, QString::null, // set by setIconAndTextForType() encoding, KIO::convertSize( size ) ), mPartNode( node ), mOrigSize(size) { if( node ) node->setMimePartTreeItem( this ); setIconAndTextForType( mimetype ); if ( parent ) parent->correctSize(this); } KMMimePartTreeItem::KMMimePartTreeItem( KMMimePartTreeItem * parent, partNode* node, const QString & description, const QString & mimetype, const QString & encoding, KIO::filesize_t size, bool revertOrder ) : QListViewItem( parent, description, QString::null, // set by setIconAndTextForType() encoding, KIO::convertSize( size ) ), mPartNode( node ), mOrigSize(size) { if( revertOrder && nextSibling() ){ QListViewItem* sib = nextSibling(); while( sib->nextSibling() ) sib = sib->nextSibling(); moveItem( sib ); } if( node ) node->setMimePartTreeItem( this ); setIconAndTextForType( mimetype ); if ( listView() ) static_cast(listView())->correctSize(this); } void KMMimePartTreeItem::setIconAndTextForType( const QString & mime ) { QString mimetype = mime.lower(); if ( mimetype.startsWith( "multipart/" ) ) { setText( 1, mimetype ); setPixmap( 0, SmallIcon("folder") ); } else if ( mimetype == "application/octet-stream" ) { setText( 1, i18n("Unspecified Binary Data") ); // don't show "Unknown"... setPixmap( 0, SmallIcon("unknown") ); } else { KMimeType::Ptr mtp = KMimeType::mimeType( mimetype ); setText( 1, (mtp && !mtp->comment().isEmpty()) ? mtp->comment() : mimetype ); setPixmap( 0, mtp ? mtp->pixmap( KIcon::Small) : SmallIcon("unknown") ); } } #include "kmmimeparttree.moc"