// ADDRCONT.H
//
// Copyright (c) 1998 Symbian Ltd.  All rights reserved. 
//

// MODULE - Message editor addressing control base class

#if !defined(__ADDRCONT_H__)
#define __ADDRCONT_H__

#if !defined(__EIKEDWIN_H__)
#include <eikedwin.h>
#endif

#if !defined(__BADESCA_H__)
#include <BADESCA.H>
#endif

#if !defined(__CNTDBOBS_H__)
#include <cntdbobs.H>			// MContactDbObserver
#endif

// Forward references
class CContactDatabase;
class CFieldUidArray;
class CContactItem;
class CContactIdArray;
class CContactItemFieldSet;
class CContactChangeNotifier;
//

/////////////////////////////////////////////
//          CMsgAddressingControl          //
/////////////////////////////////////////////
class CMsgAddressingControl : public CEikEdwin, public MContactDbObserver
	{
public:
	// --- Construction ---
	IMPORT_C CMsgAddressingControl();
	IMPORT_C virtual ~CMsgAddressingControl();
	//
	// --- Contacts manager methods ---
	IMPORT_C void SelectEntriesFromContactsL();
	IMPORT_C void AddCurrentAddressToContactsL();
	//
	// --- New methods ---
	IMPORT_C void AddAddresseeL(const TDesC& aAddressee);
	IMPORT_C void AddAddresseesL(const CDesCArray& aAddresseeArray);
	IMPORT_C TBool AddresseeExistsL(const TDesC& aAddressee) const;
	IMPORT_C void FillAddresseeArrayL(CDesCArray& aAddresseeArray) const;
	IMPORT_C TBool AddRecipientSeparatorIfNoneAlreadyL();

protected:
	// --- Specifici to CMsgAddressingControl ---
	IMPORT_C TPtrC FindNextAddressL(TInt& aPosStart) const;
	virtual TInt RecipientSeparatorResourceIdL() const = 0;
	//
	// --- From CCoeControl / CEikEdwin ---
	IMPORT_C virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);
	IMPORT_C virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent);
	// 
	// --- Contacts DB handling ---
	virtual CFieldUidArray* PreferredSelectionContactsFieldsLC(TInt& aNumColumns) const = 0;
	virtual TUid NewItemContactsField() const = 0;
	virtual HBufC* NewItemContactsFieldNameLC() const = 0;
	virtual CWsBitmap* ContactsBitmapL() const = 0;
	void AddContactEntriesL(CContactIdArray* aSelection);
	IMPORT_C virtual CContactItem* ContactsTemplateLC2() const;
	IMPORT_C void SetupContactsLinkL();
	IMPORT_C void CloseContactsLink();
	TInt SelectAddressFromContactL(const CDesCArray& aAddressArray, const CContactItemFieldSet& aFieldSet) const;
	//
	// --- From MContactDbObserver ---
	IMPORT_C virtual void HandleDatabaseEventL(TContactDbObserverEvent aEvent);

private:
	// --- Internal methods ---
	void InsertRecipientSeparatorL(TInt aPosition) const;
	TPtrC GetAddressee(TPtrC aPtr) const;
	void SelectPreviousAddressL();
	void SelectNextAddressL();
	void SelectAddressAtL(TInt aTextPos);
	TInt FindStartOfAddressL(const TDesC& aSeparator, TInt aPos);
	TInt FindEndOfAddressL(const TDesC& aSeparator, TInt aPos);
	void ChangeTemplateL();

private:
	// --- Data ---
	CContactDatabase*		iContactsDatabase;
	TInt					iContactsResourceHandle;
	TInt					iContactsCacheHandle;
	CContactChangeNotifier*	iChangeNotifier;
	TBuf<8> 				iRollBackButtonText;
	CWsBitmap*				iContactsBitmap;
	};

#endif//__ADDRCONT_H__

