You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

259 lines
8.1 KiB

/* -*- c++ -*-
attachmentlistview.cpp
KMail, the KDE mail client.
Copyright (c) 2003 Ingo Kloecker <kloecker@kde.org>
Copyright (c) 2007 Thomas McGuire <Thomas.McGuire@gmx.net>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License,
version 2.0, as published by the Free Software Foundation.
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, US
*/
#include "attachmentlistview.h"
#include <QHeaderView>
#include <QContextMenuEvent>
#include <QBuffer>
#include <klocale.h>
#include <maillistdrag.h>
#include "kmfolder.h"
#include "kmmsgdict.h"
#include "kmcommands.h"
#include "composer.h"
static const int encryptColumn = 5;
namespace KMail {
AttachmentListView::AttachmentListView( KMail::Composer * composer,
QWidget* parent )
: QTreeWidget( parent ),
mComposer( composer )
{
setDragDropMode( QAbstractItemView::DragDrop );
setObjectName( "attachment list view" );
setSelectionMode( QAbstractItemView::ExtendedSelection );
setIndentation( 0 );
setAllColumnsShowFocus( true );
QStringList headerNames;
headerNames << i18n("Name") << i18n("Size") << i18n("Encoding")
<< i18n("Type") << i18n("Compress") << i18n("Encrypt")
<< i18n("Sign");
setHeaderLabels( headerNames );
header()->setResizeMode( QHeaderView::Interactive );
header()->setResizeMode( 3, QHeaderView::Stretch );
header()->setStretchLastSection( false );
setColumnWidth( 0, 200);
setColumnWidth( 1, 80 );
setColumnWidth( 2, 120 );
setColumnWidth( 3, 120 );
setColumnWidth( 4, 100 );
setColumnWidth( 5, 80 );
setColumnWidth( 6, 80 );
// We can not enable automatic sorting, because that would resort the list
// when the list is sorted by size and the user clicks the compress checkbox.
header()->setSortIndicatorShown( true );
header()->setClickable( true );
connect( header(), SIGNAL(sectionClicked(int)), this, SLOT(slotSort()) );
enableCryptoCBs( false );
// This is needed because QTreeWidget forgets to update when a column is
// moved. It updates correctly when a column is resized, so trick it into
// thinking a column was resized when it is moved.
connect ( header(), SIGNAL(sectionMoved(int,int,int)),
header(), SIGNAL(sectionResized(int,int,int)) );
}
//-----------------------------------------------------------------------------
AttachmentListView::~AttachmentListView()
{
}
//-----------------------------------------------------------------------------
void AttachmentListView::enableCryptoCBs( bool enable )
{
bool enabledBefore = areCryptoCBsEnabled();
// Show the crypto columns if they were hidden before
if ( enable && !enabledBefore ) {
// determine the total width of the columns
int totalWidth = 0;
for ( int col = 0; col < encryptColumn; col++ )
totalWidth += header()->sectionSize( col );
int reducedTotalWidth = totalWidth - mEncryptColWidth - mSignColWidth;
// reduce the width of all columns so that the encrypt and sign columns fit
int usedWidth = 0;
for ( int col = 0; col < encryptColumn - 1; col++ ) {
int newWidth = header()->sectionSize( col ) * reducedTotalWidth /
totalWidth;
setColumnWidth( col, newWidth );
usedWidth += newWidth;
}
// the last column before the encrypt column gets the remaining space
// (because of rounding errors the width of this column isn't calculated
// the same way as the width of the other columns)
setColumnWidth( encryptColumn - 1, reducedTotalWidth - usedWidth );
setColumnWidth( encryptColumn, mEncryptColWidth );
setColumnWidth( encryptColumn + 1, mSignColWidth );
}
// Hide the crypto columns if they were shown before
if ( !enable && enabledBefore ) {
mEncryptColWidth = columnWidth( encryptColumn );
mSignColWidth = columnWidth( encryptColumn + 1 );
// determine the total width of the columns
int totalWidth = 0;
for( int col = 0; col < header()->count(); col++ )
totalWidth += header()->sectionSize( col );
int reducedTotalWidth = totalWidth - mEncryptColWidth - mSignColWidth;
// increase the width of all columns so that the visible columns take
// up the whole space
int usedWidth = 0;
for( int col = 0; col < encryptColumn - 1; col++ ) {
int newWidth = header()->sectionSize( col ) * totalWidth /
reducedTotalWidth;
setColumnWidth( col, newWidth );
usedWidth += newWidth;
}
// the last column before the encrypt column gets the remaining space
// (because of rounding errors the width of this column isn't calculated
// the same way as the width of the other columns)
setColumnWidth( encryptColumn - 1, totalWidth - usedWidth );
setColumnWidth( encryptColumn, 0 );
setColumnWidth( encryptColumn + 1, 0 );
}
}
//-----------------------------------------------------------------------------
bool AttachmentListView::areCryptoCBsEnabled()
{
return ( header()->sectionSize( encryptColumn ) != 0 );
}
//-----------------------------------------------------------------------------
void AttachmentListView::dragEnterEvent( QDragEnterEvent* e )
{
// Ignore drags from ourself
if ( e->source() == this )
e->ignore();
else {
KUrl::List uriList = KUrl::List::fromMimeData( e->mimeData() );
if( KPIM::MailList::canDecode( e->mimeData() ) || !uriList.isEmpty() )
e->setAccepted( true );
else
QTreeWidget::dragEnterEvent( e );
}
}
//-----------------------------------------------------------------------------
void AttachmentListView::dragMoveEvent( QDragMoveEvent* e )
{
KUrl::List uriList = KUrl::List::fromMimeData( e->mimeData() );
if( KPIM::MailList::canDecode( e->mimeData() ) || !uriList.isEmpty() )
e->setAccepted( true );
else
QTreeWidget::dragMoveEvent( e );
}
//-----------------------------------------------------------------------------
void AttachmentListView::dropEvent( QDropEvent* e )
{
const QMimeData *md = e->mimeData();
if( KPIM::MailList::canDecode( md ) ) {
e->accept();
// Decode the list of serial numbers stored as the drag data
QByteArray serNums = KPIM::MailList::serialsFromMimeData( md );
QBuffer serNumBuffer( &serNums );
serNumBuffer.open( QIODevice::ReadOnly );
QDataStream serNumStream( &serNumBuffer );
quint32 serNum;
KMFolder *folder = 0;
int idx;
QList<KMMsgBase*> messageList;
while( !serNumStream.atEnd() ) {
KMMsgBase *msgBase = 0;
serNumStream >> serNum;
KMMsgDict::instance()->getLocation( serNum, &folder, &idx );
if( folder )
msgBase = folder->getMsgBase( idx );
if( msgBase )
messageList.append( msgBase );
}
serNumBuffer.close();
uint identity = folder ? folder->identity() : 0;
KMCommand *command = new KMForwardAttachedCommand( mComposer, messageList,
identity, mComposer );
command->start();
}
else {
KUrl::List urlList = KUrl::List::fromMimeData( md );
if ( !urlList.isEmpty() ) {
e->accept();
for( KUrl::List::Iterator it = urlList.begin();
it != urlList.end(); ++it ) {
mComposer->addAttach( *it );
}
}
else {
QTreeWidget::dropEvent( e );
}
}
}
//-----------------------------------------------------------------------------
void AttachmentListView::keyPressEvent( QKeyEvent * e )
{
if ( e->key() == Qt::Key_Delete ) {
emit attachmentDeleted();
}
}
void AttachmentListView::startDrag( Qt::DropActions supportedActions )
{
Q_UNUSED( supportedActions );
emit dragStarted();
}
void AttachmentListView::contextMenuEvent( QContextMenuEvent* event )
{
emit rightButtonPressed( itemAt( event->pos() ) );
}
//-----------------------------------------------------------------------------
void AttachmentListView::slotSort()
{
sortByColumn( header()->sortIndicatorSection(), header()->sortIndicatorOrder() );
}
} // namespace KMail
#include "attachmentlistview.moc"