/*
* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). 
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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:
*
* Description:           
*       Provides the CAknFepUICtrlContainerChinese definition.
*
*/











#ifndef __AKN_FEP_UI_AVKON_CONTAINER_CHINESE_H__
#define __AKN_FEP_UI_AVKON_CONTAINER_CHINESE_H__

#include <AknFepUiCtrlContainerChinese.h>
#include <coecntrl.h>
#include <AknUtils.h>

class CAknsFrameBackgroundControlContext;
class CAknFepUICtrlInputPane;
class CAknFepUICtrlCandidatePane;
class CAknFepUICtrlPinyinPopup;
class CAknFepUICtrlPinyinEEP;
class MAknFepManagerUIInterface;
class CAknFepUiLayoutDataMgr;

class MAknFepUICtrlPinyinPopupSizeChangedObserver
    {
public:
    /// this is called when the selection popup changes size
    virtual void SelectionPopupSizeChanged(TInt aNumLines) = 0;

    /// this is called when the popup is enabled
    virtual void SelectionPopupEnabled(TBool aEnabled) = 0;
    };

NONSHARABLE_CLASS(CAknFepUICtrlContainerChinese)
    : 
    public CCoeControl, 
    public MAknFepUICtrlPinyinPopupSizeChangedObserver,
    public MAknFepUICtrlContainerChinese
{
public:
    /**
     * first phase construction
     */
    static CAknFepUICtrlContainerChinese* NewL();

    /**
     * destructor
     */
    ~CAknFepUICtrlContainerChinese();

    /**
     * get the input pane
     *
     * @return pointer to the input pane, ownership is not passed
     */
    MAknFepUICtrlInputPane* InputPane() const;

    /**
     * get the candidate pane
     *
     * @return pointer to the candidate pane, ownership is not passed
     */
    MAknFepUICtrlCandidatePane* CandidatePane() const;

    /**
     * get the phrase pinyin popup window 
     *
     * @return pointer to the phrase popup window, ownership is not passed
     */
    MAknFepUICtrlPinyinPopup* PinyinPopupWindow() const;

    /**
     * 
     * get the pinyin phrase creation popup window 
     * 
     * @return pointer to the pinyin phrase popup window, ownership is not passed
    */
    MAknFepUICtrlEditPane* EditPaneWindow() const;    
    
    /**
     * Is the control displayed on the screen?
     *
     * @return if not enabled, returns EFalse
     *
     */
    TBool IsEnabled() const;
	 /**
     * Enables the display of the control. Sets the control's 
     * window postion and visibility, but only if the value has
     * changed (so it's ok to call it excessively). 
     *
     * @param aEnable if ETrue, makes visible
     *                          if EFalse, makes non-visible
     *
     */
    void Enable(TBool aEnable);

    /**
     * Arrange the constituent panes into the correct proportions for 
     * the required layout. 
     *
     * @param aPaneLayout the required layout
     *
     */
    void SetLayout(TPaneLayout aPaneLayout);
 

    /**
     * Set the Highlight to the desired control.
     *
     * @param aValue if aValue is ETrue set the focus to the Candidate Pane.
     *                          if aValue is EFalse set focus to the Chinese Input Pane 
     */
    void FocusCandidatePane(TBool aValue);

    /**
     * enable/disable the rendering of the Horizontal Scroll Arrows. 
     *
     * @param aValue if ETrue, enable the arrows
     *                          if EFalse, disable the arrrows
     */
    void ShowHorizontalScrollArrows(TBool aValue);
    
    /**
     * enable/disable the rendering of the Vertical Scroll Arrows. 
     *
     * @param aValue if ETrue, enable the arrows
     *                          if EFalse, disable the arrrows
     */
    void ShowVerticalScrollArrows(TBool aValue);

    /**
     * Call this method if the fep is being displayed for a control that is 
     * contained in a popup window (i.e. a Query). It changes the layout 
     * of the container.
     *
     * @param aValue if ETrue, use the layout for display with a query
     *                          if EFalse, use the normal layout
     */
    void SetIsShownWithPopupWindows(TBool aValue);

     /**
     * This function sets cursor position.
     *
     * @param aCurPos containing the cursor position 
     * @param aHeight containing font height
     */
    void SetContainerPosition(TPoint aCurPos,TInt aHeight);
    
    /**
     * Set Candidate and pinyin popup invisible
     *
     */
    void SetControlInVisible( TBool aVisible ); 
    
    /**
     * Set the state to phrase creation
     */
    void PhraseCreation( TBool aPhraseCreation );
    
    /**
     * Is the state is in phrase creation
     *
     * @return if not enabled, return EFalse
     */
    TInt& IsPhraseCreation();
    
    /**
     * Set FepMan
     *
     * @return if not enabled, return EFalse
     */
    void SetFepMan( MAknFepManagerUIInterface* aFepMan );

public: // from CCoeControl

    /**
     * size changed
     */
    virtual void SizeChanged();

    /**
     * count component controls
     *
     * @return number of contained controls
     */
    TInt CountComponentControls() const;

    /**
     * Component control
     *
     * @param aIndex the control to return, must be between 0 and the number of controls
     * @return pointer to contained control, ownership is not passed
     * 
     */
    CCoeControl* ComponentControl(TInt aIndex) const;

    /**
     * draw
     *
     * @param aRect rectangle
     *
     */
    virtual void Draw(const TRect& aRect) const;

    virtual void HandleResourceChange(TInt aType); 
	
protected: // From CCoeControl
    TTypeUid::Ptr MopSupplyObject(TTypeUid aId);

public: // from MAknFepUICtrlPinyinPopupSizeChangedObserver

    /**
     * called when the popup window changes size, so that it can be 
     * laid out correctly
     *
     * @param aNumLines the number of visible lines
     */
    void SelectionPopupSizeChanged(TInt aNumLines);

    /**
     * the popup has been enabled or disabled, so change layout where necessary 
     *
     * @param aEnabled ETrue if popup has been enabled
     *                              EFalse if popup has been disabled
     */
    void SelectionPopupEnabled(TBool aEnabled);
protected:

    /**
     * second phase construction
     */
    void ConstructL();

    /**
     * constructor
     */
    CAknFepUICtrlContainerChinese();

    /**
     * layout this control relative to the control pane (aka the CBA).
     */
    void LayoutContainer();
    /**
     * layout the rectangles
     */
    void LayoutRects();
	/**
     * layout entry pane
     */
	void LayoutInputPane();
    /**
     * layout contained controls
     */
    void LayoutContainedControls();

    /**
     * layout the popup window
     */
    void LayoutPinyinPopupWindow();
    
    /**
     * layout the EEP window
     */
    void LayoutPinyinEEPWindow();

    /**
     * set control vilisibilty, according to the current pane layout
     */
    void SetControlVisibility();

    /**
     * return the layout as an index that can be passed to the 
     * layout dll 
     *
     * @return index into layout macro
     */
    TInt ConvertLayoutToIndex() const;

    /**
     * layout the background frames
     */
	void LayoutFrames();

    /**
     * layout the background frames
	 *
	 * @param aOuterRect filled with outer rect coords
	 * @param aInnerRect filled with inner rect coords
	 *
     */
	void CalculateFrameRects(TRect& aOuterRect, TRect& aInnerRect) const;    

private:
    CAknFepUiLayoutDataMgr* iLafDataMgr;
    CAknFepUICtrlInputPane* iInputPane;
    CAknFepUICtrlCandidatePane* iCandidatePane;
	CAknFepUICtrlPinyinPopup* iPinyinPopupWindow;
	CAknFepUICtrlPinyinEEP* iEditPane;
	CAknsFrameBackgroundControlContext* iBgContext; 

private:
	TBool iEnabled;
	TPaneLayout iPaneLayout;
    TBool iIsShownWithPopupWindows;
	// input pane
	TAknLayoutRect iRectCoverMainPaneInput;
    TAknLayoutRect iRectFirstShadowInput;
    TAknLayoutRect iRectOutlineFrameInput;
    TAknLayoutRect iRectInsideAreaInput;
    TAknLayoutRect iHorizLine; //line between input pane and candidate pane
    TAknLayoutRect iEEPFirstHorizLine; //line between input pane and EEP pane
    TAknLayoutRect iEEPSecondHorizLine;////line between input pane and candidate pane when EEP exist
    TPoint iContainerPosition;
    TBool isPCLPosed;
    TBool iPhraseCreationLaf;
    
    TInt iPhraseCreation;
    MAknFepManagerUIInterface* iFepMan;
};
#endif  // __AKN_FEP_UI_AVKON_CONTAINER_CHINESE_H__

// End of file

