textinput/peninputhwrfscn/src/peninputhwrfscncandidatepanel.cpp
changeset 0 eb1f2e154e89
--- /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 <AknUtils.h>
+#include <aknfeppeninputenums.h>
+
+// RESOURCE INCLUDE
+#include <peninputhwrfscreencn.rsg>
+
+// 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<HBufC> 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<HBufC> 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<HBufC> 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<HBufC> 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