#ifndef ADDRESSEESELECTOR_H
#define ADDRESSEESELECTOR_H

#include <qframe.h>
#include <klistview.h>
#include <kdialogbase.h>
#include <kabc/addressbook.h>
#include <kabc/addressee.h>

class QBoxLayout;

class AddresseeView : public KListView
{
  Q_OBJECT

public:
  enum Columns {
    Picture,
    Name,
    WorkInfo,
    PreferredEmail,
    Emails,
    PreferredPhone,
    Phones,
    MobilePhone,
    HomePhone,
    HomeFax,
    WorkPhone,
    WorkFax,
    PreferredAddress,
    Addresses,
    HomeAddress,
    WorkAddress,
    Categories,
    ColumnsNumber /* keep at the end! */
  };

  AddresseeView( QWidget *parent=0,
		 const char *name=0 );
  ~AddresseeView( void );

  KABC::Addressee addressee( void );
  KABC::Addressee::List addressees( void );
  bool eventFilter( QObject *o, QEvent *e );


public slots:
  void setColumnVisibility( int column, bool visible=true );
  void showColumn( int column );
  void hideColumn( int column );
  void adjustColumn( int column );

signals:
  void showPictures( void );
};





class AddresseeItem : public KListViewItem
{
public:
  AddresseeItem( const KABC::Addressee &addressee,
		 AddresseeView *view,
		 bool loadImage=false );

  KABC::Addressee AddresseeItem::addressee( void ) const;
  void setImage( void );

private:
  void setColumns( bool loadImage=false );
  void setWorkInfo( void );
  void setPhones( void );
  void setAddresses( void );
  QImage loadImage( const KURL &url );

  KABC::Addressee mAddressee;
};





class AddresseeSelector : public QFrame
{
  Q_OBJECT

private:
  class AddresseeSelectorPrivate;
  AddresseeSelectorPrivate *d;
  QBoxLayout *mLayout;
  bool mLoadImages;

  void init( KABC::AddressBook *addressbook );
  void updateAddressees( void );

public:
  AddresseeSelector( QWidget *parent=0,
		     const char *name=0 );
  AddresseeSelector( KABC::AddressBook *addressbook,
		     QWidget *parent=0,
		     const char *name=0 );
  ~AddresseeSelector( void );

  AddresseeView *view( void ) const;
  KABC::Addressee addressee( void ) const;
  KABC::Addressee::List addressees( void ) const;

private slots:
  void addressBookChanged( void );
  void showPictures( void );
  void emitSelectionChanged( void );
  void emitSelectionChanged( QListViewItem *i );
  void emitCurrentChanged( QListViewItem *i );
  void emitClicked( QListViewItem *i );
  void emitDoubleClicked( QListViewItem *i );

public slots:
  void loadAddressBook( bool loadimages=false );
  void loadImages( void );
  void unloadImages( void );
  void setColumnVisibility( int column, bool visible=true );

signals:
  void selectionChanged( void );
  void selectionChanged( const KABC::Addressee &contact );
  void currentChanged( const KABC::Addressee &contact );
  void clicked( const KABC::Addressee &contact );
  void doubleClicked( const KABC::Addressee &contact );
};





class AddresseeSelectorDialog : public KDialogBase
{
  Q_OBJECT

public:
  AddresseeSelectorDialog( QWidget *parent=0,
			   bool multiple=false,
			   bool loadImages=false );
  AddresseeSelectorDialog( KABC::AddressBook *addressbook,
			   QWidget *parent=0,
			   bool multiple=false,
			   bool loadImages=false );

  virtual ~AddresseeSelectorDialog( void );

  KABC::Addressee addressee();
  KABC::Addressee::List addressees();

  static KABC::Addressee getAddressee( QWidget *parent );
  static KABC::Addressee::List getAddressees( QWidget *parent );

private:
  AddresseeSelector *mAddresseeSelector;

  void init( bool loadImages, bool multiple );
};

#endif /* ADDRESSEESELECTOR_H */

