00001
00002
00003
00004
00005
#ifndef __KMComposeWin
00006
#define __KMComposeWin
00007
00008
#include "kmtopwidget.h"
00009
00010
#include <qlabel.h>
00011
#include <qlistview.h>
00012
00013
#include <qcheckbox.h>
00014
#include <qpushbutton.h>
00015
#include <qclipboard.h>
00016
#include <qpalette.h>
00017
#include <qfont.h>
00018
#include <qptrlist.h>
00019
00020
#include <klineedit.h>
00021
#include <kio/job.h>
00022
#include <kglobalsettings.h>
00023
#include <kdeversion.h>
00024
#include <keditcl.h>
00025
00026
#include <kpgp.h>
00027
00028
#include "kmmsgpart.h"
00029
#include "kmmsgbase.h"
00030
#include "mailcomposerIface.h"
00031
00032
#include "cryptplugwrapper.h"
00033
#include <kabc/addresslineedit.h>
00034
00035
class _StringPair {
00036
public:
00037 QString name;
00038 QString value;
00039 };
00040
00041
class QCloseEvent;
00042
class QComboBox;
00043
class QFrame;
00044
class QGridLayout;
00045
class QLineEdit;
00046
class QListView;
00047
class QPopupMenu;
00048
class QPushButton;
00049
class QCString;
00050
class KCompletion;
00051
class KEdit;
00052
class KMComposeWin;
00053
class KMFolderComboBox;
00054
class KMMessage;
00055
class KProcess;
00056
class KDirWatch;
00057
class KSelectAction;
00058
class KSpell;
00059
class KSpellConfig;
00060
class KDictSpellingHighlighter;
00061
class KStatusBar;
00062
class KAction;
00063
class KToggleAction;
00064
class KTempFile;
00065
class KToolBar;
00066
class KToggleAction;
00067
class KURL;
00068
class IdentityCombo;
00069
class SpellingFilter;
00070
class CryptPlugWrapperList;
00071
00072
namespace KMail {
00073
class AttachmentListView;
00074
class DictionaryComboBox;
00075 }
00076
00077
typedef QPtrList<KMMessagePart> KMMsgPartList;
00078
00079
00080
00081
class KMEdit:
public KEdit
00082 {
00083 Q_OBJECT
00084
public:
00085 KMEdit(QWidget *parent=0,KMComposeWin* composer=0,
00086 KSpellConfig* spellConfig = 0,
00087
const char *name=0);
00088
virtual ~KMEdit();
00089
00093
void spellcheck();
00094
00098 QString brokenText();
00099
00103
void setUseExternalEditor(
bool use ) { mUseExtEditor = use; }
00104
void setExternalEditorPath(
const QString & path ) { mExtEditor = path; }
00105
00112
bool checkExternalEditorFinished();
00113
00114
00116
void contentsDragEnterEvent(QDragEnterEvent *e);
00117
void contentsDragMoveEvent(QDragMoveEvent *e);
00118
void contentsDropEvent(QDropEvent *e);
00119
00120 signals:
00121
void spellcheck_done(
int result);
00122
public slots:
00123
void slotAutoSpellCheckingToggled(
bool );
00124
void slotSpellcheck2(KSpell*);
00125
void slotSpellResult(
const QString&);
00126
void slotSpellDone();
00127
void slotExternalEditorDone(KProcess*);
00128
void slotMisspelling(
const QString &,
const QStringList &,
unsigned int);
00129
void slotCorrected (
const QString &,
const QString &,
unsigned int);
00130
void addSuggestion(
const QString& text,
const QStringList& lst,
unsigned int );
00131
virtual void cut();
00132
virtual void clear();
00133
virtual void del();
00134
protected:
00138
virtual bool eventFilter(QObject*, QEvent*);
00139
virtual void keyPressEvent( QKeyEvent* );
00140
00141 KMComposeWin* mComposer;
00142
00143
private slots:
00144
void slotExternalEditorTempFileChanged(
const QString & fileName );
00145
00146
private:
00147
void killExternalEditor();
00148
void initializeAutoSpellChecking( KSpellConfig* autoSpellConfig );
00149
00150
private:
00151 KSpell *mKSpell;
00152 QMap<QString,QStringList> mReplacements;
00153 SpellingFilter* mSpellingFilter;
00154 KTempFile *mExtEditorTempFile;
00155 KDirWatch *mExtEditorTempFileWatcher;
00156 KProcess *mExtEditorProcess;
00157
bool mUseExtEditor;
00158 QString mExtEditor;
00159
bool mWasModifiedBeforeSpellCheck;
00160 KDictSpellingHighlighter *mSpellChecker;
00161
bool mSpellLineEdit;
00162 };
00163
00164
00165
00166
class KMLineEdit :
public KABC::AddressLineEdit
00167 {
00168 Q_OBJECT
00169
public:
00170 KMLineEdit(KMComposeWin* composer,
bool useCompletion, QWidget *parent = 0,
00171
const char *name = 0);
00172
protected:
00173
00174
virtual void loadAddresses();
00189
virtual void keyPressEvent(QKeyEvent*);
00190
private:
00191 KMComposeWin* mComposer;
00192 };
00193
00194
00195
class KMLineEditSpell :
public KMLineEdit
00196 {
00197 Q_OBJECT
00198
public:
00199 KMLineEditSpell(KMComposeWin* composer,
bool useCompletion, QWidget *parent = 0,
00200
const char *name = 0);
00201
void highLightWord(
unsigned int length,
unsigned int pos );
00202
void spellCheckDone(
const QString &s );
00203
void spellCheckerMisspelling(
const QString &text,
const QStringList &,
unsigned int pos);
00204
void spellCheckerCorrected(
const QString &old,
const QString &corr,
unsigned int pos);
00205 };
00206
00207
00208
00209
class KMAtmListViewItem :
public QObject,
public QListViewItem
00210 {
00211 Q_OBJECT
00212
friend class KMComposeWin;
00213
00214
public:
00215 KMAtmListViewItem(QListView * parent);
00216
virtual ~KMAtmListViewItem();
00217
virtual void paintCell( QPainter * p,
const QColorGroup & cg,
00218
int column,
int width,
int align );
00219
00220
protected:
00221
void enableCryptoCBs(
bool on);
00222
void setEncrypt(
bool on);
00223
bool isEncrypt();
00224
void setSign(
bool on);
00225
bool isSign();
00226
00227
private:
00228 QListView* mListview;
00229 QCheckBox* mCBEncrypt;
00230 QCheckBox* mCBSign;
00231
bool mCBSignEnabled, mCBEncryptEnabled;
00232 };
00233
00234
00235
class KMHeaders;
00236
00237
00238
class KMComposeWin :
public KMTopLevelWidget,
virtual public MailComposerIface
00239 {
00240 Q_OBJECT
00241
friend class KMHeaders;
00242
00243
public:
00244 KMComposeWin( KMMessage* msg=0, uint identity=0 );
00245 ~KMComposeWin();
00246
00250
void send(
int how);
00251
void addAttachment(KURL url,QString comment);
00252
void addAttachment(
const QString &name,
00253
const QCString &cte,
00254
const QByteArray &data,
00255
const QCString &type,
00256
const QCString &subType,
00257
const QCString ¶mAttr,
00258
const QString ¶mValue,
00259
const QCString &contDisp);
00260
void setBody (QString body);
00261
00265
virtual bool event(QEvent *e);
00266
00270
void readColorConfig();
00271
00275
void writeConfig(
void);
00276
00281
void verifyWordWrapLengthIsAdequate(
const QString&);
00282
00287
void setMsg(KMMessage* newMsg,
bool mayAutoSign=TRUE,
00288
bool allowDecryption=FALSE,
bool isModified=FALSE);
00289
00294 KMMessage* msg(
void)
const {
return mMsg; }
00295
00303
bool applyChanges(
bool backgroundMode =
false );
00304
00312 Kpgp::Result composeMessage( QCString pgpUserId,
00313 KMMessage& theMessage,
00314
bool doSign,
00315
bool doEncrypt,
00316
bool ignoreBcc,
00317 QCString& signCertFingerprint );
00318
00323
inline void setAutoDelete(
bool f) { mAutoDeleteMsg = f; }
00324
00329
void setFolder(
KMFolder* aFolder) { mFolder = aFolder; }
00330
00334
void setCharset(
const QCString& aCharset,
bool forceDefault = FALSE);
00335
00341
void setReplyFocus(
bool hasMessage =
true );
00342
00347
void setFocusToSubject();
00348
00349
00355
static QString prettyMimeType(
const QString& type );
00356 QString quotePrefixName() const;
00357
00358 KMLineEditSpell *sujectLineWidget()
const {
return mEdtSubject;}
00359
public slots:
00363
void slotPrint();
00364
void slotAttachFile();
00365
void slotSendNow();
00366
void slotSendLater();
00370
bool slotSaveDraft();
00371
void slotNewComposer();
00372
void slotNewMailReader();
00373
void slotClose();
00374
void slotHelp();
00375
00376
void slotFind();
00377
void slotReplace();
00378
void slotUndo();
00379
void slotRedo();
00380
void slotCut();
00381
void slotCopy();
00382
void slotPaste();
00383
void slotPasteAsQuotation();
00384
void slotAddQuotes();
00385
void slotRemoveQuotes();
00386
00387
void slotMarkAll();
00388
00389
void slotFolderRemoved(
KMFolder*);
00390
00397
void slotSetAlwaysSend(
bool bAlwaysSend );
00398
00402
void slotUpdateFont();
00403
00407
void slotAddrBook();
00411
void slotInsertFile();
00412
00413
void slotSetCharset();
00417
void slotSpellcheck();
00418
void slotSpellcheckConfig();
00419
00424
void slotSelectCryptoModule();
00425
00429
void slotStatusMessage(
const QString &message);
00430
void slotEditToolbars();
00431
void slotUpdateToolbars();
00432
void slotEditKeys();
00436
void readConfig(
void);
00440
void slotUpdWinTitle(
const QString& );
00441
00446
void slotEncryptToggled(
bool);
00447
00451
void slotSignToggled(
bool);
00452
00456
void slotWordWrapToggled(
bool);
00457
00461
void slotAppendSignature();
00462
00466
void slotInsertMyPublicKey();
00467
00471
void slotInsertPublicKey();
00472
00476
void slotUpdateAttachActions();
00477
00481
void slotAttachPopupMenu(QListViewItem *,
const QPoint &,
int);
00482
00487
int currentAttachmentNum();
00488
00492
void slotAttachView();
00493
void slotAttachRemove();
00494
void slotAttachSave();
00495
void slotAttachProperties();
00496
00497
00502
void slotAddrBookTo();
00503
void slotAddrBookFrom();
00504
void slotAddrBookReplyTo();
00505
00506
void slotCleanSpace();
00507
00508
00509
00510
void slotSpellcheckDone(
int result);
00511
void slotSpellcheckDoneClearStatus();
00512
00516
void deadLetter(
void);
00517
00518
void updateCursorPosition();
00519
00520
void slotView();
00521
00525
void focusNextPrevEdit(
const QWidget* current,
bool next);
00526
00530
void slotIdentityChanged(uint);
00531
00535
void slotAttachFileData(KIO::Job *,
const QByteArray &);
00536
void slotAttachFileResult(KIO::Job *);
00537
00538
void addAttach(
const KURL url);
00539
00543
void addAttach(
const KMMessagePart* msgPart);
00544
00545 signals:
00549
void messageQueuedOrDrafted();
00550
00551
protected:
00557
void rethinkFields(
bool fromslot=
false);
00558
00562
void rethinkHeaderLine(
int value,
int mask,
int& row,
00563
const QString& labelStr, QLabel* lbl,
00564 QLineEdit* edt, QPushButton* btn=0);
00565
void rethinkHeaderLine(
int value,
int mask,
int& row,
00566
const QString& labelStr, QLabel* lbl,
00567 QComboBox* cbx, QCheckBox *chk);
00568
00572
void setupActions();
00573
void setupStatusBar();
00574
void setupEditor();
00575
00576
00580 QString subject(
void)
const {
return mEdtSubject->text(); }
00581 QString to(
void)
const {
return mEdtTo->text(); }
00582 QString cc(
void)
const
00583
{
return (mEdtCc->isHidden()) ? QString::null : mEdtCc->text(); }
00584 QString bcc(
void)
const
00585
{
return (mEdtBcc->isHidden()) ? QString::null : mEdtBcc->text(); }
00586 QString from(
void)
const {
return mEdtFrom->text(); }
00587 QString replyTo(
void)
const {
return mEdtReplyTo->text(); }
00588
00594
void setFcc(
const QString &idString );
00595
00599
virtual bool queryClose ();
00603
virtual bool queryExit ();
00604
00608
void viewAttach(
int index );
00609
00613
void removeAttach(
const QString &url);
00614
void removeAttach(
int idx);
00615
00619
void msgPartToItem(
const KMMessagePart* msgPart, KMAtmListViewItem *lvi);
00620
00625
void addrBookSelInto();
00626
00627
private:
00632
void setEncryption(
bool encrypt,
bool setByUser =
false );
00633
00638
void setSigning(
bool sign,
bool setByUser =
false );
00639
00643
bool userForgotAttachment();
00644
00650 QCString breakLinesAndApplyCodec();
00651
00657 QByteArray pgpSignedMsg( QCString cText,
00658 StructuringInfoWrapper& structuring,
00659 QCString& signCertFingerprint );
00660
00666 Kpgp::Result pgpEncryptedMsg( QByteArray & rEncryptedBody,
00667 QCString cText,
00668 StructuringInfoWrapper& structuring,
00669 QCString& encryptCertFingerprints );
00670
00674 QCString getEncryptionCertificate(
const QString& recipient );
00675
00679
bool checkForEncryptCertificateExpiry(
const QString& recipient,
00680
const QCString& certFingerprint );
00681
00693
bool processStructuringInfo(
const QString bugURL,
00694 uint boundaryLevel,
00695
const QString contentDescriptionClear,
00696
const QCString contentTypeClear,
00697
const QCString contentSubtypeClear,
00698
const QCString contentDispClear,
00699
const QCString contentTEncClear,
00700
const QCString& bodytext,
00701
const QString contentDescriptionCiph,
00702
const QByteArray& ciphertext,
00703
const StructuringInfoWrapper& structuring,
00704 KMMessagePart& resultingPart );
00705
00710
bool encryptFlagOfAttachment(
int idx);
00711
00716
bool signFlagOfAttachment(
int idx);
00717
00718
00719 Kpgp::Result getEncryptionCertificates(
const QStringList& recipients,
00720 QCString& encryptionCertificates );
00721
00722 Kpgp::Result encryptMessage( KMMessage* msg,
00723
const QStringList& recipients,
bool doSign,
bool doEncrypt,
00724
const QCString& encodedBody,
int previousBoundaryLevel,
00725
const KMMessagePart& oldBodyPart,
00726
bool earlyAddAttachments,
bool allAttachmentsAreInBody,
00727 KMMessagePart newBodyPart,
00728 QCString& signCertFingerprint );
00729
00737
static void decryptOrStripOffCleartextSignature( QCString& );
00738
00742 QCString pgpProcessedMsg(
void);
00743
00747
bool doSend(
int sendNow=-1,
bool saveInDrafts =
false);
00748
00749
protected:
00750 QWidget *mMainWidget;
00751 QComboBox *mTransport;
00752
KMail::DictionaryComboBox *mDictionaryCombo;
00753
IdentityCombo *mIdentity;
00754 KMFolderComboBox *mFcc;
00755 KMLineEdit *mEdtFrom, *mEdtReplyTo, *mEdtTo, *mEdtCc, *mEdtBcc;
00756 KMLineEditSpell *mEdtSubject;
00757 QLabel *mLblIdentity, *mLblTransport, *mLblFcc;
00758 QLabel *mLblFrom, *mLblReplyTo, *mLblTo, *mLblCc, *mLblBcc, *mLblSubject;
00759 QLabel *mDictionaryLabel;
00760 QCheckBox *mBtnIdentity, *mBtnTransport, *mBtnFcc;
00761 QPushButton *mBtnTo, *mBtnCc, *mBtnBcc, *mBtnReplyTo;
00762
bool mSpellCheckInProgress;
00763
bool mDone;
00764
bool mAtmModified;
00765
00766 KMEdit* mEditor;
00767 QGridLayout* mGrid;
00768 KMMessage *mMsg;
00769 QPtrList<KMMessage> mBccMsgList;
00770 KMail::AttachmentListView* mAtmListView;
00771
int mAtmColEncrypt;
00772
int mAtmColSign;
00773
int mAtmEncryptColWidth;
00774
int mAtmSignColWidth;
00775 QPtrList<QListViewItem> mAtmItemList;
00776 KMMsgPartList mAtmList;
00777 QPopupMenu *mAttachMenu;
00778
int mSaveAsId, mPropertiesId;
00779
bool mAutoSign, mAutoPgpSign, mAutoPgpEncrypt, mAutoDeleteMsg;
00780
bool mAutoRequestMDN;
00781
bool mLastSignActionState, mLastEncryptActionState;
00782
bool mLastIdentityHasOpenPgpKey;
00783
KMFolder *mFolder;
00784
long mShowHeaders;
00785 QString mExtEditor;
00786
bool mUseExtEditor;
00787 QPtrList<_StringPair> mCustHeaders;
00788
bool mConfirmSend;
00789
bool mDisableBreaking;
00790
int mNumHeaders;
00791
int mLineBreak;
00792
int mWordWrap;
00793
short mBtnIdSign, mBtnIdEncrypt;
00794
short mMnuIdUrgent, mMnuIdConfDeliver, mMnuIdConfRead;
00795 QFont mBodyFont, mFixedFont;
00796
00797 QPtrList<QWidget> mEdtList;
00798 QPtrList<KTempFile> mAtmTempList;
00799 QPalette mPalette;
00800 uint mId;
00801 QString mOldSigText;
00802 QStringList mTransportHistory;
00803 QString mBcc;
00804
00805 KAction *mAttachPK, *mAttachMPK,
00806 *mAttachRemoveAction, *mAttachSaveAction, *mAttachPropertiesAction;
00807
00808 KToggleAction *mSignAction, *mEncryptAction, *mRequestMDNAction;
00809 KToggleAction *mUrgentAction, *mAllFieldsAction, *mFromAction;
00810 KToggleAction *mReplyToAction, *mToAction, *mCcAction, *mBccAction;
00811 KToggleAction *mSubjectAction;
00812 KToggleAction *mIdentityAction, *mTransportAction, *mFccAction;
00813 KToggleAction *mWordWrapAction, *mFixedFontAction, *mAutoSpellCheckingAction;
00814 KToggleAction *mDictionaryAction;
00815
00816 KSelectAction *mEncodingAction;
00817 KSelectAction *mCryptoModuleAction;
00818
00819 QCString mCharset;
00820 QCString mDefCharset;
00821 QStringList mCharsets;
00822
bool mAutoCharset;
00823
00824
bool mAlwaysSend;
00825
00826 QStringList mFolderNames;
00827 QValueList<QGuardedPtr<KMFolder> > mFolderList;
00828
00829
private slots:
00830
void slotCompletionModeChanged( KGlobalSettings::Completion );
00831
void slotConfigChanged();
00832
00833
private:
00834 QColor mForeColor,mBackColor;
00835
struct atmLoadData
00836 {
00837 KURL url;
00838 QByteArray data;
00839
bool insert;
00840 QCString encoding;
00841 };
00842 QMap<KIO::Job *, atmLoadData> mMapAtmLoadData;
00843
bool mForceReplyCharset;
00844
00845 QString mErrorProcessingStructuringInfo;
00846 QString mErrorNoCryptPlugAndNoBuildIn;
00847
00855 CryptPlugWrapper* mSelectedCryptPlug;
00856
00857
public:
00858
bool mDebugComposerCrypto;
00859
bool mNeverSign;
00860
bool mNeverEncrypt;
00861 };
00862
#endif
00863