kmail

recipientseditor.h

Go to the documentation of this file.
00001 /*
00002     This file is part of KMail.
00003 
00004     Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 #ifndef RECIPIENTSEDITOR_H
00025 #define RECIPIENTSEDITOR_H
00026 
00027 #include <qwidget.h>
00028 #include <qscrollview.h>
00029 #include <qguardedptr.h>
00030 #include <qlineedit.h>
00031 #include <qtooltip.h>
00032 
00033 #include "kmlineeditspell.h"
00034 #include <qcombobox.h>
00035 
00036 class RecipientsPicker;
00037 
00038 class KWindowPositioner;
00039 
00040 class QLabel;
00041 class QPushButton;
00042 class SideWidget;
00043 
00044 class Recipient
00045 {
00046   public:
00047     typedef QValueList<Recipient> List;
00048 
00049     enum Type { To, Cc, Bcc, Undefined };
00050 
00051     Recipient( const QString &email = QString::null, Type type = To );
00052 
00053     void setType( Type );
00054     Type type() const;
00055 
00056     void setEmail( const QString & );
00057     QString email() const;
00058 
00059     bool isEmpty() const;
00060 
00061     static int typeToId( Type );
00062     static Type idToType( int );
00063 
00064     QString typeLabel() const;    static QString typeLabel( Type );
00065     static QStringList allTypeLabels();
00066 
00067   private:
00068     QString mEmail;
00069     Type mType;
00070 };
00071 
00072 class RecipientComboBox : public QComboBox
00073 {
00074     Q_OBJECT
00075   public:
00076     RecipientComboBox( QWidget *parent );
00077 
00078   signals:
00079     void rightPressed();
00080 
00081   protected:
00082     void keyPressEvent( QKeyEvent *ev );
00083 };
00084 
00085 class RecipientLineEdit : public KMLineEdit
00086 {
00087     Q_OBJECT
00088   public:
00089     RecipientLineEdit( QWidget * parent ) :
00090       KMLineEdit( true, parent ) {}
00091 
00092   signals:
00093     void deleteMe();
00094     void leftPressed();
00095     void rightPressed();
00096 
00097   protected:
00098     void keyPressEvent( QKeyEvent *ev );
00099 };
00100 
00101 class RecipientLine : public QWidget
00102 {
00103     Q_OBJECT
00104   public:
00105     RecipientLine( QWidget *parent );
00106 
00107     void setRecipient( const Recipient & );
00108     Recipient recipient() const;
00109 
00110     void setRecipientType( Recipient::Type );
00111     Recipient::Type recipientType() const;
00112 
00113     void setRecipient( const QString & );
00114 
00115     void activate();
00116     bool isActive();
00117 
00118     bool isEmpty();
00119 
00123     bool isModified();
00124 
00127     void clearModified();
00128 
00129     int setComboWidth( int w );
00130 
00131     void fixTabOrder( QWidget *previous );
00132     QWidget *tabOut() const;
00133 
00134     void clear();
00135 
00136     int recipientsCount();
00137 
00138     void setRemoveLineButtonEnabled( bool b );
00139 
00140   signals:
00141     void returnPressed( RecipientLine * );
00142     void downPressed( RecipientLine * );
00143     void upPressed( RecipientLine * );
00144     void rightPressed();
00145     void deleteLine(  RecipientLine * );
00146     void countChanged();
00147     void typeModified( RecipientLine * );
00148 
00149   protected:
00150     void keyPressEvent( QKeyEvent * );
00151     RecipientLineEdit* lineEdit() const { return mEdit; }
00152 
00153   protected slots:
00154     void slotReturnPressed();
00155     void analyzeLine( const QString & );
00156     void slotFocusUp();
00157     void slotFocusDown();
00158     void slotPropagateDeletion();
00159     void slotTypeModified();
00160 
00161   private:
00162     friend class RecipientsView;
00163     QComboBox *mCombo;
00164     RecipientLineEdit *mEdit;
00165     QPushButton *mRemoveButton;
00166     int mRecipientsCount;
00167     bool mModified;
00168 };
00169 
00170 class RecipientsView : public QScrollView
00171 {
00172     Q_OBJECT
00173   public:
00174     RecipientsView( QWidget *parent );
00175 
00176     QSize minimumSizeHint() const;
00177     QSize sizeHint() const;
00178 
00179     RecipientLine *activeLine();
00180 
00181     RecipientLine *emptyLine();
00182 
00183     Recipient::List recipients() const;
00184 
00189     void removeRecipient( const QString & recipient, Recipient::Type type );
00190 
00194     bool isModified();
00195 
00198     void clearModified();
00199 
00200     void activateLine( RecipientLine * );
00201 
00208     int setFirstColumnWidth( int );
00209 
00210   public slots:
00211     void setCompletionMode( KGlobalSettings::Completion );
00212     RecipientLine *addLine();
00213 
00214     void setFocus();
00215     void setFocusTop();
00216     void setFocusBottom();
00217 
00218   signals:
00219     void totalChanged( int recipients, int lines );
00220     void focusUp();
00221     void focusDown();
00222     void focusRight();
00223     void completionModeChanged( KGlobalSettings::Completion );
00224     void sizeHintChanged();
00225 
00226   protected:
00227     void viewportResizeEvent( QResizeEvent * );
00228     void resizeView();
00229 
00230   protected slots:
00231     void slotReturnPressed( RecipientLine * );
00232     void slotDownPressed( RecipientLine * );
00233     void slotUpPressed( RecipientLine * );
00234     void slotDecideLineDeletion(  RecipientLine * );
00235     void slotDeleteLine();
00236     void calculateTotal();
00237     void slotTypeModified( RecipientLine * );
00238     void moveCompletionPopup();
00239 
00240   private:
00241     QPtrList<RecipientLine> mLines;
00242     QGuardedPtr<RecipientLine> mCurDelLine;
00243     int mLineHeight;
00244     int mFirstColumnWidth;
00245     bool mModified;
00246     KGlobalSettings::Completion mCompletionMode;
00247 };
00248 
00249 class RecipientsToolTip : public QToolTip
00250 {
00251   public:
00252     RecipientsToolTip( RecipientsView *, QWidget *parent );
00253 
00254   protected:
00255     void maybeTip( const QPoint & p );
00256 
00257     QString line( const Recipient & );
00258 
00259   private:
00260     RecipientsView *mView;
00261 };
00262 
00263 class SideWidget : public QWidget
00264 {
00265     Q_OBJECT
00266   public:
00267     SideWidget( RecipientsView *view, QWidget *parent );
00268     ~SideWidget();
00269 
00270     RecipientsPicker* picker() const;
00271 
00272   public slots:
00273     void setTotal( int recipients, int lines );
00274     void setFocus();
00275 
00276     void pickRecipient();
00277 
00278   signals:
00279     void pickedRecipient( const Recipient & );
00280     void saveDistributionList();
00281 
00282   private:
00283     RecipientsView *mView;
00284     QLabel *mTotalLabel;
00285     QPushButton *mDistributionListButton;
00286     QPushButton *mSelectButton;
00289     mutable RecipientsPicker *mRecipientPicker;
00291     mutable KWindowPositioner *mPickerPositioner;
00292 };
00293 
00294 class RecipientsEditor : public QWidget
00295 {
00296     Q_OBJECT
00297   public:
00298     RecipientsEditor( QWidget *parent );
00299     ~RecipientsEditor();
00300 
00301     void clear();
00302 
00303     Recipient::List recipients() const;
00304     RecipientsPicker* picker() const;
00305 
00306     void setRecipientString( const QString &, Recipient::Type );
00307     QString recipientString( Recipient::Type );
00308 
00313     void addRecipient( const QString & recipient, Recipient::Type type );
00314 
00319     void removeRecipient( const QString & recipient, Recipient::Type type );
00320 
00324     bool isModified();
00325 
00328     void clearModified();
00329 
00336     int setFirstColumnWidth( int );
00337 
00341     void setCompletionMode( KGlobalSettings::Completion );
00342 
00343   public slots:
00344     void setFocus();
00345     void setFocusTop();
00346     void setFocusBottom();
00347 
00348     void selectRecipients();
00349     void saveDistributionList();
00350 
00351   signals:
00352     void focusUp();
00353     void focusDown();
00354     void completionModeChanged( KGlobalSettings::Completion );
00355     void sizeHintChanged();
00356 
00357   protected slots:
00358     void slotPickedRecipient( const Recipient & );
00359 
00360   private:
00361     RecipientsView *mRecipientsView;
00362     SideWidget* mSideWidget;
00363     bool mModified;
00364 };
00365 
00366 #endif