// CONTACUI.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//
#if !defined(__CONTACUI_H__)
#define __CONTACUI_H__

#include <cntdb.h>
#include <eikclb.h>

class CContactTemplate;
class CFieldUidArray;
class CContactIdArray;
class CContactUiSelectorArray;

struct TContactUiDeleteEntryParams
	{
	inline TContactUiDeleteEntryParams(TBool aDisabled=EFalse) : iDisabled(aDisabled),iFirstLine(NULL), iSecondLine(NULL){};
	inline TContactUiDeleteEntryParams(TBool aDisabled, const TDesC &aFirstLine,const TDesC &aSecondLine) : iDisabled(aDisabled), iFirstLine(&aFirstLine), iSecondLine(&aSecondLine) {};
	TBool iDisabled;
	const TDesC *iFirstLine;
	const TDesC *iSecondLine;
	};

struct TContactUiParamsBase
	{
	inline TContactUiParamsBase(const TDesC *aTitle) : iTitle(aTitle) {};
	const TDesC *iTitle;
	};

struct TContactUiNewEntryParams : public TContactUiParamsBase
	{
	inline TContactUiNewEntryParams(CContactItem *aTemplate, CContactViewDef *aViewDef=NULL, const TDesC *aTitle=NULL) : TContactUiParamsBase(aTitle), iTemplate(aTemplate), iViewDef(aViewDef) {};
	CContactItem *iTemplate;
	CContactViewDef *iViewDef;
	};

struct TContactUiEditEntryParams : public TContactUiParamsBase
	{
	inline TContactUiEditEntryParams(CContactViewDef *aViewDef=NULL, const TDesC *aTitle=NULL) : TContactUiParamsBase(aTitle), iViewDef(aViewDef) {};
	CContactViewDef *iViewDef;
	};

struct TContactUiSelectorParams : public TContactUiParamsBase
	{
	IMPORT_C TContactUiSelectorParams(CFieldUidArray *aFieldArray,CContactIdArray *&aSelection,const CContactIdArray *aInitialSelection, const TContactUiEditEntryParams &aEditEntry, const TContactUiNewEntryParams &aNewEntry, const TContactUiDeleteEntryParams &aDeleteEntry, const TDesC *aTitle=NULL);
	CFieldUidArray *iFieldArray;
	CContactIdArray *&iSelection;
	const CContactIdArray *iInitialSelection;
	TContactUiEditEntryParams iEditEntryParams;
	TContactUiNewEntryParams iNewEntryParams;
	TContactUiDeleteEntryParams iDeleteEntryParams;
	};

class CFieldUidArray : public CArrayFixFlat<TUid>
	{
public:
	IMPORT_C CFieldUidArray();
	IMPORT_C static CFieldUidArray *NewL();
	IMPORT_C static CFieldUidArray *NewL(TUid aFieldType);
	IMPORT_C static CFieldUidArray *NewL(TUid aFieldType1, TUid aFieldType2);
	IMPORT_C static CFieldUidArray *NewL(const CFieldUidArray *aFieldArray);
	IMPORT_C static CFieldUidArray *NewLC();
	IMPORT_C static CFieldUidArray *NewLC(TUid aFieldType);
	IMPORT_C static CFieldUidArray *NewLC(TUid aFieldType1, TUid aFieldType2);
	IMPORT_C static CFieldUidArray *NewLC(const CFieldUidArray *aFieldArray);
protected:
	void CloneL(const CFieldUidArray *aFieldArray);
	};
//
// ContactUi
//

