From 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kmail/kmmsgpartdlg.cpp | 452 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 452 insertions(+) create mode 100644 kmail/kmmsgpartdlg.cpp (limited to 'kmail/kmmsgpartdlg.cpp') diff --git a/kmail/kmmsgpartdlg.cpp b/kmail/kmmsgpartdlg.cpp new file mode 100644 index 00000000..63407aee --- /dev/null +++ b/kmail/kmmsgpartdlg.cpp @@ -0,0 +1,452 @@ +// kmmsgpartdlg.cpp + + +// my includes: +#include +#include "kmmsgpartdlg.h" + +// other KMail includes: +#include "kmmessage.h" +#include "kmmsgpart.h" +#include "kcursorsaver.h" + +// other kdenetwork includes: (none) + +// other KDE includes: +#include +#include +#include +#include +#include +#include +#include + +// other Qt includes: +#include +#include +#include +#include +#include + +// other includes: +#include + +static const struct { + KMMsgPartDialog::Encoding encoding; + const char * displayName; +} encodingTypes[] = { + { KMMsgPartDialog::SevenBit, I18N_NOOP("None (7-bit text)") }, + { KMMsgPartDialog::EightBit, I18N_NOOP("None (8-bit text)") }, + { KMMsgPartDialog::QuotedPrintable, I18N_NOOP("Quoted Printable") }, + { KMMsgPartDialog::Base64, I18N_NOOP("Base 64") }, +}; +static const int numEncodingTypes = + sizeof encodingTypes / sizeof *encodingTypes; + +KMMsgPartDialog::KMMsgPartDialog( const QString & caption, + QWidget * parent, const char * name ) + : KDialogBase( Plain, + caption.isEmpty() ? i18n("Message Part Properties") : caption, + Ok|Cancel|Help, Ok, parent, name, true, true) +{ + // tmp vars: + QGridLayout * glay; + QLabel * label; + QString msg; + + setHelp( QString::fromLatin1("attachments") ); + + for ( int i = 0 ; i < numEncodingTypes ; ++i ) + mI18nizedEncodings << i18n( encodingTypes[i].displayName ); + + glay = new QGridLayout( plainPage(), 9 /*rows*/, 2 /*cols*/, spacingHint() ); + glay->setColStretch( 1, 1 ); + glay->setRowStretch( 8, 1 ); + + // mimetype icon: + mIcon = new QLabel( plainPage() ); + mIcon->setPixmap( DesktopIcon("unknown") ); + glay->addMultiCellWidget( mIcon, 0, 1, 0, 0 ); + + // row 0: Type combobox: + mMimeType = new KComboBox( true, plainPage() ); + mMimeType->setInsertionPolicy( QComboBox::NoInsertion ); + mMimeType->setValidator( new KMimeTypeValidator( mMimeType ) ); + mMimeType->insertStringList( QStringList() + << QString::fromLatin1("text/html") + << QString::fromLatin1("text/plain") + << QString::fromLatin1("image/gif") + << QString::fromLatin1("image/jpeg") + << QString::fromLatin1("image/png") + << QString::fromLatin1("application/octet-stream") + << QString::fromLatin1("application/x-gunzip") + << QString::fromLatin1("application/zip") ); + connect( mMimeType, SIGNAL(textChanged(const QString&)), + this, SLOT(slotMimeTypeChanged(const QString&)) ); + glay->addWidget( mMimeType, 0, 1 ); + + msg = i18n("

The MIME type of the file:

" + "

normally, you do not need to touch this setting, since the " + "type of the file is automatically checked; but, sometimes, %1 " + "may not detect the type correctly -- here is where you can fix " + "that.

").arg( kapp->aboutData()->programName() ); + QWhatsThis::add( mMimeType, msg ); + + // row 1: Size label: + mSize = new QLabel( plainPage() ); + setSize( KIO::filesize_t(0) ); + glay->addWidget( mSize, 1, 1 ); + + msg = i18n("

The size of the part:

" + "

sometimes, %1 will only give an estimated size here, " + "because calculating the exact size would take too much time; " + "when this is the case, it will be made visible by adding " + "\"(est.)\" to the size displayed.

