// AGMXKEY.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__AGNXKEY_H__)
#define __AGNXKEY_H__


#if !defined(__E32BASE_H__)
#include <e32base.h>
#endif

#if !defined(__AGMDATE_H__)
#include <agmdate.h>
#endif

#if !defined(__AGMIDS_H__)
#include <agmids.h>
#endif

//-------------------------------- Local classes -------------------------------

class TAgnKeySingleApptDate;
class TAgnKeyRptApptDate;
class TAgnKeyTodoDate;
class TAgnKeyAlarm;
class TAgnKeyEntryInfo;

// -------------------------------- Referenced classes--------------------------

class CAgnSortEntry;
class CAgnApptInfo;
class CAgnEventInfo;
class CAgnAnnivInfo;
class CAgnTodoInfo;

template <class T,class KeyValue>
class TAgnKeyBase : public TKeyArrayFix 		
	{
public:
	inline TAgnKeyBase() : TKeyArrayFix(0, ECmpNormal,sizeof(T*)) {}
	virtual KeyValue GetKeyValue(const T* aEntry) const = 0;
	virtual TInt Compare(const T* aLeft, const T* aRight) const = 0;	
	virtual TInt Compare(const T* aEntry) const = 0;
	virtual void SetValue(const KeyValue& aDate) = 0;
private:
	};
// -----------------------------------------------------------------------------
class TAgnKeyDate : public TAgnKeyBase<CAgnSortEntry,TAgnDate> 		
	{
public:
	TAgnKeyDate() : TAgnKeyBase<CAgnSortEntry,TAgnDate>() {}
	void SetValue(const TAgnDate& aDate);
	virtual TInt Compare(TInt aLeft,TInt aRight) const;
	TInt Compare(const CAgnSortEntry* aLeft, const CAgnSortEntry* aRight) const;	
	TInt Compare(const CAgnSortEntry* aEntry) const;
	virtual TAgnDate GetKeyValue(const CAgnSortEntry* aEntry) const = 0;
private:
	TAgnDate iSearchKeyValue;
	};

// ----------------------------TAgnKeyStartDate---------------------------------
class TAgnKeyStartDate : public TAgnKeyDate
	{
public:
	TAgnKeyStartDate() : TAgnKeyDate() {}
	virtual TAgnDate GetKeyValue(const CAgnSortEntry* aEntry) const;
	};

// ----------------------------TAgnKeyRptDate-----------------------------------
class TAgnKeyRptDate : public TAgnKeyDate
	{
public:
	TAgnKeyRptDate() : TAgnKeyDate() {}
	virtual TAgnDate GetKeyValue(const CAgnSortEntry* aEntry) const;
	};

// ----------------------------TAgnKeyTodoNonRptDate----------------------------
class TAgnKeyTodoNonRptDate : public TAgnKeyDate
	{
public:
	TAgnKeyTodoNonRptDate() : TAgnKeyDate() {}
	virtual TAgnDate GetKeyValue(const CAgnSortEntry* aEntry) const;
	};

// ----------------------------TAgnKeyEntryInfo---------------------------------
class TAgnKeyEntryInfo : public TAgnKeyBase<CAgnSortEntry,TAgnEntryId> 
	{
public:
	TAgnKeyEntryInfo() : TAgnKeyBase<CAgnSortEntry,TAgnEntryId>() {}
	virtual TInt Compare(TInt aLeft,TInt aRight) const;
	TInt Compare(const CAgnSortEntry* aLeft, const CAgnSortEntry* aRight) const;	
	void SetValue(const TAgnEntryId& aKeyValue);
	TInt Compare(const CAgnSortEntry* aEntry) const;
	TAgnEntryId GetKeyValue(const CAgnSortEntry* aEntry) const;
private:
	TAgnEntryId iSearchKeyValue;	// temp test at getting entry with keyvalue
	};

#endif
// -------------------------------- EOF ----------------------------------------
