/* This file is part of KMail. Copyright (c) 2004 Cornelius Schumacher This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of TQt, and distribute the resulting executable, without including the source code for TQt in the source distribution. */ #ifndef RECIPIENTSEDITOR_H #define RECIPIENTSEDITOR_H #include #include #include #include #include #include "kmlineeditspell.h" #include class RecipientsPicker; class KWindowPositioner; class TQLabel; class TQPushButton; class SideWidget; class Recipient { public: typedef TQValueList List; enum Type { To, Cc, Bcc, Undefined }; Recipient( const TQString &email = TQString(), Type type = To ); void setType( Type ); Type type() const; void setEmail( const TQString & ); TQString email() const; bool isEmpty() const; static int typeToId( Type ); static Type idToType( int ); TQString typeLabel() const; static TQString typeLabel( Type ); static TQStringList allTypeLabels(); private: TQString mEmail; Type mType; }; class RecipientComboBox : public TQComboBox { Q_OBJECT public: RecipientComboBox( TQWidget *parent ); signals: void rightPressed(); protected: void keyPressEvent( TQKeyEvent *ev ); }; class RecipientLineEdit : public KMLineEdit { Q_OBJECT public: RecipientLineEdit( TQWidget * parent ) : KMLineEdit( true, parent ) {} signals: void deleteMe(); void leftPressed(); void rightPressed(); protected: void keyPressEvent( TQKeyEvent *ev ); }; class RecipientLine : public TQWidget { Q_OBJECT public: RecipientLine( TQWidget *parent ); void setRecipient( const Recipient & ); Recipient recipient() const; void setRecipientType( Recipient::Type ); Recipient::Type recipientType() const; void setRecipient( const TQString & ); void activate(); bool isActive(); bool isEmpty(); /** Returns true if the user has made any modifications to this RecipientLine. */ bool isModified(); /** Resets the modified flag to false. */ void clearModified(); int setComboWidth( int w ); void fixTabOrder( TQWidget *previous ); TQWidget *tabOut() const; void clear(); int recipientsCount(); void setRemoveLineButtonEnabled( bool b ); signals: void returnPressed( RecipientLine * ); void downPressed( RecipientLine * ); void upPressed( RecipientLine * ); void rightPressed(); void deleteLine( RecipientLine * ); void countChanged(); void typeModified( RecipientLine * ); protected: void keyPressEvent( TQKeyEvent * ); RecipientLineEdit* lineEdit() const { return mEdit; } protected slots: void slotReturnPressed(); void analyzeLine( const TQString & ); void slotFocusUp(); void slotFocusDown(); void slotPropagateDeletion(); void slotTypeModified(); private: friend class RecipientsView; TQComboBox *mCombo; RecipientLineEdit *mEdit; TQPushButton *mRemoveButton; int mRecipientsCount; bool mModified; }; class RecipientsView : public TQScrollView { Q_OBJECT public: RecipientsView( TQWidget *parent ); TQSize minimumSizeHint() const; TQSize sizeHint() const; RecipientLine *activeLine(); RecipientLine *emptyLine(); Recipient::List recipients() const; /** Removes the recipient provided it can be found and has the given type. @param recipient The recipient(s) you want to remove. @param type The recipient type. */ void removeRecipient( const TQString & recipient, Recipient::Type type ); /** Returns true if the user has made any modifications to the list of recipients. */ bool isModified(); /** Resets the modified flag to false. */ void clearModified(); void activateLine( RecipientLine * ); /** * Set the width of the left most column to be the argument width. * This method allows other widgets to align their label/combobox column with ours * by communicating how many pixels that first colum is for them. * Returns the width that is actually being used. */ int setFirstColumnWidth( int ); public slots: void setCompletionMode( TDEGlobalSettings::Completion ); RecipientLine *addLine(); void setFocus(); void setFocusTop(); void setFocusBottom(); signals: void totalChanged( int recipients, int lines ); void focusUp(); void focusDown(); void focusRight(); void completionModeChanged( TDEGlobalSettings::Completion ); void sizeHintChanged(); protected: void viewportResizeEvent( TQResizeEvent * ); void resizeView(); protected slots: void slotReturnPressed( RecipientLine * ); void slotDownPressed( RecipientLine * ); void slotUpPressed( RecipientLine * ); void slotDecideLineDeletion( RecipientLine * ); void slotDeleteLine(); void calculateTotal(); void slotTypeModified( RecipientLine * ); void moveCompletionPopup(); private: TQPtrList mLines; TQGuardedPtr mCurDelLine; int mLineHeight; int mFirstColumnWidth; bool mModified; TDEGlobalSettings::Completion mCompletionMode; }; class RecipientsToolTip : public TQToolTip { public: RecipientsToolTip( RecipientsView *, TQWidget *parent ); protected: void maybeTip( const TQPoint & p ); TQString line( const Recipient & ); private: RecipientsView *mView; }; class SideWidget : public TQWidget { Q_OBJECT public: SideWidget( RecipientsView *view, TQWidget *parent ); ~SideWidget(); RecipientsPicker* picker() const; public slots: void setTotal( int recipients, int lines ); void setFocus(); void pickRecipient(); signals: void pickedRecipient( const Recipient & ); void saveDistributionList(); private: RecipientsView *mView; TQLabel *mTotalLabel; TQPushButton *mDistributionListButton; TQPushButton *mSelectButton; /** The RecipientsPicker is lazy loaded, never access it directly, only through picker() */ mutable RecipientsPicker *mRecipientPicker; /** lazy loaded, don't access directly, unless you've called picker() */ mutable KWindowPositioner *mPickerPositioner; }; class RecipientsEditor : public TQWidget { Q_OBJECT public: RecipientsEditor( TQWidget *parent ); ~RecipientsEditor(); void clear(); Recipient::List recipients() const; RecipientsPicker* picker() const; void setRecipientString( const TQString &, Recipient::Type ); TQString recipientString( Recipient::Type ); /** Adds a recipient (or multiple recipients) to one line of the editor. @param recipient The recipient(s) you want to add. @param type The recipient type. */ void addRecipient( const TQString & recipient, Recipient::Type type ); /** Removes the recipient provided it can be found and has the given type. @param recipient The recipient(s) you want to remove. @param type The recipient type. */ void removeRecipient( const TQString & recipient, Recipient::Type type ); /** Returns true if the user has made any modifications to the list of recipients. */ bool isModified(); /** Resets the modified flag to false. */ void clearModified(); /** * Set the width of the left most column to be the argument width. * This method allows other widgets to align their label/combobox column with ours * by communicating how many pixels that first colum is for them. * Returns the width that is actually being used. */ int setFirstColumnWidth( int ); /** * Set completion mode for all lines */ void setCompletionMode( TDEGlobalSettings::Completion ); public slots: void setFocus(); void setFocusTop(); void setFocusBottom(); void selectRecipients(); void saveDistributionList(); signals: void focusUp(); void focusDown(); void completionModeChanged( TDEGlobalSettings::Completion ); void sizeHintChanged(); protected slots: void slotPickedRecipient( const Recipient & ); private: RecipientsView *mRecipientsView; SideWidget* mSideWidget; bool mModified; }; #endif