") + .arg( kapp->aboutData()->programName() ); + QWhatsThis::add( mSize, msg ); + + // row 2: "Name" lineedit and label: + mFileName = new KLineEdit( plainPage() ); + label = new QLabel( mFileName, i18n("&Name:"), plainPage() ); + glay->addWidget( label, 2, 0 ); + glay->addWidget( mFileName, 2, 1 ); + + msg = i18n("

The file name of the part:

" + "

although this defaults to the name of the attached file, " + "it does not specify the file to be attached; rather, it " + "suggests a file name to be used by the recipient's mail agent " + "when saving the part to disk.

"); + QWhatsThis::add( label, msg ); + QWhatsThis::add( mFileName, msg ); + + // row 3: "Description" lineedit and label: + mDescription = new KLineEdit( plainPage() ); + label = new QLabel( mDescription, i18n("&Description:"), plainPage() ); + glay->addWidget( label, 3, 0 ); + glay->addWidget( mDescription, 3, 1 ); + + msg = i18n("

A description of the part:

" + "

this is just an informational description of the part, " + "much like the Subject is for the whole message; most " + "mail agents will show this information in their message " + "previews alongside the attachment's icon.

"); + QWhatsThis::add( label, msg ); + QWhatsThis::add( mDescription, msg ); + + // row 4: "Encoding" combobox and label: + mEncoding = new QComboBox( false, plainPage() ); + mEncoding->insertStringList( mI18nizedEncodings ); + label = new QLabel( mEncoding, i18n("&Encoding:"), plainPage() ); + glay->addWidget( label, 4, 0 ); + glay->addWidget( mEncoding, 4, 1 ); + + msg = i18n("

The transport encoding of this part:

" + "

normally, you do not need to change this, since %1 will use " + "a decent default encoding, depending on the MIME type; yet, " + "sometimes, you can significantly reduce the size of the " + "resulting message, e.g. if a PostScript file does not contain " + "binary data, but consists of pure text -- in this case, choosing " + "\"quoted-printable\" over the default \"base64\" will save up " + "to 25% in resulting message size.

") + .arg( kapp->aboutData()->programName() ); + QWhatsThis::add( label, msg ); + QWhatsThis::add( mEncoding, msg ); + + // row 5: "Suggest automatic display..." checkbox: + mInline = new QCheckBox( i18n("Suggest &automatic display"), plainPage() ); + glay->addMultiCellWidget( mInline, 5, 5, 0, 1 ); + + msg = i18n("

Check this option if you want to suggest to the " + "recipient the automatic (inline) display of this part in the " + "message preview, instead of the default icon view;

" + "

technically, this is carried out by setting this part's " + "Content-Disposition header field to \"inline\" " + "instead of the default \"attachment\".

"); + QWhatsThis::add( mInline, msg ); + + // row 6: "Sign" checkbox: + mSigned = new QCheckBox( i18n("&Sign this part"), plainPage() ); + glay->addMultiCellWidget( mSigned, 6, 6, 0, 1 ); + + msg = i18n("

Check this option if you want this message part to be " + "signed;

" + "

the signature will be made with the key that you associated " + "with the currently-selected identity.

"); + QWhatsThis::add( mSigned, msg ); + + // row 7: "Encrypt" checkbox: + mEncrypted = new QCheckBox( i18n("Encr&ypt this part"), plainPage() ); + glay->addMultiCellWidget( mEncrypted, 7, 7, 0, 1 ); + + msg = i18n("

Check this option if you want this message part to be " + "encrypted;

" + "

the part will be encrypted for the recipients of this " + "message

