/*
* Copyright (c) 2009 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:  Implementation of hwr window class
*
*/


// System includes
#include <peninputhwrwindowjp.rsg>
#include <peninputhwrwindowconfiginfo_32.rsg>
#include <peninputdataconverter.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <peninputcommonlayoutglobalenum.h>  // EPeninputLayoutEventEnter
#include <peninputclientlayoutinfo.h>
#include <peninputcontextfieldjp.h>
#include <peninputeventbutton.h>
#include <peninputrepeatbutton.h>
#include <peninputdropdownlist.h>
#include <peninputjapanesepredictivewnd.h>
#include <peninputjapanesecandidatewnd.h>
#include <AknsUtils.h>
#include <aknfeppeninputenums.h>    // ERangeEnglish, ...

// User includes
#include "peninputhwrboxlayout.h"
#include "peninputhwrboxwindow.h"
#include "peninputhwrboxgroup.h"
#include "peninputhwrboxdatamgr.h"
#include "peninputhwrboxjp.hrh"
#include "peninputhwrevent.h"

// Constants
_LIT( KHwrWindowResourceFile,
      "z:\\resource\\plugins\\peninputhwrwindowjp.RSC" );
_LIT( KConfigurationResourceFile,
      "z:\\resource\\plugins\\peninputhwrwindowconfiginfo_32.RSC" );
const TInt KWndTransparencyFactor = 180;

const TInt KBoxCount = 1;


