textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp
branchRCL_3
changeset 19 ac7e4d1d9209
parent 12 5e18d8c489d6
--- a/textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp	Thu Jul 15 19:01:13 2010 +0300
+++ b/textinput/peninputfingerhwrar/src/peninputfingerhwrarnumsymboltable.cpp	Thu Aug 19 10:15:25 2010 +0300
@@ -41,8 +41,9 @@
 #include "peninputfingerhwrarstoreconstants.h"
 #include "peninputlayoutvkb.h"
 #include "peninputfingerhwrarnumsymboltable.h"
+#include "peninputfingerhwarvkbutility.h"
 
-
+const TUint16 KInvalidChar = 0xFFFF;
 // ---------------------------------------------------------------------------
 // Symbian Constructor
 // ---------------------------------------------------------------------------
@@ -99,9 +100,25 @@
     {
     CapturePointer( ETrue );
     iPopupVisible = ETrue; 
-    iCurrentNumSCTType = ENumSCTLatin;
-	UiLayout()->LockArea(UiLayout()->Rect(),this);  
-    UpdateNumSymbolTable(ENumSCTLatin);
+    UiLayout()->LockArea(UiLayout()->Rect(),this);
+    // signal server to add the pop area        
+    if(UiLayout()->NotDrawToLayoutDevice())
+        {
+        struct SData
+            {
+            TRect rr;
+            TBool flag;
+            } data;
+            
+        data.rr = iNumKeypad->Rect();
+        data.flag = ETrue;
+        TPtrC ptrForAdd;
+        ptrForAdd.Set(reinterpret_cast<const TUint16*>(&data),sizeof(data)/sizeof(TUint16));
+
+        UiLayout()->SignalOwner(ESignalPopupArea,ptrForAdd);
+        }
+    
+    RefreshNumSymbolTable();;
 	}
 
 // ---------------------------------------------------------------------------
@@ -112,6 +129,22 @@
     {
     CapturePointer( EFalse );
     iPopupVisible = EFalse;
+    // signal server to remove the pop area        
+    if(UiLayout()->NotDrawToLayoutDevice())
+        {
+        struct SData
+            {
+            TRect rr;
+            TBool flag;
+            } data;
+            
+        data.rr = iNumKeypad->Rect();
+        data.flag = EFalse;
+        TPtrC ptrForRemove;
+        ptrForRemove.Set(reinterpret_cast<const TUint16*>(&data),sizeof(data)/sizeof(TUint16));
+
+        UiLayout()->SignalOwner(ESignalPopupArea,ptrForRemove);
+        }    
     UiLayout()->UnLockArea(UiLayout()->Rect(),this);
     }
 
@@ -210,15 +243,10 @@
 // SizeChanged
 // ---------------------------------------------------------------------------
 //	
-void CPeninputArabicFingerHwrNumSymbolTable::SizeChanged(
-                     const TRect aVirtualKeypadRect, const RArray<TRect> /*aBtnRects*/,
-                     const TInt /*aKeypadRow*/, const TInt /*aKeypadCol*/, TBool aIsLandscape)
+void CPeninputArabicFingerHwrNumSymbolTable::SizeChanged(const TRect& aVirtualKeypadRect)
     {
-	iIsLandscape = aIsLandscape;
-	
 	// relayout the virtual key pad
 	iNumKeypad->SetRect(aVirtualKeypadRect);
-	
 	}
 	
 // ---------------------------------------------------------------------------
@@ -247,11 +275,6 @@
     iNumKeypad->SetDrawOpaqueBackground( EFalse );    
     }
 
-void CPeninputArabicFingerHwrNumSymbolTable::OnActivate()
-    {
-    CControlGroup::OnActivate();
-	}
-
 // ---------------------------------------------------------------------------
 //  Read control's background info.
 // ---------------------------------------------------------------------------
@@ -339,53 +362,7 @@
 //	
 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 );        
+    PeninputFingerHwrArVkbUtility::LoadVkbKeyImageL(*iNumKeypad,aResId,aKeySize);
 	}
 
 // ---------------------------------------------------------------------------
@@ -394,124 +371,57 @@
 //	
 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() );
+	PeninputFingerHwrArVkbUtility::LoadVirtualKeypadKeyL(*iNumKeypad,aResId,aCellRects);
 	}
 
 // ---------------------------------------------------------------------------
