textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp
branchRCL_3
changeset 12 5e18d8c489d6
child 19 ac7e4d1d9209
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp	Tue May 25 13:03:44 2010 +0300
@@ -0,0 +1,645 @@
+/*
+* Copyright (c) 2009-2010 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 symbol table.
+*
+*/
+
+
+// INCLUDE
+#include <peninputfingerhwrarwnd.rsg>
+
+#include <coemain.h>
+#include <s32mem.h>
+#include <barsread.h>
+
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknLayoutDef.h>
+#include <AknUtils.h>
+#include <AknsUtils.h>
+#include <akniconutils.h>
+#include <aknfeppeninputenums.h>
+#include <AknFepGlobalEnums.h>
+
+#include <peninputlayout.h>
+#include <peninputrepeatbutton.h>
+
+#include "hbufcarrayar.h"
+#include "peninputfingerhwrarevent.h"
+#include "peninputfingerhwrarcontrolid.h"
+#include "peninputfingerhwrarstoreconstants.h"
+#include "peninputlayoutvkb.h"
+#include "peninputfingerhwrarnumsymboltable.h"
+
+
+// ---------------------------------------------------------------------------
+// Symbian Constructor
+// ---------------------------------------------------------------------------
+//
+CPeninputArabicFingerHwrNumSymbolTable* CPeninputArabicFingerHwrNumSymbolTable::NewL( 
+    CFepUiLayout* aUiLayout, TInt aId )
+    {
+    CPeninputArabicFingerHwrNumSymbolTable* self = CPeninputArabicFingerHwrNumSymbolTable::NewLC( 
+            aUiLayout, aId );
+    
+    CleanupStack::Pop( self ); // self;
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Symbian Constructor
+// ---------------------------------------------------------------------------
+//
+CPeninputArabicFingerHwrNumSymbolTable* CPeninputArabicFingerHwrNumSymbolTable::NewLC( 
+    CFepUiLayout* aUiLayout, TInt aId )
+    {
+    CPeninputArabicFingerHwrNumSymbolTable* self = new (ELeave) CPeninputArabicFingerHwrNumSymbolTable( 
+            aUiLayout, aId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// C++ constructor.
+// ---------------------------------------------------------------------------
+//
+CPeninputArabicFingerHwrNumSymbolTable::CPeninputArabicFingerHwrNumSymbolTable( 
+    CFepUiLayout* aFepUiLayout, TInt aControlId )
+    : CControlGroup( aFepUiLayout, aControlId ),iIsNativeNumMode(EFalse)
+    {
+	SetControlType(ECtrlControlGroup|ECtrlTactileFeedback);
+	SetTactileFeedbackType(ETouchFeedbackSensitiveInput);
+    }
+	
+// ---------------------------------------------------------------------------
+// c++ destructor
+// ---------------------------------------------------------------------------
+//
+CPeninputArabicFingerHwrNumSymbolTable::~CPeninputArabicFingerHwrNumSymbolTable()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// popup the list.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::OpenSymbolTable()
+    {
+    CapturePointer( ETrue );
+    iPopupVisible = ETrue; 
+    iCurrentNumSCTType = ENumSCTLatin;
+	UiLayout()->LockArea(UiLayout()->Rect(),this);  
+    UpdateNumSymbolTable(ENumSCTLatin);
+	}
+
+// ---------------------------------------------------------------------------
+// cancel the popup.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::CloseSymbolTable()
+    {
+    CapturePointer( EFalse );
+    iPopupVisible = EFalse;
+    UiLayout()->UnLockArea(UiLayout()->Rect(),this);
+    }
+
+// ---------------------------------------------------------------------------
+// get visibility of popup.
+// ---------------------------------------------------------------------------
+//
+TBool CPeninputArabicFingerHwrNumSymbolTable::IsPopup()
+    {
+    return iPopupVisible;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle pointer down event.
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerDownEventL(
+    const TPoint& aPoint )
+    {
+    CancelPointerDownL();
+    CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerDownEventL( aPoint );
+	
+    if(!ctrl)
+	   {
+	   ReportEvent(EHwrEventOutsideEvent);
+	   }
+	else
+       {
+	    #ifdef RD_TACTILE_FEEDBACK
+        if (UiLayout()->SupportTactileFeedback())
+            {
+            UiLayout()->DoTactileFeedback(ETouchFeedbackSensitiveInput);
+            }
+        #endif //RD_TACTILE_FEEDBACK
+	   ctrl->UpdateArea(ctrl->Rect(),EFalse);
+	   }	
+	   
+    return ctrl;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle pointer up event.
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerUpEventL(
+    const TPoint& aPoint )
+    {
+    CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerUpEventL( aPoint );
+
+    if(ctrl)
+	   {
+	   ctrl->UpdateArea(ctrl->Rect(),EFalse);
+	   }
+
+	return ctrl;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle pointer move event.
+// ---------------------------------------------------------------------------
+//
+CFepUiBaseCtrl* CPeninputArabicFingerHwrNumSymbolTable::HandlePointerMoveEventL(
+    const TPoint& aPoint )
+    {
+	CFepUiBaseCtrl* ctrl = CControlGroup::HandlePointerMoveEventL( aPoint );
+	if(ctrl)
+	    {
+		HandlePointerEnter(aPoint);
+		ctrl->UpdateArea(ctrl->Rect(),EFalse);
+		}
+	else
+	    {
+	    HandlePointerLeave(aPoint);
+	    UpdateArea(iRect,EFalse);
+	    }
+	
+    return ctrl;
+    }
+    
+// ---------------------------------------------------------------------------
+// Symbian second-phase constructor.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::ConstructL()
+    {
+    BaseConstructL(); 
+	
+    // disable border
+    SetBorderSize( TSize(0,0) );
+    
+	// construct virtual keypad
+	CreateVirtualKeypadL();
+    }
+
+// ---------------------------------------------------------------------------
+// SizeChanged
+// ---------------------------------------------------------------------------
+//	
+void CPeninputArabicFingerHwrNumSymbolTable::SizeChanged(
+                     const TRect aVirtualKeypadRect, const RArray<TRect> /*aBtnRects*/,
+                     const TInt /*aKeypadRow*/, const TInt /*aKeypadCol*/, TBool aIsLandscape)
+    {
+	iIsLandscape = aIsLandscape;
+	
+	// relayout the virtual key pad
+	iNumKeypad->SetRect(aVirtualKeypadRect);
+	
+	}
+	
+// ---------------------------------------------------------------------------
+// create symbol table keypad.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::CreateVirtualKeypadL()
+    {
+    TFontSpec spec;
+
+    iNumKeypad = CVirtualKeyboard::NewL( 
+        TRect(0,0,0,0),
+        UiLayout(),
+        EHwrCtrlIdNumSymbolTableVkb,
+        spec );
+
+    AddControlL( iNumKeypad );
+    iNumKeypad->AddEventObserver( UiLayout() );
+    
+	iNumKeypad->SetKeySkinId( EKeyBmpNormal, KAknsIIDQsnFrKeypadButtonFrNormal );
+    iNumKeypad->SetKeySkinId( EKeyBmpHighlight, KAknsIIDQsnFrKeypadButtonFrPressed );
+    iNumKeypad->SetKeySkinId( EKeyBmpDim, KAknsIIDQsnFrKeypadButtonFrInactive );
+    iNumKeypad->SetResourceId( KInvalidResId );
+        
+    iNumKeypad->SetKeyTextColorGroup( EAknsCIQsnTextColorsCG68 );
+    iNumKeypad->SetDrawOpaqueBackground( EFalse );    
+    }
+
+void CPeninputArabicFingerHwrNumSymbolTable::OnActivate()
+    {
+    CControlGroup::OnActivate();
+	}
+
+// ---------------------------------------------------------------------------
+//  Read control's background info.
+// ---------------------------------------------------------------------------
+//	
+void CPeninputArabicFingerHwrNumSymbolTable::ConstructFromResourceL()
+    {
+	if ( iResourceId == KInvalidResId )
+        {
+        User::Leave( KErrArgument );
+        }
+    
+    TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, iResourceId );
+    
+	const TInt32 bgImageResId = reader.ReadInt32();
+	LoadBackgroundFromResourceL(bgImageResId);
+	
+	CleanupStack::PopAndDestroy( 1 ); //reader
+	
+	
+	CControlGroup::ConstructFromResourceL();
+	}
+	
+// ---------------------------------------------------------------------------
+//  Read control's background info.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::LoadBackgroundFromResourceL( const TInt aResId )
+    {
+    if ( aResId == 0 )
+        return;
+    
+    if ( BackgroundBmp() )
+        {
+        CFbsBitmap* bkBmp = BackgroundBmp();
+        delete bkBmp;   
+        SetBackgroundBmp( NULL );
+        }
+    if ( BkMaskBmp() )
+        {
+        CFbsBitmap* bkMaskBmp = BkMaskBmp();
+        delete bkMaskBmp;
+        SetBackgroundMaskBmp( NULL );
+        }    
+
+    TResourceReader resReader;
+    CCoeEnv::Static()->CreateResourceReaderLC( resReader, aResId ); 
+     
+    TPtrC bmpFileName = resReader.ReadTPtrC();
+    TInt32 imgMajorSkinId = resReader.ReadInt32();
+
+    TAknsItemID id;
+    TInt skinitemid;
+    
+    MAknsSkinInstance* skininstance = AknsUtils::SkinInstance();
+    const TInt16 bmpId = resReader.ReadInt16();
+    const TInt16 bmpMskId = resReader.ReadInt16();
+    skinitemid = resReader.ReadInt16();   
+    id.Set( TInt( imgMajorSkinId ), skinitemid );
+    
+    if ( bmpId != KInvalidImg )
+        {
+        CFbsBitmap* backgroundImg = NULL;
+        CFbsBitmap* backgroundMaskImg = NULL;
+        if ( bmpMskId != KInvalidImg )
+            {
+            AknsUtils::CreateIconL( skininstance, id, backgroundImg,
+                    backgroundMaskImg, bmpFileName, bmpId, bmpMskId );
+            }
+        else
+            {
+            AknsUtils::CreateIconL( skininstance, id, backgroundImg,
+                    bmpFileName, bmpId );
+            }
+       
+        SetBackgroundBmp( backgroundImg );
+        SetBackgroundMaskBmp( backgroundMaskImg );           
+        }
+    CleanupStack::PopAndDestroy( 1 ); //reader
+    }
+	
+// ---------------------------------------------------------------------------
+// Load virtual keys image
+// ---------------------------------------------------------------------------
+//	
+void CPeninputArabicFingerHwrNumSymbolTable::LoadVkbKeyImageL(TInt aResId, const TSize& aKeySize)
+    {
+	TResourceReader reader;    
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId );      
+    
+    TPtrC bmpFileName = reader.ReadTPtrC();
+    TInt32 imgMajorSkinId = reader.ReadInt32();
+    TAknsItemID id;
+    
+    TSize keySize = aKeySize;
+    
+    for ( TInt index = 0; index <= EKeyBmpLastType ; index += 2 )
+        { 
+        // Get the image ids and mask ids from resource
+        TInt bmpId = reader.ReadInt16(); 
+        TInt bmpMskId = reader.ReadInt16();
+        
+        // read skin item id
+        const TInt skinitemid = reader.ReadInt16();
+        id.Set( TInt( imgMajorSkinId ), skinitemid );
+        
+        if ( bmpId != KInvalidImg )
+            {
+            CFbsBitmap* bmp = NULL;
+            CFbsBitmap* maskbmp = NULL;
+
+            if ( bmpMskId != KInvalidImg )
+                {
+                AknsUtils::CreateIconL( AknsUtils::SkinInstance(),
+                   id, bmp, maskbmp, bmpFileName, bmpId, bmpMskId );
+                
+                // set maskbmp and size
+                AknIconUtils::SetSize( maskbmp, keySize, EAspectRatioNotPreserved );
+                iNumKeypad->SetNonIrregularKeyBitmapL( 
+                TVirtualKeyBmpType( EKeyBmpNormal + index + 1 ), maskbmp );
+                }
+            else
+                {
+                AknsUtils::CreateIconL( AknsUtils::SkinInstance(), id, 
+                    bmp, bmpFileName, bmpId );
+                }
+            // set bmp and size
+            AknIconUtils::SetSize( bmp, keySize, EAspectRatioNotPreserved );
+            iNumKeypad->SetNonIrregularKeyBitmapL( 
+                TVirtualKeyBmpType( EKeyBmpNormal + index ), bmp );
+            }       
+        }
+    // Pop and destroy reader
+    CleanupStack::PopAndDestroy( 1 );        
+	}
+
+// ---------------------------------------------------------------------------
+// Load virtual keys
+// ---------------------------------------------------------------------------
+//	
+void CPeninputArabicFingerHwrNumSymbolTable::LoadVirtualKeypadKeyL(const TInt aResId, const RArray<TRect>& aCellRects)
+    {
+	iNumKeypad->SetResourceId(aResId);
+	
+	TResourceReader reader;
+    CCoeEnv::Static()->CreateResourceReaderLC( reader, aResId );
+
+    // construct keys
+    TInt resKeyCount = reader.ReadInt16();
+    TInt existsKeyCount = iNumKeypad->KeyArray().Count();
+    TInt rectCount = aCellRects.Count();
+    
+    for ( TInt i = 0; i < resKeyCount; i++ )
+        {
+        if ( i < existsKeyCount )
+            {
+            CVirtualKey* vk = iNumKeypad->KeyArray()[i];
+            UpdateVkbKeyL( vk, reader, aCellRects[i%rectCount] );
+            }
+        else
+            {
+            CVirtualKey* vk = CreateVkbKeyL( reader, aCellRects[i%rectCount] );
+            CleanupStack::PushL( vk );
+            iNumKeypad->AddKeyL( vk );
+            
+            CleanupStack::Pop( vk );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( 1 ); // reader
+    
+    iNumKeypad->Draw();
+    iNumKeypad->UpdateArea( iNumKeypad->Rect() );
+	}
+
+// ---------------------------------------------------------------------------
+// create virtual key.
+// ---------------------------------------------------------------------------
+//
+CVirtualKey* CPeninputArabicFingerHwrNumSymbolTable::CreateVkbKeyL( TResourceReader& aReader, 
+    const TRect aKeyRect )
+    {
+    CHBufCArray* keytexts = CHBufCArray::NewL();
+    CleanupStack::PushL( keytexts );
+    
+    for ( TInt i = 0; i <= EPosLast; i++ )
+        {
+        HBufC* unicode = aReader.ReadHBufCL();
+        keytexts->Array().AppendL( unicode );
+        }
+
+    TInt keyscancode = aReader.ReadInt16();
+
+    HBufC* text = keytexts->Array()[0];
+    
+    CVirtualKey* vk = NULL;
+    if ( text )
+        {
+        vk = CVirtualKey::NewL( *text, keyscancode, aKeyRect, aKeyRect, 0 );
+        }
+    else 
+        {
+        vk = CVirtualKey::NewL( KNullDesC, keyscancode, aKeyRect, aKeyRect, 0 );
+        }
+
+    CleanupStack::PopAndDestroy( keytexts ); //keytexts
+
+    
+    TRect innerrect = aKeyRect;
+    innerrect.Shrink( TSize(10, 10) );
+    vk->SetInnerRect( innerrect );
+    
+    return vk;
+    }
+
+// ---------------------------------------------------------------------------
+// update virtual key info.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::UpdateVkbKeyL( CVirtualKey* aVirtualKey, 
+    TResourceReader& aReader, const TRect aKeyRect )
+    {
+    CHBufCArray* keytexts = CHBufCArray::NewL();
+    CleanupStack::PushL( keytexts );
+    
+    for ( TInt i = 0; i <= EPosLast; i++ )
+        {
+        HBufC* unicode = aReader.ReadHBufCL();
+        keytexts->Array().AppendL( unicode );
+        }
+
+    TInt keyscancode = aReader.ReadInt16();
+
+    HBufC* text = keytexts->Array()[0];
+    if ( text )
+        {
+        aVirtualKey->SetKeyData( *text );
+        }
+    else
+        {
+        aVirtualKey->SetKeyData( KNullDesC );
+        }
+    
+    aVirtualKey->SetKeyScancode( keyscancode );
+
+    CleanupStack::PopAndDestroy( keytexts ); //keytexts
+
+    aVirtualKey->SetRect(aKeyRect);
+    TRect innerrect = aKeyRect;
+    innerrect.Shrink( TSize(10,10) );
+    aVirtualKey->SetInnerRect( innerrect );
+    }
+
+// ---------------------------------------------------------------------------
+// accept editor's number mapping restriction.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::SetNumericMapping( const TDesC& aNumMapping )
+    {
+    //format of aNumMapping is "0123456789******"
+    
+    //char offset in aNumMapping
+    //cell 0 using aNumMapping[KNumOffsets[0]]
+    //cell 1 using aNumMapping[KNumOffsets[1]]
+    const TInt KNumOffsets[] = 
+        {
+         12,  1,  2, 3,
+         13,  4,  5, 6,
+         14,  7,  8, 9,
+         15,  10, 0, 11
+        };
+    
+    TInt maxMappingItemCount = sizeof(KNumOffsets)/sizeof(TInt);
+    TInt mappingItemCount = aNumMapping.Length();
+    
+    //numberpad
+    TInt keyCount = iNumKeypad->KeyArray().Count();
+    for ( TInt i = 0; i < keyCount; i++ )
+        {
+        CVirtualKey* vk = iNumKeypad->KeyArray()[i];
+        
+        TInt offset = ( i < maxMappingItemCount ) ? KNumOffsets[i] : -1;
+        
+        if ( offset > -1  && offset < mappingItemCount )
+            {
+            TUint16 unicode = aNumMapping[offset];
+            TUint16 mappedCode = MapLatinNumAccordingToNumMode(unicode);
+            TBuf<1> keydata;
+            keydata.Append(mappedCode);
+            vk->SetKeyData(keydata);
+            vk->SetKeyScancode( mappedCode);
+            vk->SetDimmed( EFalse );
+            }
+        else
+            {
+            vk->SetKeyData( KNullDesC );
+            vk->SetKeyScancode( 0xFFFF );
+            vk->SetDimmed( EFalse );
+            }
+        }
+    
+    
+    //sync feedback
+    UpdateAllVirtualKeysFeedback();
+    }
+
+// ---------------------------------------------------------------------------
+// Navigate the symbol page
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::UpdateNumSymbolTable( TInt aNumSctType)
+    {	
+
+    iCurrentNumSCTType = aNumSctType;
+	// Draw the symbol table 
+    Draw();
+	
+	// Update the feedback for the virtual key
+    UpdateAllVirtualKeysFeedback();
+	
+	// Bitblt the whole symbol table to screen
+	UpdateArea(iRect);
+    }
+
+// ---------------------------------------------------------------------------
+//  update feedback state of all virtual keys.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::UpdateAllVirtualKeysFeedback()
+    {
+    //update sctpad keys
+    TInt keyCount = iNumKeypad->KeyArray().Count();
+    for ( TInt i = 0; i < keyCount; i++ )
+        {
+        CVirtualKey* vk = iNumKeypad->KeyArray()[i];
+        TBool enable = !vk->Dimmed();
+        iNumKeypad->EnableKeyFeedback( vk, enable );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//  Draw new content to the screen
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::Draw()
+    {
+	if(AbleToDraw())
+        {
+		DrawOpaqueMaskBackground( Rect() );
+
+		if( BackgroundBmp() && BackgroundBmp()->SizeInPixels() != Rect().Size() )
+			{
+			AknIconUtils::SetSize(BackgroundBmp(), Rect().Size(), EAspectRatioNotPreserved);
+			}
+        // draw background
+		DrawBackground();    
+		
+        // draw group		
+		CControlGroup::Draw();
+		
+		// bitblt the new content to screen
+		UpdateArea(iRect);
+		}
+	}
+// ---------------------------------------------------------------------------
+//  set native number mode on or off.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::SetNativeNumMode(
+        const TBool aIsNativeNumMode)
+    {
+    iIsNativeNumMode = aIsNativeNumMode;
+    }
+// ---------------------------------------------------------------------------
+//  map latin number to arabic native number.
+// ---------------------------------------------------------------------------
+//
+TInt16 CPeninputArabicFingerHwrNumSymbolTable:: MapLatinNumAccordingToNumMode(
+        TInt16 aUnicode)
+    {
+    TInt16 ret = aUnicode;
+    if(aUnicode >= 0x30 && aUnicode <= 0x39)
+        {
+        if(iIsNativeNumMode)
+            {
+            ret = aUnicode + 0x0660 - 0x30;
+            }
+        }
+    return ret;
+    }
+// End Of File