// EIKMENUP.H
//
// Copyright (c) 1997-1999 Symbian Ltd.  All rights reserved.
//

#if !defined(__EIKMENUP_H__)
#define __EIKMENUP_H__

#if !defined(__EIKBCTRL_H__)
#include <eikbctrl.h>
#endif

#if !defined(__EIKDEF_H__)
#include <eikdef.h>
#endif

#if !defined(__EIKSBOBS_H__)
#include <eiksbobs.h> // for TEikScrollEvent
#endif

class MEikMenuObserver;
class CEikHotKeyTable;
class CEikMenuPaneTitle;
class CEikButtonBase;
class CEikScrollBarFrame;
class CEikScrollBar;
class TEikScrollBarModel;

class CEikMenuPane : public CEikBorderedControl
	{	
private:
	class CItemArray;
	enum {ENothingSelected=-1};
	class CMenuScroller;
	friend class CMenuScroller;
public:
	typedef TBuf<20> THotKeyDisplayText;
	class TItem
		{
	public:
		struct SData
			{
			enum { ENominalTextLength=80 };
			TInt iCommandId;
			TInt iCascadeId;
			TInt iFlags;
			TBuf<ENominalTextLength> iText; // less than this actually stored
			TBuf<ENominalTextLength> iExtraText;
			};
	public:
		TInt ItemLength() const;
	public:
		friend class CEikMenuPane;
		friend class CItemArray;
		TInt iPos;
		TInt iHotKeyCode;
		SData iData;
		};
public:
	IMPORT_C ~CEikMenuPane();
	IMPORT_C CEikMenuPane(MEikMenuObserver* aMenuObserver);

	IMPORT_C void ConstructL(CEikMenuPane* aOwner);
	IMPORT_C void Reset();
public: // framework
	IMPORT_C TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType);
	IMPORT_C void HandlePointerEventL(const TPointerEvent& aPointerEvent);
protected: // framework
	IMPORT_C void Draw(const TRect& aRect) const;
	IMPORT_C void FocusChanged(TDrawNow aDrawNow);
	IMPORT_C void ConstructFromResourceL(TResourceReader& aReader);
public: // new functions
	IMPORT_C void AddMenuItemL(const TItem::SData& aMenuItem);
	IMPORT_C void DeleteMenuItem(TInt aCommandId);
	IMPORT_C TItem::SData& ItemData(TInt aCommandId);
	IMPORT_C TItem* ItemAndPos(TInt aCommandId,TInt& aPos);
	IMPORT_C void StartDisplayingMenuPane(const CEikHotKeyTable* aHotKeyTable,const TPoint& aTargetPos, const CEikMenuPaneTitle* aMenuPaneTitle,TInt aMinWidth,  TPopupTargetPosType aTargetType = EPopupTargetTopLeft);
	IMPORT_C void SetItemTextL(TInt aCommandId,const TDesC& aDes);
	IMPORT_C void SetItemTextL(TInt aCommandId,TInt aRid);
	IMPORT_C void SetItemDimmed(TInt aCommandId,TBool aDimmed);
	IMPORT_C void SetItemButtonState(TInt aCommandId,TInt aButtonState);
	IMPORT_C void SetSelectedItem(TInt aSelectedItem);
	IMPORT_C TInt SelectedItem() const;
	IMPORT_C void CloseCascadeMenu();
	IMPORT_C void SetItemArray(CItemArray* aItemArray);
	IMPORT_C void SetItemArrayOwnedExternally(TBool aOwnedExternally);
	IMPORT_C void SetLaunchingButton(CEikButtonBase* aButton);
	IMPORT_C void MoveHighlightTo(TInt aNewSelectedItem);
	IMPORT_C TInt NumberOfItemsInPane() const;
	IMPORT_C void Close();
	IMPORT_C TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,TEventCode aType,TBool aConsumeAllKeys); // not available before Platform 004
private:
	enum { EInvalidCurrentSize=0x01 };
private: // new functions
	TSize CalculateSize();
	enum THighlightType {ENoHighlight,EDrawHighlight,ERemoveHighlight};
	void DrawItem(CGraphicsContext& aGc,TInt aItem,THighlightType aHighlight) const;
	void DrawCascadeSymbol(CGraphicsContext& aGc,const TRect& aRect,TRgb aColor) const;
	void FindHotKeyDisplayText(TDes& aDes,const TItem& aItem) const;
	void ReportSelectionMadeL();
	void ReportCanceled();
	void GiveVisualFeedback();
	void LaunchCascadeMenuL(TInt aCascadeMenuId);
	void DoLaunchCascadeMenuL(TInt aCascadeMenuId);
	void TryLaunchCascadeMenuL(const TItem& aItem);
	void PrepareGcForDrawingItems(CGraphicsContext& aGc) const;
	TBool ItemArrayOwnedExternally();
	TBool IsHotKeyL(const TInt modifiers,const TInt aCode);
	TBool MoveToItemL(TInt aCode, TInt aModifiers);
	void HandleScrollEventL(CEikScrollBar* aScrollBar,TEikScrollEvent aEventType);
	void CreateScrollBarFrame();
	void UpdateScrollBar();
	void DoUpdateScrollBarL();
	static TInt UpdateScrollBarCallBackL(TAny* aObj);
	TRect ViewRect() const;
	TInt NumberOfItemsThatFitInView() const;
	TInt TotalItemHeight() const;
	void ScrollToMakeItemVisible(TInt aItemIndex);
	void Scroll(TInt aAmount);
	TBool CheckCreateScroller();
	void CheckCreateScrollerL();
private: // from CCoeControl
	IMPORT_C void Reserved_1();
	IMPORT_C void Reserved_2();
private:
	friend class CEikMenuButton; // added by SimonC 7/7/97
	MEikMenuObserver* iMenuObserver;
	CEikMenuPane* iCascadeMenuPane;
	const CEikMenuPaneTitle* iMenuPaneTitle;
 	const CEikHotKeyTable* iHotKeyTable;
	CEikMenuPane* iOwner;
	CItemArray* iItemArray;
	TBool iArrayOwnedExternally;
	TBool iAllowPointerUpEvents;
	TInt iNumberOfDragEvents;
	TInt iSelectedItem;
	TInt iItemHeight;
	TInt iBaseLine;
	TInt iHotkeyColWidth;
//	CFbsBitmap*  iBBitmap;
//	CFbsBitmap*  iBHBitmap;
//	CFbsBitmap*  iBMaskBitmap;
	TInt iFlags;
	CEikScrollBarFrame* iSBFrame;
	CMenuScroller* iScroller;
	CEikButtonBase* iLaunchingButton; // for popouts only
	};
#endif