-// 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 )
+void CPeninputArabicFingerHwrNumSymbolTable::UpdateTableSymbol( const TDesC& aNumMapping )
     {
-    //format of aNumMapping is "0123456789******"
+    HBufC* charTable = GenerateCharTable(aNumMapping);
+    if(charTable)
+    	{
+    	TInt charTalbeCount = charTable->Length();
+     
+	    //numberpad
+	    TInt keyCount = iNumKeypad->KeyArray().Count();
+	    for ( TInt i = 0; i < keyCount; i++ )
+	        {
+	        CVirtualKey* vk = iNumKeypad->KeyArray()[i];
+	        
+	        if(i < charTalbeCount && (*charTable)[i] != KInvalidChar)
+	            {
+	            TBuf<1> keydata;
+                TUint16 keyCode = (*charTable)[i];	            
+	            keydata.Append(keyCode);
+	            vk->SetKeyData(keydata);
+	            vk->SetKeyScancode(keyCode);
+	            vk->SetDimmed( EFalse );
+	            }
+	        else
+	            {
+	            vk->SetKeyData( KNullDesC );
+	            vk->SetKeyScancode( KInvalidChar );
+	            vk->SetDimmed( EFalse );
+	            }
+	        }
+	    
+	    delete charTable;
+	    
+	    //sync feedback
+	    UpdateAllVirtualKeysFeedback();
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// Get reordered char table for key pad to render them
+// ---------------------------------------------------------------------------
+//
+HBufC* CPeninputArabicFingerHwrNumSymbolTable::GenerateCharTable(const TDesC& aNumMapping)
+	{
+	//format of aNumMapping is "0123456789******"
     
     //char offset in aNumMapping
     //cell 0 using aNumMapping[KNumOffsets[0]]
@@ -523,49 +433,36 @@
          14,  7,  8, 9,
          15,  10, 0, 11
         };
-    
-    TInt maxMappingItemCount = sizeof(KNumOffsets)/sizeof(TInt);
+    TInt tableSize = 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 );
-            }
-        }
+    HBufC* reorderedCharTable = HBufC::New(mappingItemCount +1);
+    if(reorderedCharTable)
+    	{
+    	for(TInt i = 0; i < tableSize; i++)
+    	    {    	    
+    	    if(KNumOffsets[i] < mappingItemCount)
+    	    	{
+    	    	TUint16 unicode = aNumMapping[KNumOffsets[i]];
+                TUint16 mappedCode = MapLatinNumAccordingToNumMode(unicode);	
+                reorderedCharTable->Des().Append(mappedCode); 
+    	    	}
+    	    else
+    	    	{
+    	        reorderedCharTable->Des().Append(KInvalidChar);
+    	    	}	
+    	    }
+    	}
     
-    
-    //sync feedback
-    UpdateAllVirtualKeysFeedback();
-    }
-
+    return reorderedCharTable;	    
+	}
+	
 // ---------------------------------------------------------------------------
 // Navigate the symbol page
 // ---------------------------------------------------------------------------
 //
-void CPeninputArabicFingerHwrNumSymbolTable::UpdateNumSymbolTable( TInt aNumSctType)
-    {	
-
-    iCurrentNumSCTType = aNumSctType;
+void CPeninputArabicFingerHwrNumSymbolTable::RefreshNumSymbolTable()
+    {
 	// Draw the symbol table 
     Draw();
 	
@@ -582,7 +479,7 @@
 //
 void CPeninputArabicFingerHwrNumSymbolTable::UpdateAllVirtualKeysFeedback()
     {
-    //update sctpad keys
+    //update numpad keys
     TInt keyCount = iNumKeypad->KeyArray().Count();
     for ( TInt i = 0; i < keyCount; i++ )
         {
@@ -593,6 +490,30 @@
     }
 
 // ---------------------------------------------------------------------------
+//  update rect of all virtual keys.
+// ---------------------------------------------------------------------------
+//
+void CPeninputArabicFingerHwrNumSymbolTable::UpdateAllVirtualKeysRect(const RArray<TRect> & aCellRects)
+    {
+    //update numpad keys rect
+    TInt keyCount = iNumKeypad->KeyArray().Count();
+    TInt rectCount = aCellRects.Count();
+    if(keyCount != rectCount)
+        {
+        return;
+        }
+    for ( TInt i = 0; i < keyCount; i++ )
+        {
+        CVirtualKey* vk = iNumKeypad->KeyArray()[i];
+        TRect rect = aCellRects[i%rectCount];        
+        vk->SetRect(aCellRects[i%rectCount]);
+        TRect innerrect = rect;
+        innerrect.Shrink( TSize(10,10) );
+        vk->SetInnerRect( innerrect );
+        }    
+    }
+
+// ---------------------------------------------------------------------------
 //  Draw new content to the screen
 // ---------------------------------------------------------------------------
 //