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.
 
 
 

868 lines
22 KiB

/* -*- mode: C++; c-file-style: "gnu" -*-
* KMComposeWin Header File
* Author: Markus Wuebben <markus.wuebben@kde.org>
*/
#ifndef __KMComposeWin
#define __KMComposeWin
#include "secondarywindow.h"
#include <qlabel.h>
#include <qlistview.h>
#include <qcheckbox.h>
#include <qpushbutton.h>
#include <qclipboard.h>
#include <qpalette.h>
#include <qfont.h>
#include <qptrlist.h>
#include <qvaluevector.h>
#include <kio/job.h>
#include <kglobalsettings.h>
#include <kdeversion.h>
#include <keditcl.h>
#include "kmmsgpart.h"
#include "kmmsgbase.h"
#include "mailcomposerIface.h"
#include <libkdepim/addresseelineedit.h>
#include <mimelib/mediatyp.h>
#include <kleo/enum.h>
class _StringPair {
public:
QString name;
QString value;
};
class QCloseEvent;
class QComboBox;
class QFrame;
class QGridLayout;
class QListView;
class QPopupMenu;
class QPushButton;
class QCString;
class KCompletion;
class KEdit;
class KMComposeWin;
class KMFolderComboBox;
class KMMessage;
class KProcess;
class KDirWatch;
class KSelectAction;
class KFontAction;
class KFontSizeAction;
class KSelectAction;
class KSpell;
class KSpellConfig;
class KDictSpellingHighlighter;
class KStatusBar;
class KAction;
class KToggleAction;
class KTempFile;
class KToolBar;
class KToggleAction;
class KSelectColorAction;
class KURL;
class SpellingFilter;
class MessageComposer;
namespace KPIM {
class IdentityCombo;
class Identity;
}
namespace KMail {
class AttachmentListView;
class DictionaryComboBox;
}
namespace GpgME {
class Error;
}
//-----------------------------------------------------------------------------
class KMEdit: public KEdit
{
Q_OBJECT
public:
KMEdit(QWidget *parent=0,KMComposeWin* composer=0,
KSpellConfig* spellConfig = 0,
const char *name=0);
virtual ~KMEdit();
/**
* Start the spell checker.
*/
void spellcheck();
/**
* Text with lines breaks inserted after every row
*/
QString brokenText();
/**
* Toggle automatic spellchecking
*/
int autoSpellChecking( bool );
/**
* For the external editor
*/
void setUseExternalEditor( bool use ) { mUseExtEditor = use; }
void setExternalEditorPath( const QString & path ) { mExtEditor = path; }
/**
* Check that the external editor has finished and output a warning
* if it hasn't.
* @return false if the user chose to cancel whatever operation
* called this method.
*/
bool checkExternalEditorFinished();
void setSpellCheckingActive(bool spellCheckingActive);
/** Drag and drop methods */
void contentsDragEnterEvent(QDragEnterEvent *e);
void contentsDragMoveEvent(QDragMoveEvent *e);
void contentsDropEvent(QDropEvent *e);
void initializeAutoSpellChecking( KSpellConfig* autoSpellConfig );
void deleteAutoSpellChecking();
signals:
void spellcheck_done(int result);
public slots:
void slotSpellcheck2(KSpell*);
void slotSpellResult(const QString&);
void slotSpellDone();
void slotExternalEditorDone(KProcess*);
void slotMisspelling(const QString &, const QStringList &, unsigned int);
void slotCorrected (const QString &, const QString &, unsigned int);
void addSuggestion(const QString& text, const QStringList& lst, unsigned int );
virtual void cut();
virtual void clear();
virtual void del();
protected:
/**
* Event filter that does Tab-key handling.
*/
virtual bool eventFilter(QObject*, QEvent*);
virtual void keyPressEvent( QKeyEvent* );
KMComposeWin* mComposer;
private slots:
void slotExternalEditorTempFileChanged( const QString & fileName );
private:
void killExternalEditor();
private:
KSpell *mKSpell;
QMap<QString,QStringList> mReplacements;
SpellingFilter* mSpellingFilter;
KTempFile *mExtEditorTempFile;
KDirWatch *mExtEditorTempFileWatcher;
KProcess *mExtEditorProcess;
bool mUseExtEditor;
QString mExtEditor;
bool mWasModifiedBeforeSpellCheck;
KDictSpellingHighlighter *mSpellChecker;
bool mSpellLineEdit;
};
//-----------------------------------------------------------------------------
class KMLineEdit : public KPIM::AddresseeLineEdit
{
Q_OBJECT
public:
KMLineEdit(KMComposeWin* composer, bool useCompletion, QWidget *parent = 0,
const char *name = 0);
protected:
// Inherited. Always called by the parent when this widget is created.
virtual void loadContacts();
/**
* Smart insertion of email addresses. If @p pos is -1 then
* @p str is inserted at the end of the current contents of this
* lineedit. Else @p str is inserted at @p pos.
* Features:
* - Automatically adds ',' if necessary to separate email addresses
* - Correctly decodes mailto URLs
* - Recognizes email addresses which are protected against address
* harvesters, i.e. "name at kde dot org" and "name(at)kde.org"
void smartInsert( const QString &str, int pos = -1 );
virtual void dropEvent(QDropEvent *e);
*/
virtual void keyPressEvent(QKeyEvent*);
virtual QPopupMenu *createPopupMenu();
private slots:
void editRecentAddresses();
private:
KMComposeWin* mComposer;
};
class KMLineEditSpell : public KMLineEdit
{
Q_OBJECT
public:
KMLineEditSpell(KMComposeWin* composer, bool useCompletion, QWidget *parent = 0,
const char *name = 0);
void highLightWord( unsigned int length, unsigned int pos );
void spellCheckDone( const QString &s );
void spellCheckerMisspelling( const QString &text, const QStringList &, unsigned int pos);
void spellCheckerCorrected( const QString &old, const QString &corr, unsigned int pos);
signals:
void subjectTextSpellChecked();
};
//-----------------------------------------------------------------------------
class KMAtmListViewItem : public QObject, public QListViewItem
{
Q_OBJECT
friend class KMComposeWin;
friend class MessageComposer;
public:
KMAtmListViewItem(QListView * parent);
virtual ~KMAtmListViewItem();
virtual void paintCell( QPainter * p, const QColorGroup & cg,
int column, int width, int align );
protected:
void enableCryptoCBs(bool on);
void setEncrypt(bool on);
bool isEncrypt();
void setSign(bool on);
bool isSign();
private:
QListView* mListview;
QCheckBox* mCBEncrypt;
QCheckBox* mCBSign;
bool mCBSignEnabled, mCBEncryptEnabled;
};
class KMHeaders;
//-----------------------------------------------------------------------------
class KMComposeWin : public KMail::SecondaryWindow, virtual public MailComposerIface
{
Q_OBJECT
friend class KMHeaders; // needed for the digest forward
friend class MessageComposer;
public:
KMComposeWin( KMMessage* msg=0, uint identity=0 );
~KMComposeWin();
/**
* From MailComposerIface
*/
void send(int how);
void addAttachment(KURL url,QString comment);
void addAttachment(const QString &name,
const QCString &cte,
const QByteArray &data,
const QCString &type,
const QCString &subType,
const QCString &paramAttr,
const QString &paramValue,
const QCString &contDisp);
void setBody (QString body);
/**
* To catch palette changes
*/
virtual bool event(QEvent *e);
/**
* update colors
*/
void readColorConfig();
/**
* Write settings to app's config file.
*/
void writeConfig(void);
/**
* If necessary increases the word wrap of the editor so that it will
* not wrap the body string
*/
void verifyWordWrapLengthIsAdequate(const QString&);
/**
* Set the message the composer shall work with. This discards
* previous messages without calling applyChanges() on them before.
*/
void setMsg(KMMessage* newMsg, bool mayAutoSign=TRUE,
bool allowDecryption=FALSE, bool isModified=FALSE);
/**
* Returns message of the composer. To apply the user changes to the
* message, call applyChanges() first.
*/
KMMessage* msg(void) const { return mMsg; }
/**
* If this flag is set the message of the composer is deleted when
* the composer is closed and the message was not sent. Default: FALSE
*/
inline void setAutoDelete(bool f) { mAutoDeleteMsg = f; }
/**
* If this folder is set, the original message is inserted back after
* cancelling
*/
void setFolder(KMFolder* aFolder) { mFolder = aFolder; }
/**
* Recode to the specified charset
*/
void setCharset(const QCString& aCharset, bool forceDefault = FALSE);
/**
* Sets the focus to the edit-widget and the cursor below the
* "On ... you wrote" line when hasMessage is true.
* Make sure you call this _after_ setMsg().
*/
void setReplyFocus( bool hasMessage = true );
/**
* Sets the focus to the subject line edit. For use when creating a
* message to a known recipient.
*/
void setFocusToSubject();
/**
* determines whether inline signing/encryption is selected
*/
bool inlineSigningEncryptionSelected();
/**
* Tries to find the given mimetype @p type in the KDE Mimetype registry.
* If found, returns its localized description, otherwise the @p type
* in lowercase.
*/
static QString prettyMimeType( const QString& type );
QString quotePrefixName() const;
KMLineEditSpell *sujectLineWidget() const { return mEdtSubject;}
void setSubjectTextWasSpellChecked( bool _spell ) {
mSubjectTextWasSpellChecked = _spell;
}
bool subjectTextWasSpellChecked() const { return mSubjectTextWasSpellChecked; }
public slots:
/**
* Actions:
*/
void slotPrint();
void slotAttachFile();
void slotSendNow();
void slotSendLater();
/**
* Returns true when saving was successful.
*/
void slotSaveDraft();
void slotNewComposer();
void slotNewMailReader();
void slotClose();
void slotHelp();
void slotFind();
void slotSearchAgain();
void slotReplace();
void slotUndo();
void slotRedo();
void slotCut();
void slotCopy();
void slotPaste();
void slotPasteAsQuotation();
void slotAddQuotes();
void slotRemoveQuotes();
void slotMarkAll();
void slotFolderRemoved(KMFolder*);
/**
Tell the composer to always send the message, even if the user
hasn't changed the next. This is useful if a message is
autogenerated (e.g., via a DCOP call), and the user should
simply be able to confirm the message and send it.
*/
void slotSetAlwaysSend( bool bAlwaysSend );
/**
* toggle fixed width font.
*/
void slotUpdateFont();
/**
* Open addressbook editor dialog.
*/
void slotAddrBook();
/**
* Insert a file to the end of the text in the editor.
*/
void slotInsertFile();
void slotSetCharset();
/**
* Check spelling of text.
*/
void slotSpellcheck();
void slotSpellcheckConfig();
void slotSubjectTextSpellChecked();
/**
* Change crypto plugin to be used for signing/encrypting messages,
* or switch to built-in OpenPGP code.
*/
void slotSelectCryptoModule();
/**
* XML-GUI stuff
*/
void slotStatusMessage(const QString &message);
void slotEditToolbars();
void slotUpdateToolbars();
void slotEditKeys();
/**
* Read settings from app's config file.
*/
void readConfig(void);
/**
* Change window title to given string.
*/
void slotUpdWinTitle(const QString& );
/**
* Switch the icon to lock or unlock respectivly.
* Change states of all encrypt check boxes in the attachments listview
*/
void slotEncryptToggled(bool);
/**
* Change states of all sign check boxes in the attachments listview
*/
void slotSignToggled(bool);
/**
* Switch wordWrap on/off
*/
void slotWordWrapToggled(bool);
/**
* Append signature file to the end of the text in the editor.
*/
void slotAppendSignature();
/**
* Attach sender's public key.
*/
void slotInsertMyPublicKey();
/**
* Insert arbitary public key from public keyring in the editor.
*/
void slotInsertPublicKey();
/**
* Enable/disable some actions in the Attach menu
*/
void slotUpdateAttachActions();
/**
* Open a popup-menu in the attachments-listbox.
*/
void slotAttachPopupMenu(QListViewItem *, const QPoint &, int);
/**
* Returns the number of the current attachment in the listbox,
* or -1 if there is no current attachment
*/
int currentAttachmentNum();
/**
* Attachment operations.
*/
void slotAttachView();
void slotAttachRemove();
void slotAttachSave();
void slotAttachProperties();
/**
* Select an email from the addressbook and add it to the line
* the pressed button belongs to.
*/
void slotAddrBookTo();
void slotAddrBookFrom();
void slotAddrBookReplyTo();
void slotCleanSpace();
void slotToggleMarkup();
void toggleMarkup(bool markup);
// void slotSpellConfigure();
void slotSpellcheckDone(int result);
void slotSpellcheckDoneClearStatus();
/**
* Append current message to ~/dead.letter
*/
void deadLetter(void);
void updateCursorPosition();
void slotView();
/**
* Move focus to next/prev edit widget
*/
void focusNextPrevEdit(const QWidget* current, bool next);
/**
* Update composer field to reflect new identity
*/
void slotIdentityChanged(uint);
/**
* KIO slots for attachment insertion
*/
void slotAttachFileData(KIO::Job *, const QByteArray &);
void slotAttachFileResult(KIO::Job *);
void slotListAction(const QString &);
void slotFontAction(const QString &);
void slotSizeAction(int);
void slotAlignLeft();
void slotAlignCenter();
void slotAlignRight();
void slotTextBold();
void slotTextItalic();
void slotTextUnder();
void slotFormatReset();
void slotTextColor();
void fontChanged( const QFont & );
void alignmentChanged( int );
void addAttach(const KURL url);
/**
* Add an attachment to the list.
*/
void addAttach(const KMMessagePart* msgPart);
public:
const KPIM::Identity & identity() const;
Kleo::CryptoMessageFormat cryptoMessageFormat() const;
bool encryptToSelf() const;
signals:
/**
* A message has been queued or saved in the drafts folder
*/
void messageQueuedOrDrafted();
void applyChangesDone( bool );
protected:
/**
* Applies the user changes to the message object of the composer
* and signs/encrypts the message if activated. Returns FALSE in
* case of an error (e.g. if PGP encryption fails).
* Disables the controls of the composer window unless @dontDisable
* is true.
*/
void applyChanges( bool dontSignNorEncrypt, bool dontDisable=false );
/**
* Install grid management and header fields. If fields exist that
* should not be there they are removed. Those that are needed are
* created if necessary.
*/
void rethinkFields(bool fromslot=false);
/**
* Show or hide header lines
*/
void rethinkHeaderLine( int value, int mask, int& row,
const QString& labelStr, QLabel* lbl,
QLineEdit* edt, QPushButton* btn = 0,
const QString& toolTip = QString::null );
void rethinkHeaderLine( int value, int mask, int& row,
const QString& labelStr, QLabel* lbl,
QComboBox* cbx, QCheckBox *chk );
/**
* Initialization methods
*/
void setupActions();
void setupStatusBar();
void setupEditor();
/**
* Header fields.
*/
QString subject(void) const { return mEdtSubject->text(); }
QString to(void) const { return mEdtTo->text(); }
QString cc(void) const
{ return (mEdtCc->isHidden()) ? QString::null : mEdtCc->text(); }
QString bcc(void) const
{ return (mEdtBcc->isHidden()) ? QString::null : mEdtBcc->text(); }
QString from(void) const { return mEdtFrom->text(); }
QString replyTo(void) const { return mEdtReplyTo->text(); }
/**
* Use the given folder as sent-mail folder if the given folder exists.
* Else show an error message and use the default sent-mail folder as
* sent-mail folder.
*/
void setFcc( const QString &idString );
/**
* Ask for confirmation if the message was changed before close.
*/
virtual bool queryClose ();
/**
* prevent kmail from exiting when last window is deleted (kernel rules)
*/
virtual bool queryExit ();
/**
* View the attachment with the given index.
*/
void viewAttach( int index );
/**
* Remove an attachment from the list.
*/
void removeAttach(const QString &url);
void removeAttach(int idx);
/**
* Updates an item in the QListView to represnet a given message part
*/
void msgPartToItem(const KMMessagePart* msgPart, KMAtmListViewItem *lvi);
/**
* Open addressbook and append selected addresses to the given
* edit field.
*/
void addrBookSelInto();
private:
/**
* Turn encryption on/off. If setByUser is true then a message box is shown
* in case encryption isn't possible.
*/
void setEncryption( bool encrypt, bool setByUser = false );
/**
* Turn signing on/off. If setByUser is true then a message box is shown
* in case signing isn't possible.
*/
void setSigning( bool sign, bool setByUser = false );
/**
Returns true if the user forgot to attach something.
*/
bool userForgotAttachment();
/**
* Retrieve encrypt flag of an attachment
* ( == state of it's check box in the attachments list view )
*/
bool encryptFlagOfAttachment(int idx);
/**
* Retrieve sign flag of an attachment
* ( == state of it's check box in the attachments list view )
*/
bool signFlagOfAttachment(int idx);
/**
* Decrypt an OpenPGP block or strip off the OpenPGP envelope of a text
* block with a clear text signature. This is only done if the given
* string contains exactly one OpenPGP block.
* This function is for example used to restore the unencrypted/unsigned
* message text for editting.
*/
static void decryptOrStripOffCleartextSignature( QCString& );
/**
* Send the message. Returns true if the message was sent successfully.
*/
void doSend(int sendNow=-1, bool saveInDrafts = false);
protected:
QWidget *mMainWidget;
QComboBox *mTransport;
KMail::DictionaryComboBox *mDictionaryCombo;
KPIM::IdentityCombo *mIdentity;
KMFolderComboBox *mFcc;
KMLineEdit *mEdtFrom, *mEdtReplyTo, *mEdtTo, *mEdtCc, *mEdtBcc;
KMLineEditSpell *mEdtSubject;
QLabel *mLblIdentity, *mLblTransport, *mLblFcc;
QLabel *mLblFrom, *mLblReplyTo, *mLblTo, *mLblCc, *mLblBcc, *mLblSubject;
QLabel *mDictionaryLabel;
QCheckBox *mBtnIdentity, *mBtnTransport, *mBtnFcc;
QPushButton *mBtnTo, *mBtnCc, *mBtnBcc, /* *mBtnFrom, */ *mBtnReplyTo;
bool mSpellCheckInProgress;
bool mDone;
bool mAtmModified;
KMEdit* mEditor;
QGridLayout* mGrid;
KMMessage *mMsg;
QValueVector<KMMessage*> mComposedMessages;
KMail::AttachmentListView* mAtmListView;
int mAtmColEncrypt;
int mAtmColSign;
int mAtmEncryptColWidth;
int mAtmSignColWidth;
QPtrList<QListViewItem> mAtmItemList;
QPtrList<KMMessagePart> mAtmList;
QPopupMenu *mAttachMenu;
int mViewId, mRemoveId, mSaveAsId, mPropertiesId;
bool mAutoSign, mAutoPgpSign, mAutoPgpEncrypt, mAutoDeleteMsg;
bool mNeverSignWhenSavingInDrafts, mNeverEncryptWhenSavingInDrafts;
bool mAutoRequestMDN;
bool mLastSignActionState, mLastEncryptActionState;
bool mLastIdentityHasSigningKey, mLastIdentityHasEncryptionKey;
KMFolder *mFolder;
long mShowHeaders;
QString mExtEditor;
bool mUseHTMLEditor;
bool mUseExtEditor;
QPtrList<_StringPair> mCustHeaders;
bool mConfirmSend;
bool mDisableBreaking; // Move
int mNumHeaders;
int mLineBreak;
int mWordWrap;
bool mUseFixedFont;
QFont mBodyFont, mFixedFont;
// QList<QLineEdit> mEdtList;
QPtrList<QWidget> mEdtList;
QPtrList<KTempFile> mAtmTempList;
QPalette mPalette;
uint mId;
QString mOldSigText;
QStringList mTransportHistory;
KAction *mAttachPK, *mAttachMPK,
*mAttachRemoveAction, *mAttachSaveAction, *mAttachPropertiesAction;
KToggleAction *mSignAction, *mEncryptAction, *mRequestMDNAction;
KToggleAction *mUrgentAction, *mAllFieldsAction, *mFromAction;
KToggleAction *mReplyToAction, *mToAction, *mCcAction, *mBccAction;
KToggleAction *mSubjectAction;
KToggleAction *mIdentityAction, *mTransportAction, *mFccAction;
KToggleAction *mWordWrapAction, *mFixedFontAction, *mAutoSpellCheckingAction;
KToggleAction *mDictionaryAction;
KSelectAction *listAction;
KFontAction *fontAction;
KFontSizeAction *fontSizeAction;
KToggleAction *alignLeftAction, *alignCenterAction, *alignRightAction;
KToggleAction *textBoldAction, *textItalicAction, *textUnderAction;
KToggleAction *plainTextAction, *markupAction;
KAction *actionFormatColor, *actionFormatReset;
KAction *mHtmlToolbar;
KSelectAction *mEncodingAction;
KSelectAction *mCryptoModuleAction;
QCString mCharset;
QCString mDefCharset;
QStringList mCharsets;
bool mAutoCharset;
bool mAlwaysSend;
bool mOutlookCompatible;
QStringList mFolderNames;
QValueList<QGuardedPtr<KMFolder> > mFolderList;
private:
// helper method for slotInsert(My)PublicKey()
void startPublicKeyExport();
bool canSignEncryptAttachments() const {
return cryptoMessageFormat() != Kleo::InlineOpenPGPFormat;
}
bool mSubjectTextWasSpellChecked;
private slots:
void slotCompletionModeChanged( KGlobalSettings::Completion );
void slotConfigChanged();
void slotComposerDone( bool );
void slotContinueDoSend( bool );
void slotContinuePrint( bool );
void slotContinueDeadLetter( bool );
/**
* Helper method (you could call is a bottom-half :) for
* startPublicKeyExport()
*/
void slotPublicKeyExportResult( const GpgME::Error & err, const QByteArray & keydata );
/**
* toggle automatic spellchecking
*/
void slotAutoSpellCheckingToggled(bool);
private:
QColor mForeColor,mBackColor;
QFont mSaveFont;
struct atmLoadData
{
KURL url;
QByteArray data;
bool insert;
QCString encoding;
};
QMap<KIO::Job *, atmLoadData> mMapAtmLoadData;
bool mForceReplyCharset;
// These are for passing on methods over the applyChanges calls
int mSendNow;
bool mSaveInDrafts;
// This is the temporary object that constructs the message out of the
// window
MessageComposer* mComposer;
// Temp var for slotPrint:
bool mMessageWasModified;
// Temp var for slotInsert(My)PublicKey():
QString mFingerprint;
};
#endif