/*
 * Copyright (c) 2010 Ixonos Plc.
 * All rights reserved.
 * This component and the accompanying materials are made available
 * under the terms of the "Eclipse Public License v1.0"
 * which accompanies this distribution, and is available
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
 *
 * Initial Contributors:
 * Nokia Corporation - Initial contribution
 *
 * Contributors:
 * Ixonos Plc
 *
 * Description: 
 * Selection popup dialog header file.
 *
 */

#ifndef _SELECTIONPOPUP_H
#define _SELECTIONPOPUP_H

// INCLUDES
#include <coecntrl.h>
#include <AknDialog.h>
#include <AknUtils.h>

#include "PreviewControlBase.h"

class CFbsBitmap;
//class TAknLayoutText;

NONSHARABLE_CLASS( CSelectionPopup ) : public CPreviewControlBase
	{

public:

	/** Default constructor, cannot leave.
	 *
	 *   @since S60 5.0
	 *   @param -
	 *	@return -
	 */
	CSelectionPopup(TRgb& aCurrentColor, const TRect& aImageRect);

	/** Destructor
	 *
	 *   @since S60 5.0
	 *	@param -
	 *	@return -
	 */
	~CSelectionPopup();

	/** Second phase constructor
	 *
	 *   @since S60 5.0
	 *	@param aParent - Parent control
	 *	@return -
	 */
	void ConstructL(CCoeControl* aParent);

	/**	OfferKeyEventL	
	 *
	 *	@see CCoeControl
	 */
	TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType);

	/**	HandlePointerEventL	
	 *
	 *	@see CCoeControl
	 */
	void HandlePointerEventL(const TPointerEvent &aPointerEvent);

public:
	//new methods

	/** GridRect
	 *
	 * Returns popup component's rectangle area
	 *
	 * @since S60 5.0
	 * @param -
	 * @return TRect The area of the popup
	 */
	TRect GridRect() const;

	/** HighlightedItemPressed
	 *
	 *   This function can be used to check whether user has pressed (by stylus)
	 *   currently highlighted color item. 
	 *
	 *   @since S60 5.0
	 *   @param aPosition position value to be checked.
	 *   @return ETrue if aPosition is in the rect area of currently highlighted
	 *          plugin item, EFalse otherwise.
	 */
	TBool HighlightedItemPressed(TPoint aPosition) const;

	/** SetSelectedValue
	 *
	 * Set currently highlighted item
	 *
	 * @param aSelected selected item index.    
	 * @since S60 5.0
	 */
	void SetSelectedValue(TInt aSelected);

	/** GetSelectedValue
	 *
	 * Returns current highlighted item value
	 *
	 * @since S60 5.0
	 * @return TInt Currently selected value
	 */
	TInt GetSelectedValue() const;

private:

	/** CreateColorBitmapsL
	 *
	 * Creates a bitmap array
	 *
	 * @since S60 5.0
	 * @param aSize Size that color bitmaps should be created to
	 * @return -
	 */
	void CreateColorBitmapsL(TSize aSize);

protected:

	/**	SizeChanged	
	 *
	 *	@see CCoeControl
	 */
	virtual void SizeChanged();

	/**	Draw	
	 *
	 *	@see CCoeControl
	 */
	virtual void Draw(const TRect& aRect) const;

private:

	// Popup graphic bitmaps
	CFbsBitmap* iPopupCenter;
	CFbsBitmap* iPopupCenterMask;
	CFbsBitmap* iPopupCornerTL;
	CFbsBitmap* iPopupCornerTLMask;
	CFbsBitmap* iPopupCornerTR;
	CFbsBitmap* iPopupCornerTRMask;
	CFbsBitmap* iPopupCornerBL;
	CFbsBitmap* iPopupCornerBLMask;
	CFbsBitmap* iPopupCornerBR;
	CFbsBitmap* iPopupCornerBRMask;
	CFbsBitmap* iPopupSideL;
	CFbsBitmap* iPopupSideLMask;
	CFbsBitmap* iPopupSideR;
	CFbsBitmap* iPopupSideRMask;
	CFbsBitmap* iPopupSideT;
	CFbsBitmap* iPopupSideTMask;
	CFbsBitmap* iPopupSideB;
	CFbsBitmap* iPopupSideBMask;

	// Popup rects
	TRect iPopupCenterRect;
	TRect iPopupCornerTLRect;
	TRect iPopupCornerTRRect;
	TRect iPopupCornerBLRect;
	TRect iPopupCornerBRRect;
	TRect iPopupSideLRect;
	TRect iPopupSideRRect;
	TRect iPopupSideTRect;
	TRect iPopupSideBRect;
	TRect iHeadingRect;

	// Format and layout information of the heading text
	TAknLayoutText iLayoutTextHeading;

	// Contains rectangles of all grid highlight items
	RArray<TRect> iHighlightRectsArray;

	// Contains rectangles of all grid color items
	RArray<TRect> iGridRectsArray;

	// Color bitmaps
	RPointerArray<CFbsBitmap> iColorBitmapsArray;

	// Used values
	RArray<TInt> iItemArray;

	TInt iCurrentItem;

	TRgb iCurrentColor;

	TRect iImageRect;
	};

NONSHARABLE_CLASS( CSelectionDialog ) : public CAknDialog
	{
public:

	/** RunDlgLD
	 *
	 *	@param aBitmap - background bitmap
	 *	@param aRect - Rect for the dialog
	 *	@param aSelection - Selected value to be returned
	 *	@return - ExecuteLD() return value
	 */
	static TInt RunDlgLD(const CFbsBitmap* aBitmap, const TRect& aRect,
			TInt& aSelection, TRgb& aCurrentColor, const TRect& aImageRect);

	virtual ~CSelectionDialog();

	/** OkToExitL
	 * 
	 *   From CAknDialog update member variables .
	 *   @param aButtonId The ID of the button that was activated.
	 *   @return Should return ETrue if the dialog should exit,
	 *           and EFalse if it should not
	 */
	TBool OkToExitL(TInt aButtonId);

	/** Draw
	 * 
	 * 
	 * @see CAknDialog
	 *
	 */
	void Draw(const TRect& aRect) const;

	/** SizeChanged
	 * 
	 * 
	 * @see CCoeControl
	 *
	 */
	virtual void SizeChanged();

	/** OfferKeyEventL
	 *  
	 * @see CCoeControl
	 *
	 */
	virtual TKeyResponse OfferKeyEventL(const TKeyEvent& aKeyEvent,
			TEventCode aType);

	/**	HandlePointerEventL	
	 *
	 *	@see CCoeControl
	 */
	virtual void HandlePointerEventL(const TPointerEvent &aPointerEvent);

	/** PreLayoutDynInitL
	 *  
	 * @see CEikDialog
	 *
	 */
	virtual void PreLayoutDynInitL();

	/** CountComponentControls
	 *  
	 * @see CCoeControl
	 *
	 */
	TInt CountComponentControls() const;

	/** ComponentControl
	 *  
	 * @see CCoeControl
	 *
	 */
	virtual CCoeControl* ComponentControl(TInt aIndex) const;

private:
	// implementation

	CSelectionDialog(TInt& aSelectino);
	void ConstructL(const CFbsBitmap* aBitmap, const TRect& aRect,
			TRgb& aCurrentColor, const TRect& aImageRect);

private:

	// Own: popup component
	CSelectionPopup* iPopup;

	// Ref: Selected color   
	TInt& iCurrentValue;
	};

#endif // _SELECTIONPOPUP_H
