textinput/peninputcommonlayout/src/peninputcommonlayoutext.cpp
changeset 0 eb1f2e154e89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textinput/peninputcommonlayout/src/peninputcommonlayoutext.cpp	Tue Feb 02 01:02:04 2010 +0200
@@ -0,0 +1,675 @@
+/*
+* Copyright (c) 2002-2005 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:  common layout framework
+*
+*/
+
+
+// System includes
+#include <aknfeppeninputenums.h>    // Command from fep or IME to plugin
+#include <AknFepGlobalEnums.h>      // Define EPluginInputModeHwr
+#include <peninputcmd.h>            // Use global signal
+#include <peninputlayoutchoicelist.h>
+#include <peninputlayoutbutton.h>
+#include <peninputdragbutton.h>
+#include <coemain.h>
+
+// User includes
+#include "peninputuistatebase.h"
+#include "peninputdataconverter.h"
+#include "peninputcommonlayoutext.h"
+#include "peninputlayoutwindowext.h"
+#include "peninputdatamgr.h"
+#include "peninputuistatemgr.h"
+#include "peninputrangebarinfo.h"	
+
+// Constants
+const TInt KPeninputCommonLayoutBufLen = 8;
+const TInt KIntSizeToInt16 = 2;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::CPeninputCommonLayoutExt
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPeninputCommonLayoutExt::CPeninputCommonLayoutExt( MLayoutOwner* aLayoutOwner )
+    : CFepUiLayout( aLayoutOwner )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::ConstructL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::ConstructL( const TAny* aInitData )
+    {
+    BaseConstructL();
+
+    TPixelsTwipsAndRotation ptSize;
+    
+    CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation( ptSize );
+            
+    SetScreenSize(ptSize.iPixelSize);    
+    
+    // This method must be called first, because it will initialize 
+    // language from CenRep
+    CreateDataMgrL(aInitData);
+
+    TBool sizeChanging = ETrue;
+    if ( iDataMgr )
+        {
+        // Store screen mode, and get new window position
+        iDataMgr->SetData( EPeninputDataTypeScreenMode, ( TAny* ) &ptSize );
+        
+        // Store justify style
+        iDataMgr->SetData(EAkninputDataTypeSizeChanging, &sizeChanging);
+        }
+
+    iUiStateMgr = CPeninputUiStateMgr::NewL( this );
+
+    CreateLayoutWindowL();
+
+    if ( iLayoutWindow )
+        {
+        iLayoutWindow->Hide(ETrue);
+        AddControlL( iLayoutWindow );
+        
+        // Config layout self using the whole screen
+        //SetRect(TRect(TPoint(0, 0), ptSize.iPixelSize ));
+
+        // Call the function in window to read config info
+        //ChangeInputLanguage( *( (TInt*)iDataMgr->RequestData(EPeninputDataTypeInputLanguage)));
+
+        iLayoutWindow->SizeChanged( ETrue );
+//        EnableLayoutMoving( static_cast<CDragBar*>( iLayoutWindow->MoveButton() ) );
+        }
+    
+    if (iDataMgr)
+    	{
+    	sizeChanging = EFalse;
+    	iDataMgr->SetData(EAkninputDataTypeSizeChanging, &sizeChanging);
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::~CPeninputCommonLayoutExt
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPeninputCommonLayoutExt::~CPeninputCommonLayoutExt()
+    {       
+    delete iUiStateMgr;
+    delete iDataMgr;
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::UiStateMgr
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C MPeninputUiStateMgr* CPeninputCommonLayoutExt::UiStateMgr() const
+    {
+    return iUiStateMgr;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::LayoutWindow
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CPeninputLayoutWindowExt* CPeninputCommonLayoutExt::LayoutWindow() const
+    {
+    return iLayoutWindow;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::HandleCommand
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPeninputCommonLayoutExt::HandleCommand( TInt aCmd, 
+                                                    TUint8* aData )
+    {
+    // Handle command from fep or IME to this layout
+    TUint* data = ( TUint* ) aData;
+    TBuf<KPeninputCommonLayoutBufLen> buf;
+    TBuf<KIntSizeToInt16> bufStyle;
+    TInt style;
+    TInt ret = KErrNone;
+    
+    switch ( aCmd )
+        {
+        case ECmdPenInputPermittedRange:
+            CPeninputDataConverter::IntToDesc( *data, buf );
+            SendEventToWindow( EPeninputLayoutEventSetPermittedRange, NULL, 
+                               buf );        
+            break;
+        case ECmdPenInputAllowChangeCase:   
+            {
+            iDataMgr->SetData( EAkninputDataTypeAllowCaseChange, data );
+            } 
+            break;
+        case ECmdPenInputPermittedCase:
+            {
+            CPeninputDataConverter::IntToDesc( *data, buf );
+            SendEventToWindow( EPeninputLayoutEventSetPermittedCase, NULL, 
+                               buf );             
+            }
+            break;
+        case ECmdPenInputEditorNumericKeyMap:
+            {
+            iDataMgr->SetData( EPeninputDataTypeNumericKeymap, data );
+            }
+            break;
+        case ECmdPenInputCase:
+            {
+            CPeninputDataConverter::IntToDesc( *data, buf );
+            SendEventToWindow( EPeninputLayoutEventSetCase, NULL, 
+                               buf );
+            }
+            break;
+        case ECmdPenInputLanguage:
+            {
+            ChangeInputLanguage(*data);
+            }            
+            break;
+        case ECmdPenInputRange:
+            {
+            ChangeRange( TranslateRange(*data) );
+            }
+            break;
+        /*case ECmdPenInputEnableSwitchBtn:
+            {
+            if ( LayoutType() == EPluginInputModeVkb )
+                {
+                SetEnableSwitchToHwr(*data);
+                }
+            }
+            break;*/
+        case ECmdPenInputEnableSettingBtn:
+            {
+            SetEnableSettingBtn(*data);
+            }
+            break;
+        case ECmdPenInputIsSecretText:
+            {
+            iLayoutWindow->SetTextIsSecret( *aData );
+            }
+            break;
+        case ECmdPenInputIsNumberGrouping:
+            {
+            iLayoutWindow->SetNumberGrouping( *aData );
+            }
+            break;
+        case ECmdPenInputWindowOpen:
+            {
+            if ( *data == EPenInputOpenManually )
+                {
+                style = EPeninputPositionChangeBrJustify;
+                bufStyle = ( TUint16* )&style;
+                SendEventToWindow(EPeninputLayoutEventMovePosition, NULL, bufStyle );  
+                }
+            iLayoutWindow->Hide(EFalse);
+            LayoutOwner()->Hide( EFalse );
+            }
+            break;
+        case ECmdPenInputWindowClose:
+            {
+            iLayoutWindow->Hide(ETrue);            
+            LayoutOwner()->Hide( ETrue );
+
+            SendEventToWindow( EPeninputLayoutEventCloseWindow, NULL );
+            }
+            break;
+        case ECmdPenInputSetWindowPos:
+            {
+            // Only VKB need to move position automatically
+            if ( LayoutType() == EPluginInputModeVkb )
+                {
+                // Data is a TRect
+                iDataMgr->SetData( EPeninputDataTypeDataQueryDlgRect, 
+                                   (TRect*) aData );
+                                   
+                // Store justify style
+                style = EPeninputPositionChangeDataQuery;
+                bufStyle = ( TUint16* )&style;
+                SendEventToWindow(EPeninputLayoutEventMovePosition, NULL, bufStyle);
+                }
+            }
+            break;
+        case ECmdPenInputEditorCustomNumericKeyMap:
+            {
+            iDataMgr->SetData(EAknFepDataTypeUseDefinedResource, aData);
+            }
+            break;   
+        case ECmdPenInputSetTextAlignment:
+        	{
+		    TRAP_IGNORE(iLayoutWindow->SetTextAlignmentL( *data ));
+        	}
+        	break; 
+        default:
+            {
+            ret = CFepUiLayout::HandleCommand( aCmd, aData );
+            }
+            break;
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SizeChanged
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPeninputCommonLayoutExt::SizeChanged( const TAny* /*aData*/ )
+    {
+    TBool sizeChanging = ETrue;
+    iDataMgr->SetData(EAkninputDataTypeSizeChanging, &sizeChanging);
+
+    // Handle size changed event
+    TPixelsTwipsAndRotation ptSize;  
+       
+    CCoeEnv::Static()->ScreenDevice()->GetDefaultScreenSizeAndRotation( ptSize );
+    //SetScreenSize(ptSize.iPixelSize);
+
+    // Store screen mode, and get new window position
+    iDataMgr->SetData( EPeninputDataTypeScreenMode, ( TAny* )&ptSize );
+
+     // The following need to implement
+    iLayoutWindow->SizeChanged( ETrue );
+
+    sizeChanging = EFalse;
+    iDataMgr->SetData(EAkninputDataTypeSizeChanging, &sizeChanging);
+
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::HandleControlEvent
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::HandleControlEvent(
+    TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+    {
+    // Handle event from control
+    TInt* data = ( TInt* ) aEventData.Ptr();
+
+    // Buffer for data conversion
+    TBuf<KPeninputCommonLayoutBufLen> buf;
+
+    switch ( aEventType )
+        {
+        case EPeninputLayoutEventClose:
+            {
+            SignalOwner( ESignalLayoutClosed );
+            }
+            break;
+        case EPeninputLayoutEventOption:
+            {
+            SignalOwner( ESignalLaunchOptionMenu );
+            }
+            break;
+        case EPeninputLayoutEventSwitchLanguage:
+            {
+            SignalOwner( ESignalLaunchLanguageMenu );
+            }
+            break;
+        // When drag end, store the position data
+        case EEventDraggingEnd:
+            {
+            TInt x = 0;
+            TInt y = 0;
+            x = 0x0000FFFF & ( Position().iX + Rect().Width() );
+            y = 0xFFFF0000 & ( ( Position().iY + Rect().Height() ) << 16 );
+            TInt position = x | y;
+            if ( position )
+                {
+                iDataMgr->SetData( EPeninputDataTypeWindowPosition, &position );
+                }
+            }
+            break;
+        case EPeninputLayoutEventToVkb:
+            {
+            TBool switchByMode = ETrue;
+            TInt mode = EPluginInputModeVkb;
+            CPeninputDataConverter::CombinationToDesc( switchByMode, 
+                                                             mode, buf );
+            SignalOwner( ESignalLayoutUIChanged, buf );
+            }
+            break;
+        default:
+            {
+            if ( iUiStateMgr->CurrentUiState() )
+                {
+                if ( !iUiStateMgr->CurrentUiState()->HandleControlEvent
+                    ( aEventType, aEventData ) )
+                    {
+                    SendEventToWindow( aEventType, aCtrl, aEventData );
+                    }                    
+                }
+            }
+            break;       
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::OnAppEditorTextComing
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CPeninputCommonLayoutExt::OnAppEditorTextComing(
+    const TFepInputContextFieldData& aData )
+    {
+    // Handle edit text coming
+    if ( iLayoutWindow )
+        {
+        TRAPD( err, iLayoutWindow->SetEditorTextL( aData ) );
+        return err;
+        }
+    
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::HandleRawKeyEventL
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CPeninputCommonLayoutExt::HandleRawKeyEventL(
+    const TRawEvent& aKeyEvent )
+    { 
+    return iUiStateMgr->CurrentUiState()->HandleKeyEventL( aKeyEvent );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SendEventToWindow
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::SendEventToWindow( 
+    TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+    {
+    iLayoutWindow->HandleControlEvent( aEventType, aCtrl, aEventData );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SendEventToLayout
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::SendEventToLayout( 
+    TInt aEventType, CFepUiBaseCtrl* aCtrl, const TDesC& aEventData )
+    {
+    HandleControlEvent( aEventType, aCtrl, aEventData );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::Sendkey
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::Sendkey( TInt aEventType, 
+                                              const TDesC& aEventData )
+    {
+    SignalOwner( aEventType, aEventData ); 
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::IsShiftPermitted
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//           
+EXPORT_C TBool CPeninputCommonLayoutExt::IsShiftPermitted()
+    {
+    return iDataMgr->IsShiftPermitted();
+    }
+    
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::IsCapsLockPermitted
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//  
+EXPORT_C TBool CPeninputCommonLayoutExt::IsCapsLockPermitted()
+    {
+    return iDataMgr->IsCapsLockPermitted();
+    }
+    
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::RequestData
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TAny* CPeninputCommonLayoutExt::RequestData( 
+    TPeninputDataType aDataType )
+    {
+    return iDataMgr->RequestData( aDataType );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SetData
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::SetData( TPeninputDataType aDataType, 
+                                              TAny* aData )
+    {
+    iDataMgr->SetData( aDataType, aData );
+    }
+                
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SetData
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CPeninputCommonLayoutExt::IsValidDestination( const TRect& aRect,
+                                                          CDragBar* aDragBar,
+                                                          TBool& aVInfo,
+                                                          TBool& aHInfo,
+                                                          TBool aFlag )
+    {
+    // Validate move button destination 
+    if ( !aDragBar )
+        {
+        return EFalse;
+        }
+        
+    TRect rect = aRect;
+    
+    if ( aFlag )
+        {
+        // Layout is moving
+        aHInfo = aVInfo = EFalse;
+        TRect dragbarRect( aRect.iTl, aDragBar->Rect().Size() );
+        
+        if ( dragbarRect.iTl.iX >= 0 
+             && dragbarRect.iBr.iX < ScreenSize().iWidth )
+            {
+            aHInfo = ETrue;
+            }
+            
+        if ( dragbarRect.iTl.iY >= 0 
+             && dragbarRect.iBr.iY < ScreenSize().iHeight )
+            {
+            aVInfo = ETrue;
+            }
+        
+        return ( aHInfo && aVInfo );
+        }
+    else
+        {
+        if ( aDragBar )
+            {
+            rect.SetSize( aDragBar->Rect().Size() );
+            }
+            
+        TBool tlInvalid = !Rect().Contains( rect.iTl );
+        TBool brInvalid = !Rect().Contains( rect.iBr );
+
+        if ( tlInvalid && !brInvalid )
+            {
+            if ( rect.iTl.iX >= Rect().iTl.iX 
+                 && rect.iTl.iX <= Rect().iBr.iX )
+                {
+                aHInfo = ETrue;
+                }
+            else if ( rect.iTl.iY >= Rect().iTl.iY 
+                      && rect.iTl.iY <= Rect().iBr.iY )
+                {
+                aVInfo = ETrue;
+                }
+            }
+        else if ( !tlInvalid && brInvalid )
+            {
+            if ( rect.iBr.iX >= Rect().iTl.iX 
+                 && rect.iBr.iX <= Rect().iBr.iX )
+                {
+                aHInfo = ETrue;
+                }
+            else if ( rect.iBr.iY >= Rect().iTl.iY 
+                      && rect.iBr.iY <= Rect().iBr.iY )
+                {
+                aVInfo = ETrue;
+                }
+            }
+
+        return !( tlInvalid || brInvalid );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::TranslateRange
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+TInt CPeninputCommonLayoutExt::TranslateRange(TInt aRange)
+    {
+    TInt newRange = aRange;
+    	     
+    if ( aRange == ERangeNative)
+        {
+        if ( iLayoutWindow
+             && iLayoutWindow->ConfigInfo()
+             && iLayoutWindow->ConfigInfo()->RangeBarInfo()->FindRange( ERangeNative ) )
+            {
+            newRange = ERangeNative;    
+            }
+        else
+            {
+            newRange = ERangeEnglish;    
+            }
+        }
+    else if ( aRange == ERangeEnglish)
+        {
+        if ( iLayoutWindow
+             && iLayoutWindow->ConfigInfo()
+             && iLayoutWindow->ConfigInfo()->RangeBarInfo()->FindRange( ERangeEnglish ) )
+            {
+            newRange = ERangeEnglish;    
+            }
+        else
+            {
+            newRange = ERangeNative;    
+            }
+        }
+                
+    return newRange;    
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::Init
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TRect CPeninputCommonLayoutExt::Init()
+    {
+    TRect r = CFepUiLayout::Init();
+    //wxy -- No need to set position here
+    //LayoutOwner()->SetPosition( Rect().iTl );
+    //r = TRect( Position(), r.Size() );
+
+    return r;
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SaveKey
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CPeninputCommonLayoutExt::SaveKey( TInt aKey, TInt aValue )
+    {
+    iDataMgr->SaveKey( aKey, aValue );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::ChangeInputLanguage
+// (other items were commented in a header)
+// ---------------------------------------------------------------------------
+//
+void CPeninputCommonLayoutExt::ChangeInputLanguage( TInt aLangID )
+    {
+    // Call ChangeInputLanguage function in iLayoutWindow
+    TRAP_IGNORE( iLayoutWindow->ChangeInputLanguageL( aLangID ) );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::ChangeLanguage
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputCommonLayoutExt::ChangeRange( TInt aRange )
+    {
+    iLayoutWindow->ChangeRange( aRange, 0, EFalse );
+    }
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SetEnableSwitchToHwr
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputCommonLayoutExt::SetEnableSwitchToHwr( TBool aEnable )
+    {
+    iLayoutWindow->SetEnableSwitchToHwr( aEnable );
+    }   
+
+// ---------------------------------------------------------------------------
+// CPeninputCommonLayoutExt::SetEnableSettingBtn
+// (other items were commented in a header).
+// ---------------------------------------------------------------------------
+//
+void CPeninputCommonLayoutExt::SetEnableSettingBtn( TBool aEnable )
+    {
+    iLayoutWindow->SetEnableSettingBtn( aEnable );
+    }  
+
+EXPORT_C TInt CPeninputCommonLayoutExt::PenInputType()
+    {
+    return LayoutType();
+    }
+
+EXPORT_C void  CPeninputCommonLayoutExt::SetPositionFromOutside(const TPoint& aNewPos)
+    {
+    LayoutOwner()->SetPosition(aNewPos);
+    TInt x = 0x0000FFFF & aNewPos.iX;
+    TInt y = 0xFFFF0000 & ( aNewPos.iY << 16 );
+    TInt position = x | y;
+    
+    SetData( EPeninputDataTypeWindowPosition, (TAny*)&position );
+    }
+