class ContactUi
	{
public:
	enum
		{
		EDisplayBusyMsg=1,
		EDoNotCancelBusyMsg=2,
		EUseExitInErrorDialog=4,
		};
public:
	static IMPORT_C CContactDatabase* OpenL();
	static IMPORT_C CContactDatabase* OpenL(TInt aFlags);
	static IMPORT_C CContactDatabase* OpenL(TInt aFlags,TInt aResId);
	static IMPORT_C CDesCArray* CrackFindStringL(const TDesC& aFindString);
	static IMPORT_C CContactItem* OpenContactL(CContactDatabase* aDatabase,TContactItemId aContactId);
	static IMPORT_C TInt EnableArrayCache();
	static IMPORT_C void DisableArrayCache(TInt aHandle);
	static IMPORT_C TInt LoadResourceFileL();
	static IMPORT_C void DeleteResourceFile(TInt aHandle);
	static IMPORT_C void DeleteResourceFile(TAny *aHandle);	// For use with TCleanupItem
	static IMPORT_C TBool NewEntryDialogL(CContactDatabase* aDataBase, const TContactUiNewEntryParams &aParams, TContactItemId *aNewItemId=NULL);
	static IMPORT_C TBool EditEntryDialogL(CContactDatabase* aDataBase, TContactItemId aEntry, const TContactUiEditEntryParams &aParams);
	static IMPORT_C TBool MultiPageEditEntryDialogL(CContactDatabase* aDataBase,TContactItemId aEntry,const TDesC *aTitle);
	static IMPORT_C TBool MultiPageNewEntryDialogL(CContactDatabase* aDataBase,CContactTemplate* aNewItemTemplate,TContactItemId& aEntry,const TDesC *aTitle);
	static IMPORT_C TBool EditTemplateDialogL(CContactDatabase* aDataBase,const TDesC* aTitle=NULL);
	static IMPORT_C TBool FindDialogL(TDes& aFindString,const TDesC* aTitle=NULL);
	static IMPORT_C TInt SelectEntriesDialogL(CContactDatabase* aDataBase,const TContactUiSelectorParams &aParams);
	static IMPORT_C TInt SelectEntriesDialogL(CContactDatabase* aDataBase,const TContactUiSelectorParams &aParams,TInt aNumColumns,CFbsBitmap* aBitmap=NULL);
	static IMPORT_C void CompactDatabaseL(CContactDatabase* aDataBase);
	static IMPORT_C void CheckAndRepairDamageAsyncL(CContactDatabase* aDataBase);
	static IMPORT_C void CheckAndRepairDamageL(CContactDatabase* aDataBase);
	static IMPORT_C void FormatDateField(CContactItemField& aField,TDes& aBuffer);
	static IMPORT_C void ContactInfoDialogL(CContactDatabase* aDatabase,const TDesC* aTitle=NULL);
	static IMPORT_C void HandleRollBackL(CContactDatabase* aDatabase,const TDesC& aButtonText);
	static IMPORT_C void DeleteContactL(CContactDatabase* aDatabase,TContactItemId aContactId);
	static IMPORT_C void DeleteContactsL(CContactDatabase* aDatabase,const CContactIdArray& aContacts);
	static IMPORT_C TPtrC DateFormatString();
	static IMPORT_C TInt FindWordSplitterL(TAny *aParams);
	static IMPORT_C TInt ChangeDatabaseDriveL(TDriveUnit aDriveUnit,TBool& aCopy);
private:
	friend class CContactUiSelector;
    static void doCheckAndRepairDamageL(CContactDatabase* aDataBase, TBool aAsync, TBool aRetry);
    static void doRecoverL(CContactDatabase* aDataBase, TBool aAsync);
	static void SetArrayCache(CContactUiSelectorArray *aSelectorArray);
	static CContactUiSelectorArray *TakeCachedArray(CContactDatabase* aDatabase, CFieldUidArray *aFieldArray);
	static CContactDatabase* HandleUnrepairableDatabaseL(TInt aFlags,TInt aResId);
	static CContactDatabase* TryFindDatabaseL(TInt aError,TBool& aRetry,TInt aFlags,TInt aResId);
	static CContactDatabase* doOpenL(TInt aFlags,TInt aResId);
	};

#endif