"); + QWhatsThis::add( mEncrypted, msg ); + // (row 8: spacer) +} + + +KMMsgPartDialog::~KMMsgPartDialog() {} + + +QString KMMsgPartDialog::mimeType() const { + return mMimeType->currentText(); +} + +void KMMsgPartDialog::setMimeType( const QString & mimeType ) { + int dummy = 0; + QString tmp = mimeType; // get rid of const'ness + if ( mMimeType->validator() && mMimeType->validator()->validate( tmp, dummy ) ) + for ( int i = 0 ; i < mMimeType->count() ; ++i ) + if ( mMimeType->text( i ) == mimeType ) { + mMimeType->setCurrentItem( i ); + return; + } + mMimeType->insertItem( mimeType, 0 ); + mMimeType->setCurrentItem( 0 ); + slotMimeTypeChanged( mimeType ); +} + +void KMMsgPartDialog::setMimeType( const QString & type, + const QString & subtype ) { + setMimeType( QString::fromLatin1("%1/%2").arg(type).arg(subtype) ); +} + +void KMMsgPartDialog::setMimeTypeList( const QStringList & mimeTypes ) { + mMimeType->insertStringList( mimeTypes ); +} + +void KMMsgPartDialog::setSize( KIO::filesize_t size, bool estimated ) { + QString text = KIO::convertSize( size ); + if ( estimated ) + text = i18n("%1: a filesize incl. unit (e.g. \"1.3 KB\")", + "%1 (est.)").arg( text ); + mSize->setText( text ); +} + +QString KMMsgPartDialog::fileName() const { + return mFileName->text(); +} + +void KMMsgPartDialog::setFileName( const QString & fileName ) { + mFileName->setText( fileName ); +} + +QString KMMsgPartDialog::description() const { + return mDescription->text(); +} + +void KMMsgPartDialog::setDescription( const QString & description ) { + mDescription->setText( description ); +} + +KMMsgPartDialog::Encoding KMMsgPartDialog::encoding() const { + QString s = mEncoding->currentText(); + for ( unsigned int i = 0 ; i < mI18nizedEncodings.count() ; ++i ) + if ( s == *mI18nizedEncodings.at(i) ) + return encodingTypes[i].encoding; + kdFatal(5006) << "KMMsgPartDialog::encoding(): Unknown encoding encountered!" + << endl; + return None; // keep compiler happy +} + +void KMMsgPartDialog::setEncoding( Encoding encoding ) { + for ( int i = 0 ; i < numEncodingTypes ; ++i ) + if ( encodingTypes[i].encoding == encoding ) { + QString text = *mI18nizedEncodings.at(i); + for ( int j = 0 ; j < mEncoding->count() ; ++j ) + if ( mEncoding->text(j) == text ) { + mEncoding->setCurrentItem( j ); + return; + } + mEncoding->insertItem( text, 0 ); + mEncoding->setCurrentItem( 0 ); + } + kdFatal(5006) << "KMMsgPartDialog::setEncoding(): " + "Unknown encoding encountered!" << endl; +} + +void KMMsgPartDialog::setShownEncodings( int encodings ) { + mEncoding->clear(); + for ( int i = 0 ; i < numEncodingTypes ; ++i ) + if ( encodingTypes[i].encoding & encodings ) + mEncoding->insertItem( *mI18nizedEncodings.at(i) ); +} + +bool KMMsgPartDialog::isInline() const { + return mInline->isChecked(); +} + +void KMMsgPartDialog::setInline( bool inlined ) { + mInline->setChecked( inlined ); +} + +bool KMMsgPartDialog::isEncrypted() const { + return mEncrypted->isChecked(); +} + +void KMMsgPartDialog::setEncrypted( bool encrypted ) { + mEncrypted->setChecked( encrypted ); +} + +void KMMsgPartDialog::setCanEncrypt( bool enable ) { + mEncrypted->setEnabled( enable ); +} + +bool KMMsgPartDialog::isSigned() const { + return mSigned->isChecked(); +} + +void KMMsgPartDialog::setSigned( bool sign ) { + mSigned->setChecked( sign ); +} + +void KMMsgPartDialog::setCanSign( bool enable ) { + mSigned->setEnabled( enable ); +} + +void KMMsgPartDialog::slotMimeTypeChanged( const QString & mimeType ) { + // message subparts MUST have 7bit or 8bit encoding... +#if 0 + // ...but until KMail can recode 8bit messages on attach, so that + // they can be signed, we can't enforce this :-( + if ( mimeType.startsWith("message/") ) { + setEncoding( SevenBit ); + mEncoding->setEnabled( false ); + } else { + mEncoding->setEnabled( !mReadOnly ); + } +#endif + // find a mimetype icon: + int dummy = 0; + QString tmp = mimeType; // get rid of const'ness + if ( mMimeType->validator() && mMimeType->validator()->validate( tmp, dummy ) + == QValidator::Acceptable ) + mIcon->setPixmap( KMimeType::mimeType( mimeType )->pixmap( KIcon::Desktop ) ); + else + mIcon->setPixmap( DesktopIcon("unknown") ); +} + + + + +KMMsgPartDialogCompat::KMMsgPartDialogCompat( QWidget * parent, const char *, bool readOnly) + : KMMsgPartDialog(QString::null, parent ), mMsgPart( 0 ) +{ + setShownEncodings( SevenBit|EightBit|QuotedPrintable|Base64 ); + if (readOnly) + { + mMimeType->setEditable(false); + mMimeType->setEnabled(false); + mFileName->setReadOnly(true); + mDescription->setReadOnly(true); + mEncoding->setEnabled(false); + mInline->setEnabled(false); + mEncrypted->setEnabled(false); + mSigned->setEnabled(false); + } +} + +KMMsgPartDialogCompat::~KMMsgPartDialogCompat() {} + +void KMMsgPartDialogCompat::setMsgPart( KMMessagePart * aMsgPart ) +{ + mMsgPart = aMsgPart; + assert( mMsgPart ); + + QCString enc = mMsgPart->cteStr(); + if ( enc == "7bit" ) + setEncoding( SevenBit ); + else if ( enc == "8bit" ) + setEncoding( EightBit ); + else if ( enc == "quoted-printable" ) + setEncoding( QuotedPrintable ); + else + setEncoding( Base64 ); + + setDescription( mMsgPart->contentDescription() ); + setFileName( mMsgPart->fileName() ); + setMimeType( mMsgPart->typeStr(), mMsgPart->subtypeStr() ); + setSize( mMsgPart->decodedSize() ); + setInline( mMsgPart->contentDisposition() + .find( QRegExp("^\\s*inline", false) ) >= 0 ); +} + + +void KMMsgPartDialogCompat::applyChanges() +{ + if (!mMsgPart) return; + + KCursorSaver busy(KBusyPtr::busy()); + + // apply Content-Disposition: + QCString cDisp; + if ( isInline() ) + cDisp = "inline;"; + else + cDisp = "attachment;"; + + QString name = fileName(); + if ( !name.isEmpty() || !mMsgPart->name().isEmpty()) { + mMsgPart->setName( name ); + QCString encoding = KMMsgBase::autoDetectCharset( mMsgPart->charset(), + KMMessage::preferredCharsets(), name ); + if ( encoding.isEmpty() ) encoding = "utf-8"; + QCString encName = KMMsgBase::encodeRFC2231String( name, encoding ); + + cDisp += "\n\tfilename"; + if ( name != QString( encName ) ) + cDisp += "*=" + encName; + else + cDisp += "=\"" + encName.replace( '\\', "\\\\" ).replace( '"', "\\\"" ) + '"'; + mMsgPart->setContentDisposition( cDisp ); + } + + // apply Content-Description" + QString desc = description(); + if ( !desc.isEmpty() || !mMsgPart->contentDescription().isEmpty() ) + mMsgPart->setContentDescription( desc ); + + // apply Content-Type: + QCString type = mimeType().latin1(); + QCString subtype; + int idx = type.find('/'); + if ( idx < 0 ) + subtype = ""; + else { + subtype = type.mid( idx+1 ); + type = type.left( idx ); + } + mMsgPart->setTypeStr(type); + mMsgPart->setSubtypeStr(subtype); + + // apply Content-Transfer-Encoding: + QCString cte; + if (subtype == "rfc822" && type == "message") + kdWarning( encoding() != SevenBit && encoding() != EightBit, 5006 ) + << "encoding on rfc822/message must be \"7bit\" or \"8bit\"" << endl; + switch ( encoding() ) { + case SevenBit: cte = "7bit"; break; + case EightBit: cte = "8bit"; break; + case QuotedPrintable: cte = "quoted-printable"; break; + case Base64: default: cte = "base64"; break; + } + if ( cte != mMsgPart->cteStr().lower() ) { + QByteArray body = mMsgPart->bodyDecodedBinary(); + mMsgPart->setCteStr( cte ); + mMsgPart->setBodyEncodedBinary( body ); + } +} + + +//----------------------------------------------------------------------------- +void KMMsgPartDialogCompat::slotOk() +{ + applyChanges(); + KMMsgPartDialog::slotOk(); +} + + +//----------------------------------------------------------------------------- +#include "kmmsgpartdlg.moc" -- cgit v1.2.3