00001
00002
00003
00004
00005
#include <config.h>
00006
#include "kmmsgpartdlg.h"
00007
00008
00009
#include "kmmessage.h"
00010
#include "kmmsgpart.h"
00011
#include "kcursorsaver.h"
00012
00013
00014
00015
00016
#include <kmimetype.h>
00017
#include <kapplication.h>
00018
#include <kiconloader.h>
00019
#include <kaboutdata.h>
00020
#include <kstringvalidator.h>
00021
#include <kcombobox.h>
00022
#include <kdebug.h>
00023
00024
00025
#include <qlabel.h>
00026
#include <qlayout.h>
00027
#include <qwhatsthis.h>
00028
#include <klineedit.h>
00029
#include <qcheckbox.h>
00030
00031
00032
#include <assert.h>
00033
00034
static const struct {
00035
KMMsgPartDialog::Encoding encoding;
00036
const char * displayName;
00037 } encodingTypes[] = {
00038 { KMMsgPartDialog::SevenBit, I18N_NOOP(
"None (7-bit text)") },
00039 { KMMsgPartDialog::EightBit, I18N_NOOP(
"None (8-bit text)") },
00040 { KMMsgPartDialog::QuotedPrintable, I18N_NOOP(
"Quoted Printable") },
00041 { KMMsgPartDialog::Base64, I18N_NOOP(
"Base 64") },
00042 };
00043
static const int numEncodingTypes =
00044
sizeof encodingTypes /
sizeof *encodingTypes;
00045
00046 KMMsgPartDialog::KMMsgPartDialog(
const QString & caption,
00047 QWidget * parent,
const char * name )
00048 : KDialogBase( Plain,
00049 caption.isEmpty() ? i18n("Message Part Properties") : caption,
00050 Ok|Cancel|Help, Ok, parent, name )
00051 {
00052
00053 QGridLayout * glay;
00054 QLabel * label;
00055 QString msg;
00056
00057 setHelp( QString::fromLatin1(
"attachments") );
00058
00059
for (
int i = 0 ; i < numEncodingTypes ; ++i )
00060 mI18nizedEncodings << i18n( encodingTypes[i].displayName );
00061
00062 glay =
new QGridLayout( plainPage(), 9 , 2 , spacingHint() );
00063 glay->setColStretch( 1, 1 );
00064 glay->setRowStretch( 8, 1 );
00065
00066
00067 mIcon =
new QLabel( plainPage() );
00068 mIcon->setPixmap( DesktopIcon(
"unknown") );
00069 glay->addMultiCellWidget( mIcon, 0, 1, 0, 0 );
00070
00071
00072 mMimeType =
new KComboBox(
true, plainPage() );
00073 mMimeType->setInsertionPolicy( QComboBox::NoInsertion );
00074 mMimeType->setValidator(
new KMimeTypeValidator( mMimeType ) );
00075 mMimeType->insertStringList( QStringList()
00076 << QString::fromLatin1(
"text/html")
00077 << QString::fromLatin1(
"text/plain")
00078 << QString::fromLatin1(
"image/gif")
00079 << QString::fromLatin1(
"image/jpeg")
00080 << QString::fromLatin1(
"image/png")
00081 << QString::fromLatin1(
"application/octet-stream")
00082 << QString::fromLatin1(
"application/x-gunzip")
00083 << QString::fromLatin1(
"application/zip") );
00084 connect( mMimeType, SIGNAL(textChanged(
const QString&)),
00085
this, SLOT(slotMimeTypeChanged(
const QString&)) );
00086 glay->addWidget( mMimeType, 0, 1 );
00087
00088 msg = i18n(
"<qt><p>The <em>MIME type</em> of the file.</p>"
00089
"<p>Normally, you don't need to touch this setting, since the "
00090
"type of the file is automatically checked. But sometimes, %1 "
00091
"may not detect the type correctly. Here's where you can fix "
00092
"that.</p></qt>").arg( kapp->aboutData()->programName() );
00093 QWhatsThis::add( mMimeType, msg );
00094
00095
00096 mSize =
new QLabel( plainPage() );
00097 setSize( KIO::filesize_t(0) );
00098 glay->addWidget( mSize, 1, 1 );
00099
00100 msg = i18n(
"<qt><p>The size of the part.</p>"
00101
"<p>Sometimes, %1 will only give an estimated size here, "
00102
"because calculating the exact size would take too much time. "
00103
"When this is the case, it will be made visible by adding "
00104
"\"(est.)\" to the size displayed.</p></qt>")
00105 .arg( kapp->aboutData()->programName() );
00106 QWhatsThis::add( mSize, msg );
00107
00108
00109 mFileName =
new KLineEdit( plainPage() );
00110 label =
new QLabel( mFileName, i18n(
"&Name:"), plainPage() );
00111 glay->addWidget( label, 2, 0 );
00112 glay->addWidget( mFileName, 2, 1 );
00113
00114 msg = i18n(
"<qt><p>The file name of the part.</p>"
00115
"<p>Although this defaults to the name of the attached file, "
00116
"it doesn't specify the file to be attached. Rather, it "
00117
"suggests a file name to be used by the recipient's mail agent "
00118
"when saving the part to disk.</p></qt>");
00119 QWhatsThis::add( label, msg );
00120 QWhatsThis::add( mFileName, msg );
00121
00122
00123 mDescription =
new KLineEdit( plainPage() );
00124 label =
new QLabel( mDescription, i18n(
"&Description:"), plainPage() );
00125 glay->addWidget( label, 3, 0 );
00126 glay->addWidget( mDescription, 3, 1 );
00127
00128 msg = i18n(
"<qt><p>A description of the part.</p>"
00129
"<p>This is just an informational description of the part, "
00130
"much like the Subject is for the whole message. Most "
00131
"mail agents will show this information in their message "
00132
"previews, alongside the attachment's icon.</p></qt>");
00133 QWhatsThis::add( label, msg );
00134 QWhatsThis::add( mDescription, msg );
00135
00136
00137 mEncoding =
new QComboBox(
false, plainPage() );
00138 mEncoding->insertStringList( mI18nizedEncodings );
00139 label =
new QLabel( mEncoding, i18n(
"&Encoding:"), plainPage() );
00140 glay->addWidget( label, 4, 0 );
00141 glay->addWidget( mEncoding, 4, 1 );
00142
00143 msg = i18n(
"<qt><p>The transport encoding of this part.</p>"
00144
"<p>Normally, you don't need to change this, since %1 will use "
00145
"a decent default encoding, depending on the MIME type. Yet "
00146
"sometimes, you can significantly reduce the size of the "
00147
"resulting message, e.g. if a PostScript file doesn't contain "
00148
"binary data, but consists of pure text. In this case, choosing "
00149
"\"quoted-printable\" over the default \"base64\" will save up "
00150
"to 25% in resulting message size.</p></qt>")
00151 .arg( kapp->aboutData()->programName() );
00152 QWhatsThis::add( label, msg );
00153 QWhatsThis::add( mEncoding, msg );
00154
00155
00156 mInline =
new QCheckBox( i18n(
"Suggest &automatic display"), plainPage() );
00157 glay->addMultiCellWidget( mInline, 5, 5, 0, 1 );
00158
00159 msg = i18n(
"<qt><p>Check this option if you want to suggest to the "
00160
"recipient the automatic (inline) display of this part in the "
00161
"message preview, instead of the default icon view.</p>"
00162
"<p>Technically, this is carried out by setting this part's "
00163
"<em>Content-Disposition</em> header field to \"inline\" "
00164
"instead of the default \"attachment\".</p></qt>");
00165 QWhatsThis::add( mInline, msg );
00166
00167
00168 mSigned =
new QCheckBox( i18n(
"&Sign this part"), plainPage() );
00169 glay->addMultiCellWidget( mSigned, 6, 6, 0, 1 );
00170
00171 msg = i18n(
"<qt><p>Check this option if you want this message part to be "
00172
"signed.</p>"
00173
"<p>The signature will be made with the key that you associated "
00174
"with the currently selected identity.</p></qt>");
00175 QWhatsThis::add( mSigned, msg );
00176
00177
00178 mEncrypted =
new QCheckBox( i18n(
"Encr&ypt this part"), plainPage() );
00179 glay->addMultiCellWidget( mEncrypted, 7, 7, 0, 1 );
00180
00181 msg = i18n(
"<qt><p>Check this option if you want this message part to be "
00182
"encrypted.</p>"
00183
"<p>The part will be encrypted for the recipients of this "
00184
"message</p></qt>");
00185 QWhatsThis::add( mEncrypted, msg );
00186
00187 }
00188
00189
00190 KMMsgPartDialog::~KMMsgPartDialog() {}
00191
00192
00193 QString
KMMsgPartDialog::mimeType()
const {
00194
return mMimeType->currentText();
00195 }
00196
00197 void KMMsgPartDialog::setMimeType(
const QString & mimeType ) {
00198
int dummy = 0;
00199 QString tmp = mimeType;
00200
if ( mMimeType->validator()->validate( tmp, dummy ) )
00201
for (
int i = 0 ; i < mMimeType->count() ; ++i )
00202
if ( mMimeType->text( i ) == mimeType ) {
00203 mMimeType->setCurrentItem( i );
00204
return;
00205 }
00206 mMimeType->insertItem( mimeType, 0 );
00207 mMimeType->setCurrentItem( 0 );
00208 slotMimeTypeChanged( mimeType );
00209 }
00210
00211 void KMMsgPartDialog::setMimeType(
const QString & type,
00212
const QString & subtype ) {
00213
setMimeType( QString::fromLatin1(
"%1/%2").arg(type).arg(subtype) );
00214 }
00215
00216 void KMMsgPartDialog::setMimeTypeList(
const QStringList & mimeTypes ) {
00217 mMimeType->insertStringList( mimeTypes );
00218 }
00219
00220 void KMMsgPartDialog::setSize( KIO::filesize_t size,
bool estimated ) {
00221 QString text = KIO::convertSize( size );
00222
if ( estimated )
00223 text = i18n(
"%1: a filesize incl. unit (e.g. \"1.3 KB\")",
00224
"%1 (est.)").arg( text );
00225 mSize->setText( text );
00226 }
00227
00228 QString
KMMsgPartDialog::fileName()
const {
00229
return mFileName->text();
00230 }
00231
00232 void KMMsgPartDialog::setFileName(
const QString & fileName ) {
00233 mFileName->setText( fileName );
00234 }
00235
00236 QString
KMMsgPartDialog::description()
const {
00237
return mDescription->text();
00238 }
00239
00240 void KMMsgPartDialog::setDescription(
const QString & description ) {
00241 mDescription->setText( description );
00242 }
00243
00244 KMMsgPartDialog::Encoding KMMsgPartDialog::encoding()
const {
00245 QString s = mEncoding->currentText();
00246
for (
unsigned int i = 0 ; i < mI18nizedEncodings.count() ; ++i )
00247
if ( s == *mI18nizedEncodings.at(i) )
00248
return encodingTypes[i].encoding;
00249 kdFatal(5006) <<
"KMMsgPartDialog::encoding(): Unknown encoding encountered!"
00250 << endl;
00251
return None;
00252 }
00253
00254 void KMMsgPartDialog::setEncoding( Encoding encoding ) {
00255
for (
int i = 0 ; i < numEncodingTypes ; ++i )
00256
if ( encodingTypes[i].encoding == encoding ) {
00257 QString text = *mI18nizedEncodings.at(i);
00258
for (
int j = 0 ; j < mEncoding->count() ; ++j )
00259
if ( mEncoding->text(j) == text ) {
00260 mEncoding->setCurrentItem( j );
00261
return;
00262 }
00263 mEncoding->insertItem( text, 0 );
00264 mEncoding->setCurrentItem( 0 );
00265 }
00266 kdFatal(5006) <<
"KMMsgPartDialog::setEncoding(): "
00267
"Unknown encoding encountered!" << endl;
00268 }
00269
00270 void KMMsgPartDialog::setShownEncodings(
int encodings ) {
00271 mEncoding->clear();
00272
for (
int i = 0 ; i < numEncodingTypes ; ++i )
00273
if ( encodingTypes[i].encoding & encodings )
00274 mEncoding->insertItem( *mI18nizedEncodings.at(i) );
00275 }
00276
00277 bool KMMsgPartDialog::isInline()
const {
00278
return mInline->isChecked();
00279 }
00280
00281 void KMMsgPartDialog::setInline(
bool inlined ) {
00282 mInline->setChecked( inlined );
00283 }
00284
00285 bool KMMsgPartDialog::isEncrypted()
const {
00286
return mEncrypted->isChecked();
00287 }
00288
00289 void KMMsgPartDialog::setEncrypted(
bool encrypted ) {
00290 mEncrypted->setChecked( encrypted );
00291 }
00292
00293 void KMMsgPartDialog::setCanEncrypt(
bool enable ) {
00294 mEncrypted->setEnabled( enable );
00295 }
00296
00297 bool KMMsgPartDialog::isSigned()
const {
00298
return mSigned->isChecked();
00299 }
00300
00301 void KMMsgPartDialog::setSigned(
bool sign ) {
00302 mSigned->setChecked( sign );
00303 }
00304
00305 void KMMsgPartDialog::setCanSign(
bool enable ) {
00306 mSigned->setEnabled( enable );
00307 }
00308
00309
void KMMsgPartDialog::slotMimeTypeChanged(
const QString & mimeType ) {
00310
00311
#if 0
00312
00313
00314
if ( mimeType.startsWith(
"message/") ) {
00315 setEncoding( SevenBit );
00316 mEncoding->setEnabled(
false );
00317 }
else {
00318 mEncoding->setEnabled( !mReadOnly );
00319 }
00320
#endif
00321
00322
int dummy = 0;
00323 QString tmp = mimeType;
00324
if ( mMimeType->validator()->validate( tmp, dummy )
00325 == QValidator::Acceptable )
00326 mIcon->setPixmap( KMimeType::mimeType( mimeType )->pixmap( KIcon::Desktop ) );
00327
else
00328 mIcon->setPixmap( DesktopIcon(
"unknown") );
00329 }
00330
00331
00332
00333
00334 KMMsgPartDialogCompat::KMMsgPartDialogCompat(
const char *,
bool readOnly)
00335 :
KMMsgPartDialog(), mMsgPart( 0 )
00336 {
00337
setShownEncodings( SevenBit|EightBit|QuotedPrintable|Base64 );
00338 mReadOnly = readOnly;
00339
if (readOnly)
00340 {
00341 mMimeType->setEnabled(
false);
00342 mFileName->setEnabled(
false);
00343 mDescription->setEnabled(
false);
00344 mEncoding->setEnabled(
false);
00345 mInline->setEnabled(
false);
00346 mEncrypted->setEnabled(
false);
00347 mSigned->setEnabled(
false);
00348 }
00349 }
00350
00351 KMMsgPartDialogCompat::~KMMsgPartDialogCompat() {}
00352
00353 void KMMsgPartDialogCompat::setMsgPart( KMMessagePart * aMsgPart )
00354 {
00355 mMsgPart = aMsgPart;
00356 assert( mMsgPart );
00357
00358 QCString enc = mMsgPart->cteStr();
00359
if ( enc ==
"7bit" )
00360 setEncoding( SevenBit );
00361
else if ( enc ==
"8bit" )
00362 setEncoding( EightBit );
00363
else if ( enc ==
"quoted-printable" )
00364 setEncoding( QuotedPrintable );
00365
else
00366 setEncoding( Base64 );
00367
00368 setDescription( mMsgPart->contentDescription() );
00369 setFileName( mMsgPart->fileName() );
00370 setMimeType( mMsgPart->typeStr(), mMsgPart->subtypeStr() );
00371 setSize( mMsgPart->decodedSize() );
00372 setInline( mMsgPart->contentDisposition()
00373 .find( QRegExp(
"^\\s*inline",
false) ) >= 0 );
00374 }
00375
00376
00377 void KMMsgPartDialogCompat::applyChanges()
00378 {
00379
if (!mMsgPart)
return;
00380
00381
KCursorSaver busy(KBusyPtr::busy());
00382
00383
00384 QCString cDisp;
00385
if (
isInline() )
00386 cDisp =
"inline;";
00387
else
00388 cDisp =
"attachment;";
00389
00390 QString name =
fileName();
00391
if ( !name.isEmpty() || !mMsgPart->name().isEmpty()) {
00392 mMsgPart->setName( name );
00393 QCString encoding = KMMsgBase::autoDetectCharset( mMsgPart->charset(),
00394 KMMessage::preferredCharsets(), name );
00395
if ( encoding.isEmpty() ) encoding =
"utf-8";
00396 QCString encName = KMMsgBase::encodeRFC2231String( name, encoding );
00397
00398 cDisp +=
"\n\tfilename";
00399
if ( name != QString( encName ) )
00400 cDisp +=
"*=" + encName;
00401
else
00402 cDisp +=
"=\"" + encName +
'"';
00403 mMsgPart->setContentDisposition( cDisp );
00404 }
00405
00406
00407 QString desc =
description();
00408
if ( !desc.isEmpty() || !mMsgPart->contentDescription().isEmpty() )
00409 mMsgPart->setContentDescription( desc );
00410
00411
00412 QCString type =
mimeType().latin1();
00413 QCString subtype;
00414
int idx = type.find(
'/');
00415
if ( idx < 0 )
00416 subtype =
"";
00417
else {
00418 subtype = type.mid( idx+1 );
00419 type = type.left( idx );
00420 }
00421 mMsgPart->setTypeStr(type);
00422 mMsgPart->setSubtypeStr(subtype);
00423
00424
00425 QCString cte;
00426
if (subtype ==
"rfc822" && type ==
"message")
00427 kdWarning(
encoding() != SevenBit &&
encoding() != EightBit, 5006 )
00428 <<
"encoding on rfc822/message must be \"7bit\" or \"8bit\"" << endl;
00429
switch (
encoding() ) {
00430
case SevenBit: cte =
"7bit";
break;
00431
case EightBit: cte =
"8bit";
break;
00432
case QuotedPrintable: cte =
"quoted-printable";
break;
00433
case Base64:
default: cte =
"base64";
break;
00434 }
00435
if ( cte != mMsgPart->cteStr().lower() ) {
00436 QByteArray body = mMsgPart->bodyDecodedBinary();
00437 mMsgPart->setCteStr( cte );
00438 mMsgPart->setBodyEncodedBinary( body );
00439 }
00440 }
00441
00442
00443
00444
void KMMsgPartDialogCompat::slotOk()
00445 {
00446
applyChanges();
00447 KMMsgPartDialog::slotOk();
00448 }
00449
00450
00451
00452
#include "kmmsgpartdlg.moc"