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.
 
 
 

369 lines
9.2 KiB

/*
This file is part of KMail.
Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
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 Qt, and distribute the resulting executable,
without including the source code for Qt in the source distribution.
*/
#ifndef RECIPIENTSEDITOR_H
#define RECIPIENTSEDITOR_H
#include "kmail_export.h"
#include "kmlineeditspell.h"
#include <kcombobox.h>
#include <QList>
#include <QScrollArea>
class RecipientsPicker;
class KWindowPositioner;
class QLabel;
class QPushButton;
class SideWidget;
class Recipient
{
public:
typedef QList<Recipient> List;
enum Type { To, Cc, Bcc, Undefined };
Recipient( const QString &email = QString(), Type type = To ); //krazy:exclude=explicit
void setType( Type );
Type type() const;
void setEmail( const QString & );
QString email() const;
bool isEmpty() const;
static int typeToId( Type );
static Type idToType( int );
QString typeLabel() const;
static QString typeLabel( Type );
static QStringList allTypeLabels();
private:
QString mEmail;
Type mType;
};
class RecipientComboBox : public KComboBox
{
Q_OBJECT
public:
RecipientComboBox( QWidget *parent );
signals:
void rightPressed();
protected:
void keyPressEvent( QKeyEvent *ev );
};
class RecipientLineEdit : public KMLineEdit
{
Q_OBJECT
public:
RecipientLineEdit( QWidget * parent ) :
KMLineEdit( true, parent ) {}
signals:
void deleteMe();
void leftPressed();
void rightPressed();
protected:
void keyPressEvent( QKeyEvent *ev );
};
class RecipientLine : public QWidget
{
Q_OBJECT
public:
RecipientLine( QWidget *parent );
void setRecipient( const Recipient & );
Recipient recipient() const;
void setRecipientType( Recipient::Type );
Recipient::Type recipientType() const;
void setRecipient( const QString & );
void activate();
bool isActive() const;
bool isEmpty() const;
/** 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( QWidget *previous );
QWidget *tabOut() const;
void clear();
int recipientsCount() const;
/**
* Sets the font which will be used for the lineedits.
*/
void setEditFont( const QFont& font );
signals:
void returnPressed( RecipientLine * );
void downPressed( RecipientLine * );
void upPressed( RecipientLine * );
void rightPressed();
void deleteLine( RecipientLine * );
void countChanged();
void typeModified( RecipientLine * );
protected:
void keyPressEvent( QKeyEvent * );
RecipientLineEdit* lineEdit() const { return mEdit; }
protected slots:
void slotReturnPressed();
void analyzeLine( const QString & );
void slotFocusUp();
void slotFocusDown();
void slotEditingFinished();
void slotPropagateDeletion();
void slotTypeModified();
private:
friend class RecipientsView;
KComboBox *mCombo;
RecipientLineEdit *mEdit;
int mRecipientsCount;
bool mModified;
};
class RecipientsView : public QScrollArea
{
Q_OBJECT
public:
RecipientsView( QWidget *parent );
QSize minimumSizeHint() const;
QSize sizeHint() const;
RecipientLine *activeLine() const;
RecipientLine *emptyLine() const;
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 QString & 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 column is for them.
* Returns the width that is actually being used.
*/
int setFirstColumnWidth( int );
/**
* Sets the font which will be used for the lineedits.
*/
void setEditFont( const QFont& font );
public slots:
void setCompletionMode( KGlobalSettings::Completion );
RecipientLine *addLine();
void setFocus();
void setFocusTop();
void setFocusBottom();
signals:
void totalChanged( int recipients, int lines );
void focusUp();
void focusDown();
void focusRight();
void completionModeChanged( KGlobalSettings::Completion );
void sizeHintChanged();
protected:
void resizeEvent( QResizeEvent * );
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();
void moveScrollBarToEnd();
private:
QList<RecipientLine*> mLines;
QFont mEditFont;
QPointer<RecipientLine> mCurDelLine;
int mLineHeight;
int mFirstColumnWidth;
bool mModified;
KGlobalSettings::Completion mCompletionMode;
QWidget *mPage;
QLayout *mTopLayout;
};
class SideWidget : public QWidget
{
Q_OBJECT
public:
SideWidget( RecipientsView *view, QWidget *parent );
~SideWidget();
RecipientsPicker* picker() const;
public slots:
void setTotal( int recipients, int lines );
void setFocus();
void updateTotalToolTip();
void pickRecipient();
signals:
void pickedRecipient( const Recipient & );
void saveDistributionList();
private:
RecipientsView *mView;
QLabel *mTotalLabel;
QPushButton *mDistributionListButton;
QPushButton *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 KMAIL_EXPORT RecipientsEditor : public QWidget
{
Q_OBJECT
public:
RecipientsEditor( QWidget *parent );
~RecipientsEditor();
void clear();
Recipient::List recipients() const;
RecipientsPicker* picker() const;
void setRecipientString( const QString &, Recipient::Type );
QString 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 QString & 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 QString & 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 column is for them.
* Returns the width that is actually being used.
*/
int setFirstColumnWidth( int );
/**
* Set completion mode for all lines
*/
void setCompletionMode( KGlobalSettings::Completion );
/**
* Sets the font which will be used for the lineedits.
*/
void setEditFont( const QFont& font );
public slots:
void setFocus();
void setFocusTop();
void setFocusBottom();
void selectRecipients();
void saveDistributionList();
signals:
void focusUp();
void focusDown();
void completionModeChanged( KGlobalSettings::Completion );
void sizeHintChanged();
protected slots:
void slotPickedRecipient( const Recipient & );
private:
RecipientsView *mRecipientsView;
SideWidget* mSideWidget;
bool mModified;
};
#endif