diff -r 000000000000 -r eb1f2e154e89 textinput/peninputhwrfscn/src/peninputhwrfscncandidatepanel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputhwrfscn/src/peninputhwrfscncandidatepanel.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,622 @@ +/* +* Copyright (c) 2005-2006 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 for chinese peninput full screen hwr +* +*/ + +// SYSTEM INCLUDES +#include +#include + +// RESOURCE INCLUDE +#include + +// USER INCLUDES +#include "peninputhwrfscnlayout.h" +#include "peninputhwrfscncandidatepanel.h" +#include "peninputhwrfscnevent.h" +#include "peninputhwrfscncontrolid.h" +#include "peninputhwrfscnlafmanager.h" + +// CONSTANT DEFINITION HEADER +#include "peninputhwrfscnstoreconstants.h" + +TBool GetLandScape() + { + TPixelsTwipsAndRotation ptSize; + CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation( ptSize ); + + // set proper screen style FS HWR + // if width less than height then landscape is EFalse, or is ETrue + TBool isLandScape = ptSize.iPixelSize.iWidth > ptSize.iPixelSize.iHeight; + + return isLandScape; + } + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::NewL() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnCandidatePanel* CPeninputHwrfscnCandidatePanel::NewL( + CPeninputHwrfscnLayout* aLayout ) + { + CPeninputHwrfscnCandidatePanel* self = new( ELeave ) + CPeninputHwrfscnCandidatePanel( aLayout ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::CPeninputHwrfscnCandidatePanel() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnCandidatePanel::CPeninputHwrfscnCandidatePanel( + CPeninputHwrfscnLayout* aLayout ) + :CPeninputHwrfscnBasePanel( aLayout ), + iDataStore( aLayout->DataStore() ) + { + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::~CPeninputHwrfscnCandidatePanel() +// . +// ----------------------------------------------------------------------------- +// +CPeninputHwrfscnCandidatePanel::~CPeninputHwrfscnCandidatePanel() + { + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::ConstructL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::ConstructL() + { + iPos.iX = 0; + iPos.iY = 0; + + TBool isLandScape = GetLandScape(); + + ReadLafInfo( isLandScape ); + + // add candidate dropdown list + AddCandidateDropdownListL(); + + // add predictive dropdown list + AddPredictiveDropdownListL(); + + iDataStore.AddSubscriber( this ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::Show() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::Show( TBool aVisible ) + { + if( !aVisible ) + { + if( !iCandidateList->Hiden() ) + { + iCandidateList->ResetAndClear(); + } + + if( !iPredictList->Hiden() ) + { + iPredictList->ResetAndClear(); + } + } + + iCandidateList->Hide( !aVisible ); + iPredictList->Hide( !aVisible ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::Draw() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::Draw() + { + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::HandleControlEvent() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::HandleControlEvent( TInt aEventType, + CFepUiBaseCtrl* aCtrl, + const TDesC& aEventData ) + { + ReportEvent( aEventType, aCtrl, aEventData ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::HandleCommand() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::HandleCommand( TInt aCommand, + TUint8* aData ) + { + if( aCommand == EHwrEventPointerOutsideWnd ) + { + Show( EFalse ); + } + else if( aCommand == EHwrEventCursorPosChanged ) + { + TRect cursorRect = *( TRect* )aData; + if( iPos.iY != cursorRect.iBr.iY ) + { + MoveCandidateWindow( cursorRect ); + } + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::ShowWritingCandidate() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::ShowWritingCandidate( TBool aVisible ) + { + if( !aVisible ) + { + if( !iCandidateList->Hiden() ) + { + iCandidateList->ResetAndClear(); + } + } + + iCandidateList->Hide( !aVisible ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::BeforePropertyChangedL() +// . +// ----------------------------------------------------------------------------- +// +TBool CPeninputHwrfscnCandidatePanel::BeforePropertyChangedL( + MPeninputHwrfscnPropertySubscriber::TPeninputHwrfscnProperty /*aProptery*/ ) + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::PropertyChangedL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::PropertyChangedL( + MPeninputHwrfscnPropertySubscriber::TPeninputHwrfscnProperty aProptery ) + { + switch ( aProptery ) + { + case MPeninputHwrfscnPropertySubscriber::EPeninputHwrfscnPropertyCandidates: + { + iCandidateList->Hide( EFalse ); + + RPointerArray candidates = iDataStore.Candidate(); + TInt primaryRange = iDataStore.PrimaryRange(); + + if ( primaryRange == ERangeNumber ) + { + // display an un-expandable candidate list in number range + iCandidateList->SetCandidatesL( candidates, + CFepCtrlDropdownList::EListNoExpandable ); + } + else// in non number range + { + // display an expandable candidate list + iCandidateList->SetCandidatesL( candidates, + CFepCtrlDropdownList::EListExpandable ); + } + + // set the first cell high light + iCandidateList->SetHighlightCell( 0 ); + iLayout->LayoutOwner()->FlushUi(); + break; + } + + case MPeninputHwrfscnPropertySubscriber:: + EPeninputHwrfscnPropertyHomephonicCandidates: + { + RPointerArray candidates = iDataStore.Candidate(); + + if ( candidates.Count() <= KCandidateCountNumMode ) + { + // display an un-expandable candidate list + iCandidateList->SetCandidatesL( candidates, + CFepCtrlDropdownList::EListNoExpandable ); + } + else + { + // display an expandable candidate list + iCandidateList->SetCandidatesL( candidates, + CFepCtrlDropdownList::EListExpandable ); + } + + iCandidateList->SetHighlightCell( 0 ); + iLayout->LayoutOwner()->FlushUi(); + break; + } + + case MPeninputHwrfscnPropertySubscriber:: + EPeninputHwrfscnPropertyPredictives: + { + iPredictList->Hide( EFalse ); + + TInt primaryRange = iDataStore.PrimaryRange(); + RPointerArray predicts = iDataStore.Predictive(); + + if ( primaryRange == ERangeNumber || + primaryRange == ERangeEnglish ) + { + // display an un-expandable predictive list + iPredictList->SetCandidatesL( predicts, + CFepCtrlDropdownList::EListNoExpandable ); + } + else// in native range + { + // display an expandable predictive list + iPredictList->SetCandidatesL( predicts, + CFepCtrlDropdownList::EListExpandable ); + } + iLayout->LayoutOwner()->FlushUi(); + break; + } + + case MPeninputHwrfscnPropertySubscriber:: + EPeninputHwrfscnPropertyAddPredictives: + { + RPointerArray predicts = iDataStore.Predictive(); + + // add predict when pressing next page + iPredictList->AddCandidatesL( predicts, + CFepCtrlDropdownList::EListExpandable ); + + break; + } + + default: + break; + } + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::SizeChanged() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::SizeChanged() + { + ReadLafInfo( GetLandScape() ); + + // candidate dropdown list + iCandidateList->SetFont( PeninputHwrfscnLAFManager::CandidateFont() ); + + iCandidateList->SizeChanged( iUnitWidth, + iUnitHeight, + iUnitWidth, + iPos, + KCandidateCountPerRow, + KCandidateRowCount ); + + // predictive dropdown list + iPos.iY += iUnitHeight; + iPredictList->SetFont( PeninputHwrfscnLAFManager::CandidateFont() ); + + iPredictList->SizeChanged( iUnitWidth, + iUnitHeight, + iUnitWidth, + iPos, + KCandidateCountPerRow, + KCandidateRowCount ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::LafChanged() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::LafChanged() + { + + } +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::AddCandidateDropdownListL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::AddCandidateDropdownListL() + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, + R_FSHWR_CANDIDATE_DROP_DOWN_LIST ); + + const CFont *font = PeninputHwrfscnLAFManager::CandidateFont(); + TInt textMargin = ( iUnitHeight - font->HeightInPixels() ) / 2; + + // create the candidate list + + TRgb btnDownColor; + PeninputHwrfscnLAFManager::CandidateBtnDownBgColor( btnDownColor ); + + TDropdownListDrawInfo candiDrawInfo(KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonCandiSideL, + KAknsIIDQsnFrItutButtonCandiMiddle, + KAknsIIDQsnFrItutButtonCandiSideR, + KAknsIIDQsnFrItutButtonCandiPressedSideL, + KAknsIIDQsnFrItutButtonCandiPressedMiddle, + KAknsIIDQsnFrItutButtonCandiPressedSideR, + TRgb(194, 221, 242), + ETrue); + + + iCandidateList = CFepCtrlDropdownList::NewL( iPos, + iLayout, + EHwrCtrlIdCandidateList, + reader, + iUnitWidth, + iUnitHeight, + iUnitWidth, + KCandidateCountPerRow, + KCandidateRowCount, + font, + NULL, + CGraphicsContext::ECenter, + textMargin, + KRgbBlack, // border color + TRgb( 0xeeeeee ), // content bg color + KRgbWhite, // navi bg color + btnDownColor, + KRgbRed ); + + AddToRootControlL( iCandidateList ); + + // set candidate list resource + iCandidateList->SetResourceId( R_FSHWR_CANDIDATE_DROP_DOWN_LIST ); + + // set the needed events + iCandidateList->SetEventIdForCandidateSelected( EHwrEventCandidateSelected ); + + iCandidateList->AddEventObserver( this ); + + // hide the candidate list + iCandidateList->Hide( ETrue ); + + iCandidateList->SetDropdownListImgID(candiDrawInfo); + + CleanupStack::PopAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::AddPredictiveDropdownListL() +// . +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::AddPredictiveDropdownListL() + { + TResourceReader reader; + CCoeEnv::Static()->CreateResourceReaderLC( reader, + R_FSHWR_PREDICT_DROP_DOWN_LIST ); + + const CFont *font = PeninputHwrfscnLAFManager::CandidateFont(); + TInt textMargin = ( iUnitHeight - font->HeightInPixels() ) / 2; + + // create the predictive list + TRgb btnDownColor; + PeninputHwrfscnLAFManager::CandidateBtnDownBgColor( btnDownColor ); + + + TDropdownListDrawInfo candiDrawInfo(KAknsIIDQsnFrFunctionButtonInactive, + KAknsIIDQsnFrFunctionButtonNormal, + KAknsIIDQsnFrFunctionButtonPressed, + KAknsIIDQsnFrItutButtonComposeSideL, + KAknsIIDQsnFrItutButtonComposeMiddle, + KAknsIIDQsnFrItutButtonComposeSideR, + KAknsIIDQsnFrItutButtonComposePressedSideL, + KAknsIIDQsnFrItutButtonComposePressedSideR, + KAknsIIDQsnFrItutButtonComposePressedMiddle, + TRgb(194, 221, 242), + ETrue); + + + iPredictList = CFepCtrlDropdownList::NewL( iPos, + iLayout, + EHwrCtrlIdPredictiveList, + reader, + iUnitWidth, + iUnitHeight, + iUnitWidth, + KCandidateCountPerRow, + KCandidateRowCount, + font, + NULL, + CGraphicsContext::ECenter, + textMargin, + KRgbBlack, // border color + TRgb( 0xeeeeee ), // content bg color + KRgbWhite, // navi bg color + btnDownColor, + KRgbRed ); + + AddToRootControlL( iPredictList ); + + // set the predictive list resource + iPredictList->SetResourceId( R_FSHWR_PREDICT_DROP_DOWN_LIST ); + + // set the needed events + iPredictList->SetEventIdForCandidateSelected( + EHwrEventPredictiveSelected ); + iPredictList->SetEventIdForNextPageCandidate( + EHwrEventGetNextCandidatePage ); + iPredictList->SetEventIdForPreviousPageCandidate( + EHwrEventGetPreviousCandidatePage ); + iPredictList->AddEventObserver( this ); + + // hide the predictive list + iPredictList->Hide( ETrue ); + + iPredictList->SetDropdownListImgID(candiDrawInfo); + + CleanupStack::PopAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::ReadLafInfo +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::ReadLafInfo( TBool /*aLandscapeStyle*/ ) + { + // if size is changing, or unit size, shadow size have not been set yet + TRect rect( PeninputHwrfscnLAFManager::CandidateUnitRect() ); + iUnitWidth = rect.Width(); + iUnitHeight = rect.Height(); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::MoveCandidateWindow +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::MoveCandidateWindow( + const TRect aCursorRect ) + { + // clear the candidate window first + TRect oldCandidateRect = iCandidateList->Rect(); + TRect oldPredictRect = iPredictList->Rect(); + ClearWindow(); + + // calculate the extened list max height by primary range + TInt extendedListHeight = MaxRowNum() * iUnitHeight; + + if( !CheckCursorPosition( aCursorRect ) ) + { + // if the cursor position is not valid, set a default value + iPos.iY = iLayout->ScreenSize().iHeight - extendedListHeight - 1; + } + else + { + // set the default candidate window position to be below the cursor + iPos = aCursorRect.iBr; + } + + // calculate the bottom right Y of candidate window + TInt brOfCanWindow = iPos.iY + extendedListHeight; + + // get the screen extent + TSize screenSize = iLayout->ScreenSize(); + + // check if the extened window overflow + if( brOfCanWindow > screenSize.iHeight ) + { + // move the position to be above the cursor + iPos.iY = aCursorRect.iTl.iY - 3 * iUnitHeight; + + brOfCanWindow = iPos.iY + extendedListHeight; + + // check if the extened window still overflow + if( brOfCanWindow > screenSize.iHeight ) + { + iPos.iY = screenSize.iHeight - extendedListHeight; + } + } + + // Set the candiate winodw x positon to be center of the screen width + if(screenSize.iWidth < screenSize.iHeight) + { + iPos.iX = ( screenSize.iWidth - iUnitWidth * KCandidateCountNumMode ) / 2; + } + else + { + TRect mainPane = PeninputHwrfscnLAFManager::MainPaneRect(); + + iPos.iX = ( mainPane.Width() - iUnitWidth * KCandidateCountNumMode ) / 2; + } + + // set the candiate list position + iCandidateList->SetTopLeftPoint( iPos ); + + // set the predict list position + iPredictList->SetTopLeftPoint( TPoint( iPos.iX,iPos.iY+iUnitHeight ) ); + + iLayout->UpdateArea( iCandidateList, oldCandidateRect, EFalse ); + iLayout->UpdateArea( iPredictList, oldPredictRect, EFalse ); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::ClearWindow +// ----------------------------------------------------------------------------- +// +void CPeninputHwrfscnCandidatePanel::ClearWindow() + { + iCandidateList->Clear(); + iPredictList->Clear(); + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::MaxRowNum +// ----------------------------------------------------------------------------- +// +TInt CPeninputHwrfscnCandidatePanel::MaxRowNum() + { + /*TInt primaryRange = iDataStore.PrimaryRange(); + + if(primaryRange == ERangeNative) + { + return KMaxCandidateWinRowCount; + } + else if(primaryRange == ERangeNumber) + { + return KCandidateListCount; + } + else if(primaryRange == ERangeEnglish) + { + return KCandidateRowCount; + }*/ + + return KMaxCandidateWinRowCount; + } + +// ----------------------------------------------------------------------------- +// CPeninputHwrfscnCandidatePanel::CheckCursorPosition() +// ----------------------------------------------------------------------------- +// +TBool CPeninputHwrfscnCandidatePanel::CheckCursorPosition( + const TRect aCursorRect ) const + { + if( aCursorRect.iBr.iY < 0 || + aCursorRect.iBr.iY > iLayout->ScreenSize().iHeight ) + { + return EFalse; + } + else + { + return ETrue; + } + } + +//End of file