const TInt KWriteBoxFrameBackColorMajor = EAknsMajorSkin;
const TInt KWriteBoxFrameBackColorGrp = EAknsMinorQsnOtherColors;
const TInt KWriteBoxFrameBackColorIdx = EAknsCIQsnOtherColorsCG9; 
const TUint32 KDefaultWriteBoxFrameColor = 0x000000;
const TUint32 KDefaultWriteBoxBackColor = 0xffffff;
// ======== MEMBER FUNCTIONS ========

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::NewL
// (other items were commented in a header)
// --------------------------------------------------------------------------
CPeninputHwrBoxWindow* CPeninputHwrBoxWindow::NewL(
    CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext )
    {
    CPeninputHwrBoxWindow* self =
        new ( ELeave ) CPeninputHwrBoxWindow( aUiLayout, aLayoutContext );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    return self;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::~CPeninputHwrBoxWindow
// (other items were commented in a header)
// --------------------------------------------------------------------------
CPeninputHwrBoxWindow::~CPeninputHwrBoxWindow()
    {
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::HandleControlEvent
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::HandleControlEvent( TInt aEventType,
                                                    CFepUiBaseCtrl* aCtrl,
                                                    const TDesC& aEventData )
    {
    // Call this function in base class
    CPeninputLayoutWindowJp::HandleControlEvent( aEventType,
                                               aCtrl,
                                               aEventData );

    TInt* data = ( TInt* ) aEventData.Ptr();

    switch ( aEventType )
        {
        case EPeninputLayoutHwrEventPenColorChange:
            {
            iBoxGroup->SetBoxPenColor(*((TRgb*)data));
            }
            break;
        case EPeninputLayoutHwrEventPenSizeChange:
            {
            iBoxGroup->SetBoxPenSize(*((TSize*)data));
            }
            break;
        case EPeninputLayoutHwrEventWritingSpeedChange:
            {
            iBoxGroup->SetWritingSpeed(*data);

#ifdef _NOT_USING_DECUMA_MCR_

            // similar as S90
            iBoxGroup->SetStrokeDelay(90000);
#endif
            }
            break;
        case EPeninputLayoutHwrEventCandidates:
            {
            const TInt candiCount = static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CandidateCount();
            RArray<TInt> secondaryList;

            for (TInt i = 0; i < candiCount; i++)
                {
                if (i > candiCount - static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->PermittedRangesCount())
                    {
                    //cell index start from 1
                    secondaryList.Append(i);
                    }
                }
            iDropdownList->SetSecondaryList(secondaryList);

            secondaryList.Close();

            RPointerArray<HBufC>* candidates = (RPointerArray<HBufC>*)aEventData.Ptr();
            if ( candiCount )
                {
                TRAP_IGNORE(iDropdownList->SetCandidatesL(*candidates, CFepCtrlDropdownList::EListExpandableWithoutIcon));
                }
            else
                {
                TRAP_IGNORE(iDropdownList->SetCandidatesL(*candidates, CFepCtrlDropdownList::EListNoExpandable));
                }
            }
            break;
        case EPeninputLayoutEventSwitchCharacterRange:
            if (iCharacterRangeWnd)
                {
                CFepUiBaseCtrl* rangeBtn = Control(EPeninutWindowCtrlIdSwitchToVkbBtn);
                if (rangeBtn)
                    {
                    TRect rect = rangeBtn->Rect();
                    TPoint point;
                    point.iX = rect.iTl.iX-6;
                    point.iY = rect.iBr.iY-6;
                    iCharacterRangeWnd->SetPosition(point);
                    }
                TInt index = static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CurrentCharacterRangeIndex();
                if (0 <= index && index <static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CharacterRangeArray()->Count())
                    {
                    TRAP_IGNORE(iCharacterRangeWnd->ShowPopupL(static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CharacterRangeArray(), index));
                    }
                }
            break;
        case EPeninputLayoutEventCloseCharacterRange:
            if (iCharacterRangeWnd)
                {
                iCharacterRangeWnd->HidePopup();
                }
            break;
        case EPeninputLayoutEventSetCharacterRangeText:  // from datamgr::SetPremaryRange
            {
            TInt count = static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CharacterRangeArray()->Count();
            TBool dimmFlag = (count < 2)? ETrue : EFalse;
            TInt resourceId = R_PENINPUT_LAYOUT_HWR_SWITCH_RANGE_ALL;
            switch(static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->CharacterRangeId())
                {
                case EPeninutCharacterRangeIdKanaKanji:
                    resourceId = R_PENINPUT_LAYOUT_HWR_SWITCH_RANGE_KANA_KANJI;  // temporary
                    break;
                case EPeninutCharacterRangeIdLatin:
                    resourceId = R_PENINPUT_LAYOUT_HWR_SWITCH_RANGE_LATIN;
                    break;
                case EPeninutCharacterRangeIdNumber:
                    resourceId = R_PENINPUT_LAYOUT_HWR_SWITCH_RANGE_NUMERIC;
                    break;
                default:
                    break;
                }
            iCharacterRangeSwitchBtn->SetResourceId(resourceId);
            TRAP_IGNORE(iCharacterRangeSwitchBtn->ConstructFromResourceL());
            iCharacterRangeSwitchBtn->SetDimmed(dimmFlag);
            }
            break;
        case EPeninputLayoutEventSetConversion:
            iConvertBtn->SetDimmed(*((TBool*)data));
            break;
        case EPeninputLayoutHwrEventStrokeEndMark:
            {
            const TPoint endMark = *(TPoint*)(aEventData.Ptr());
            iBoxGroup->SetStrokeEndMark(endMark);
            }
            break;
        case EEventHwrStrokeStarted:
            {
            iDisableCaseChange = ETrue;
            }
            break;
        case EEventHwrCharacterTimerOut:
        case EEventHwrStrokeCanceled:
            {
            if (iDisableCaseChange)
                {
                iDisableCaseChange = EFalse;
                if (iCachedCase)
                    {
                    DoCaseChange(iCachedCase);
                    }
                }
            iCachedCase = 0;
            }
            break;
        default:
            break;
        }
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow:HandlePointerDownEventL
// Handle pointer down event
// (other items were commented in a header).
// ---------------------------------------------------------------------------
CFepUiBaseCtrl* CPeninputHwrBoxWindow::HandlePointerDownEventL(const TPoint& aPoint)
    {
    if (!CandidateWindow()->Hiden()
        && iDropdownList->Rect().Contains(aPoint)
        && !CandidateWindow()->Rect().Contains(aPoint))
        {
        return this;
        }
    return CPeninputLayoutWindowJp::HandlePointerDownEventL(aPoint);
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetWindowConfigResId
// (other items were commented in a header)
// --------------------------------------------------------------------------
TInt CPeninputHwrBoxWindow::GetWindowConfigResId()
    {
    return R_PENINPUT_LAYOUT_CONFIG_INFO;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetWindowResId
// (other items were commented in a header)
// --------------------------------------------------------------------------
TInt CPeninputHwrBoxWindow::GetWindowResId()
    {
    return R_PENINPUT_LAYOUT_HWR_WINDOW;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetWindowConfigResFileName
// (other items were commented in a header)
// --------------------------------------------------------------------------
const TDesC& CPeninputHwrBoxWindow::GetWindowConfigResFileName(
    TInt /*aLangID*/ )    // LangId : 32 fixed
    {
    return KConfigurationResourceFile();
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetWindowResFileName
// (other items were commented in a header)
// --------------------------------------------------------------------------
const TDesC& CPeninputHwrBoxWindow::GetWindowResFileName()
    {
    return KHwrWindowResourceFile();
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::ChangeUnitSize
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
const TRect CPeninputHwrBoxWindow::ChangeUnitSize()
    {
    TAknWindowLineLayout appWnd;
    TAknWindowLineLayout mainPane;
    TAknWindowLineLayout wndLayout;
    TAknWindowLineLayout unitLayout;
    TAknLayoutRect mainPaneRect;
    TAknLayoutRect wndRect;
    TAknLayoutRect unitRect;

    // Get hwr window layout
    appWnd = AknLayoutScalable_Avkon::application_window( 0 ).LayoutLine();

    if (appWnd.iW > appWnd.iH)
        {
        // landscape
        mainPane = AknLayoutScalable_Avkon::main_pane(4).LayoutLine();
        }
    else
        {
        // portrait
        mainPane = AknLayoutScalable_Avkon::main_pane(1).LayoutLine();
        }
    if (!iPredictiveWnd->Hiden())
        {
        wndLayout = AknLayoutScalable_Avkon::popup_fep_hwr_window(7).LayoutLine();
        }
    else
        {
        wndLayout = AknLayoutScalable_Avkon::popup_fep_hwr_window(6).LayoutLine();
        }

    mainPaneRect.LayoutRect(appWnd.Rect(), mainPane);
    wndRect.LayoutRect(mainPaneRect.Rect(), wndLayout);

    unitLayout = AknLayoutScalable_Avkon::fep_hwr_aid_pane().LayoutLine();
    unitRect.LayoutRect(wndRect.Rect(), unitLayout);

    TRect hwrWndRect = TRect(0,
                             0,
                             wndRect.Rect().Width(),
                             wndRect.Rect().Height());

    TInt unitWidth = unitRect.Rect().Width();
    TInt unitHeight = unitRect.Rect().Height();

    iLayoutContext->SetData( EPeninputDataTypeUnitWidth, &unitWidth );
    iLayoutContext->SetData( EPeninputDataTypeUnitHeight, &unitHeight );

    return hwrWndRect;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::ChangeClientSize
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::ChangeClientSize()
    {
    TAknTextLineLayout languageSwitchText;
    TInt unitWidth = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitWidth ) );
    TInt unitHeight = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitHeight ) );

    TInt clientLayoutId = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeClientLayout ) );
    CPeninputClientLayoutInfo* clientLayout =
        ConfigInfo()->FindClientLayoutInfo( clientLayoutId );

    if ( clientLayout )
        {
        // Change self rect
        TInt width = clientLayout->Columns() * unitWidth;
        TInt height = clientLayout->Rows() * unitHeight;
        TRect rect = TRect( ClientPane()->Rect().iTl,
                            TSize( width, height ) );

        ClientPane()->SetRect( rect );
        // Change the postion and size of controls in current layout
        ReorganizeControls( clientLayout->LayoutID(), ETrue );
        }
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::CreateAllControlsL
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::CreateAllControlsL()
    {
    CPeninputLayoutWindowJp::CreateAllControlsL();

    if (iInputContextField)
        {
        HeaderPane()->RemoveControl(static_cast<CFepUiBaseCtrl*>(iInputContextField));
        iInputContextField = NULL;
        }
    AddContextFieldJpL();

    // DropDown List
    AddDropdownListL();

    // Hwr box
    AddBoxGroupL();

    // convert button : use EventSpace
    iConvertBtn = AddButtonL( EPeninutWindowCtrlIdConvertToKanjiBtn,
                EPeninputLayoutEventSpace,
                R_PENINPUT_LAYOUT_HWR_CONVERT);
    iConvertBtn->SetDimmed(ETrue);

    // Backspace button
    AddButtonL( EPeninutWindowCtrlIdClear2Btn,
                EPeninputLayoutEventBack,
                R_PENINPUT_LAYOUT_HWR_BACKSPACE,
                EKeyBackspace,
                ETrue );

    // Enter button
    AddButtonL( EPeninutWindowCtrlIdEnterBtn,
                EPeninputLayoutEventEnter,
                R_PENINPUT_LAYOUT_HWR_ENTER,
                EKeyEnter );

    // character range switch button
    iCharacterRangeSwitchBtn = AddButtonL( EPeninutWindowCtrlIdInputLangSwitcherBtn,
                                 EPeninputLayoutEventSwitchCharacterRange,
                                 R_PENINPUT_LAYOUT_HWR_SWITCH_RANGE_ALL );

    // SCT button
    AddButtonL( EPeninutWindowCtrlIdSymbolBtn,
                EPeninputLayoutEventSct,
                R_PENINPUT_LAYOUT_HWR_SCT );

    // Switch to vkb button
    AddButtonL( EPeninutWindowCtrlIdSwitchToVkbBtn,
                EPeninputLayoutEventToVkb,
                R_PENINPUT_LAYOUT_HWR_VKB );
    
    if( iCtrlPool != NULL )
        {
        for ( TInt i = 0; i < iCtrlPool->ControlCount(); i++ )
            {
            iCtrlPool->ControlByIndex( i )->AddEventObserver( UiLayout() );
            }
        }
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::SetControlsFont
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::SetControlsFont()
    {
    CPeninputLayoutWindowJp::SetControlsFont();

    TAknTextLineLayout candTextLayout = AknLayoutScalable_Avkon::cell_hwr_candidate_pane_t1().LayoutLine();
    iDropdownList->SetFont(AknLayoutUtils::FontFromId(candTextLayout.iFont, NULL));
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::PopupChoiceList
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::PopupChoiceList()
    {
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::ReorganizeControls
// (other items were commented in a header)
// --------------------------------------------------------------------------
void CPeninputHwrBoxWindow::ReorganizeControls( TInt aClientLayoutId, TBool /*aNeedReset*/ )
    {
    TInt unitWidth = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitWidth ) );
    TInt unitHeight = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitHeight ) );

    // First remove all controls in the client pane, but don't delete them
    ( const_cast<RPointerArray<CFepUiBaseCtrl>&>
        ( ClientPane()->ControlList() ) ).Reset();

    // Clear rect
    ClearRect( ClientPane()->Rect() );
    UpdateArea( ClientPane()->Rect(), EFalse );

    // Then add controls according to the configuration of clientlayout
    CPeninputClientLayoutInfo* clientLayout =
        ConfigInfo()->FindClientLayoutInfo( aClientLayoutId );

    // Get control list from client layout
    RPointerArray<CPeninputControlInfo>& controlList =
        clientLayout->ControlInfoList();
    const TInt count = controlList.Count();
    TInt controlID = 0;
    TInt cols = 0;
    TInt rows = 0;
    CFepUiBaseCtrl* ctrl = NULL;
    TRect rect = ClientPane()->Rect();

    // Set rect for client area
    rect.SetSize( TSize( clientLayout->Columns() * unitWidth,
                         clientLayout->Rows() * unitHeight ) );
    ClientPane()->SetRect( rect );

    // Set owner rect
    SetWholeWindowRect( ClientPane()->Rect() );

    TPoint point = rect.iTl;

    for ( TInt i = 0; i < count; i++ )
        {
        controlID = controlList[i]->ControlID();
        ctrl = iCtrlPool->Control( controlID );

        if ( ctrl )
            {
            rect.iTl = point
                + TPoint( controlList[i]->BeginColumn() * unitWidth,
                          controlList[i]->BeginRow() * unitHeight );
            cols = controlList[i]->EndColumn()
                - controlList[i]->BeginColumn();
            rows = controlList[i]->EndRow()
                - controlList[i]->BeginRow();
            rect.SetSize( TSize( cols * unitWidth, rows * unitHeight ) );

            if ( ( ctrl->ControlType() | ECtrlButton ) == ECtrlButton )
                {
                ( static_cast<CAknFepCtrlButton*> ( ctrl ) )->SizeChanged
                    ( rect, ETrue );
                }
            else if ( ctrl->ControlId() == EPeninutWindowCtrlIdHwrBox )
                {
                iBoxGroup->SizeChanged( rect );
                static_cast<CPeninputHwrBoxLayout*>(UiLayout())->DataMgr(0)->SetInputAreaSize(rect.Size());
                }
            else if ( ctrl->ControlId() == EPeninutWindowCtrlIdDropDownList )   // DropDownList
                {
                iDropdownList->SizeChanged(unitWidth, unitHeight, unitWidth, rect.iTl, cols-1, rows);
                }
            AddNotOwnedControl( ctrl );
            }
        }
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetScrollUpBtnResId
// (other items were commented in a header)
// --------------------------------------------------------------------------
TInt CPeninputHwrBoxWindow::GetScrollUpBtnResId()
    {
    return R_PENINPUT_LAYOUT_HWR_SCROLL_UP;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::GetScrollDownBtnResId
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
TInt CPeninputHwrBoxWindow::GetScrollDownBtnResId()
    {
    return R_PENINPUT_LAYOUT_HWR_SCROLL_DOWN;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::DoCaseChange
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::DoCaseChange( TInt aNewCase )
    {
    if( iDisableCaseChange )
        {
        iCachedCase = aNewCase;
        return;
        }
    TInt* val = static_cast<TInt*>(iLayoutContext->RequestData(EPeninputDataTypePermittedRange));
    if ( *val & (ERangeEnglish | ERangeFullWidthEnglish))
        {
        iLayoutContext->SetData( EPeninputDataTypeCase, &aNewCase );
        }
    }

// ---------------------------------------------------------
// Highlight a dropdownlist cell
// ---------------------------------------------------------
//
void CPeninputHwrBoxWindow::HighlightCell(TInt aIndex)
    {
    iDropdownList->SetHighlightCell(aIndex);
    }

// ---------------------------------------------------------
// redraw dropdownlist
// ---------------------------------------------------------
//
void CPeninputHwrBoxWindow::DropdownListDraw()
    {
    iDropdownList->Draw();
    }

// ---------------------------------------------------------
// Cancel writing
// ---------------------------------------------------------
//
void CPeninputHwrBoxWindow::CancelWriting()
    {
    if (iBoxGroup)
        {
        iBoxGroup->CancelWriting();
        }
    }

// ---------------------------------------------------------
// Draw window and shadow
// ---------------------------------------------------------
//
void CPeninputHwrBoxWindow::DimInputContextField( TBool aFlag )
    {
    if ( iInputContextField )
        {
        iInputContextField->SetDimmed( aFlag );
        }
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow::SetDimmed
// Dim hwrbox
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::SetDimmed(TBool aDimFlag)
    {
    if (iBoxGroup)
        {
        iBoxGroup->SetDimmed(aDimFlag);
        }
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow::BoxGroup()
// hwrbox control
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
CPeninputHwrBoxGroup* CPeninputHwrBoxWindow::BoxGroup()
    {
    return iBoxGroup;
    }

// -----------------------------------------------------------------------------
// CPeninputHwrBoxWindow::ConstructFromResourceL
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::ConstructFromResourceL()
    {
    CPeninputLayoutWindowJp::ConstructFromResourceL();
    SetHwBoxFrameBackColor();
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow::SetEnableSettingBtnJp
// (other items were commented in a header)
// ---------------------------------------------------------------------------
//     
void CPeninputHwrBoxWindow::SetEnableSettingBtnJp(TBool aEnable)
    {
    if ( aEnable )
        {
        iTouchInputOptionButton->SetDimmed(EFalse);
        }
    else
        {
        iTouchInputOptionButton->SetDimmed(ETrue);
        iTouchInputOptionButton->SetActive(EFalse);
        } 
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::CPeninputHwrBoxWindow
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
CPeninputHwrBoxWindow::CPeninputHwrBoxWindow(
    CFepUiLayout* aUiLayout, MPeninputLayoutContext* aLayoutContext )
    : CPeninputLayoutWindowJp( aUiLayout, aLayoutContext ),
    iDisableCaseChange(EFalse)
    {
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::AddButtonL
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
CAknFepCtrlEventButton* CPeninputHwrBoxWindow::AddButtonL(
    const TInt aControlId, const TInt aEventId, const TInt aResId,
    const TInt aUnicode, const TBool aIsRepeat )
    {
    CAknFepCtrlEventButton* button = NULL;

    if ( aIsRepeat )
        {
        button = CAknFepCtrlRepeatButton::NewL( UiLayout(), aControlId,
                                                aEventId, aUnicode );
        }
    else
        {
        button = CAknFepCtrlEventButton::NewL( UiLayout(), aControlId,
                                               aEventId, aUnicode );
        }

    CleanupStack::PushL( button );
    if ( button )
        {
        // Read resource
        TResourceReader reader;

        CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId );
        button->SetResourceId( aResId );
        button->ConstructFromResourceL();
        // Pop and destroy reader
        CleanupStack::PopAndDestroy( 1 );

        // Add into the control pool
        if ( iCtrlPool )
            {
            iCtrlPool->AddControl( button );
            }
        }
    CleanupStack::Pop( button );

    return button;
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::AddBoxGroupL
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::AddBoxGroupL()
    {
    iBoxGroup = CPeninputHwrBoxGroup::NewL(UiLayout(), EPeninutWindowCtrlIdHwrBox, KBoxCount);
    iBoxGroup->SetTransparency(KWndTransparencyFactor, 100);

    if ( iCtrlPool )
        {
        iCtrlPool->AddControl( iBoxGroup );
        }
    SetHwBoxFrameBackColor();
    }

// --------------------------------------------------------------------------
// CPeninputHwrBoxWindow::SetHwBoxFrameBackColor
// (other items were commented in a header)
// --------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::SetHwBoxFrameBackColor()
    {
    TRgb frameColor;
    TRgb backColor;
    TAknsItemID id;
    
    id.Set(KWriteBoxFrameBackColorMajor, KWriteBoxFrameBackColorGrp);

    TInt error = AknsUtils::GetCachedColor(AknsUtils::SkinInstance(),
                                           frameColor,
                                           id,
                                           KWriteBoxFrameBackColorIdx);

    if (error != KErrNone)
        {
        frameColor = TRgb(KDefaultWriteBoxFrameColor);
        backColor = TRgb(KDefaultWriteBoxBackColor);
        }
    else
        {
        backColor = frameColor;	
        }

    if (iBoxGroup)
        {
        iBoxGroup->SetBoxFrameColor(frameColor);
        iBoxGroup->SetBoxBackColor(backColor);
        }
    }

// ---------------------------------------------------------
// Add dropdown list to window
// ---------------------------------------------------------
//
void CPeninputHwrBoxWindow::AddDropdownListL()
    {
    ChangeUnitSize();
    TInt unitWidth = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitWidth ) );
    TInt unitHeight = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitHeight ) );

    TResourceReader reader;
    CCoeEnv::Static()->CreateResourceReaderLC(reader,R_PENINPUT_LAYOUT_HWR_DROP_DOWN_LIST);

    TAknTextLineLayout candTextLayout = AknLayoutScalable_Avkon::cell_hwr_candidate_pane_t1().LayoutLine();

    TInt textMargin = (unitHeight -
                      AknLayoutUtils::FontFromId(candTextLayout.iFont, NULL)->HeightInPixels())/2;

    iDropdownList = CFepCtrlDropdownList::NewL(TPoint(Rect().iTl.iX, Rect().iTl.iY + unitHeight),
                                               UiLayout(),
                                               EPeninutWindowCtrlIdDropDownList,
                                               reader,
                                               unitWidth,
                                               unitHeight,
                                               unitWidth,
                                               PENINPUT_LAYOUT_HWR_COL_COUNT-1,
                                               PENINPUT_LAYOUT_HWR_ROW_COUNT,
                                               AknLayoutUtils::FontFromId(candTextLayout.iFont, NULL),
                                               NULL,
                                               CGraphicsContext::ECenter,
                                               textMargin,
                                               KRgbBlack,       // border color
                                               TRgb(0xeeeeee),  // content bg color
                                               KRgbWhite,       // navi bg color
                                               AKN_LAF_COLOR_STATIC(candTextLayout.iC),
                                               KRgbRed);

    if ( iCtrlPool )
        {
        iCtrlPool->AddControl( iDropdownList );
        }
    iDropdownList->SetResourceId(R_PENINPUT_LAYOUT_HWR_DROP_DOWN_LIST);
    iDropdownList->SetEventIdForCandidateSelected(EPeninputLayoutHwrEventCandidateSelected);
    CleanupStack::PopAndDestroy(); // reader
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow::SetWholeWindowRect
// [Ref]CPeninputLayoutWindow::SetWindowRect
// (other items were commented in a header).
// ---------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::SetWholeWindowRect(const TRect& aRect)
    {
    TRect rect = aRect;

    TInt unitHeight = CPeninputDataConverter::AnyToInt
        ( iLayoutContext->RequestData( EPeninputDataTypeUnitHeight ) );
    rect.iTl.iY = rect.iTl.iY - unitHeight;

    if (!iPredictiveWnd->Hiden())
        {
        TRect predictiveRect = aRect;
        predictiveRect.iTl.iY = predictiveRect.iBr.iY;
        predictiveRect.iBr.iY += iPredictiveWnd->Rect().Size().iHeight;
        iPredictiveWnd->SetRect(predictiveRect);
        rect.iBr.iY += iPredictiveWnd->Rect().Size().iHeight;
        }

    SetRect(rect);


    TRect shadowRect = TRect(TPoint(rect.iTl.iX - iShadowTlWidth,
                                    rect.iTl.iY - iShadowTlHeight),
                             TPoint(rect.iBr.iX + iShadowBrWidth,
                                    rect.iBr.iY + iShadowBrHeight));

    SetShadowRect(shadowRect);
    ICFDisableRegionUpdating();  // ICF::OnDeActivate()
    UiLayout()->SetShadowRect(shadowRect);
    ICFDisableRegionUpdating();  // ICF::OnDeActivate()

    HandleControlEvent(EPeninputLayoutEventMovePosition, NULL, KNullDesC);
    }

// ---------------------------------------------------------------------------
// CPeninputHwrBoxWindow::AddContextFieldJpL
// [ref]CPeninputLayoutWindow::AddContextFieldL( aResID )
// (other items were commented in a header)
// ---------------------------------------------------------------------------
//
void CPeninputHwrBoxWindow::AddContextFieldJpL()
    {
    // Get reference CControlGroup of headerPane
    CControlGroup* headerPane = HeaderPane();

    User::LeaveIfNull( headerPane );

    // Input context field
    iInputContextField = CFepInputContextFieldJp::NewL( TRect(),
        UiLayout(), EPeninutWindowCtrlIdInputContextField );

    // Read resource
    TResourceReader resReader;
    CCoeEnv::Static()->CreateResourceReaderLC( resReader, R_PENINPUT_LAYOUT_ICF );
    ReadIcfInfo( resReader );
    CleanupStack::PopAndDestroy( 1 );
    // Transfer to headerPane
    headerPane->AddControlL( iInputContextField );

    iInputContextField->SetFocus(ETrue);

    // Add layout as event observer
    iInputContextField->AddEventObserver( UiLayout() );
    }

