mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainersearchfield.cpp
changeset 0 ff3acec5bc43
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainersearchfield.cpp	Thu Dec 17 08:45:05 2009 +0200
@@ -0,0 +1,688 @@
+/*
+* Copyright (c) 2008 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:  Class that implements Search Field feature.
+*
+*/
+
+
+// INCLUDE FILES
+#include <eikmenub.h>
+#include <eikdef.h>
+#include <akninfrm.h>
+#include <eikon.rsg>
+#include <eikenv.h>
+#include <txtglobl.h>
+#include <gulfont.h>
+#include <txtfrmat.h>
+#include <eikgted.h>
+#include <aknconsts.h>
+#include <akneditstateindicator.h>
+#include <aknslistboxbackgroundcontrolcontext.h>
+#include <aknlayout2def.h>
+#include <aknlayout2scalabledef.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <featmgr.h>
+#include <fepbase.h>
+#include <aknutils.h>
+#include "mpxcommoncontainersearchfieldwrapper.h"
+#include "mpxcommoncontainersearchfield.h"
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMPXCommonContainerSearchField* CMPXCommonContainerSearchField::NewL(
+    CMPXCommonContainerSearchFieldWrapper* aParent,
+    TBool aFindKeywordMode )
+    {
+    CMPXCommonContainerSearchField* self = new (ELeave) CMPXCommonContainerSearchField( aFindKeywordMode );
+    CleanupStack::PushL( self );
+
+    self->ConstructL( aParent );
+    self->MakeVisibleL( EFalse );
+    self->SetFocus( EFalse );
+
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::MakeVisibleL( TBool aVisible )
+    {
+    if ( aVisible )
+        {
+        HandleFindSizeChanged();
+        SetTextL( KNullDesC );
+        }
+
+    // if ( AknLayoutUtils::PenEnabled() )
+        // {
+        // Note, commented out, caused LSK and RSK problems.
+        // SetPointerCapture( aVisible );
+        // Note, commented out, activated Virtual KeyBoard right away.
+        // if ( aVisible )
+            // {
+            // ActivateVkbL();
+            // }
+        // }
+
+    CCoeControl::MakeVisible( aVisible );
+
+    iSearchFieldKeyHandler->Reset();
+    iSearchFieldKeyHandler->EnableL( aVisible );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::MakeVisible( TBool aVisible )
+    {
+    TRAP_IGNORE( MakeVisibleL( aVisible ) );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMPXCommonContainerSearchField::~CMPXCommonContainerSearchField()
+    {
+    delete iSearchFieldKeyHandler;
+    delete iEditor;
+    delete iInputFrame;
+	delete iPrevKeyword;
+	CCoeEnv::Static()->RemoveFepObserver(
+	    static_cast<MCoeFepObserver &>( *this ) );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CMPXCommonContainerSearchField::CMPXCommonContainerSearchField( TBool aFindKeywordMode )
+ :  iFindKeywordMode( aFindKeywordMode ),
+    iHandleFEPFind( ETrue )
+    {
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::ConstructL( CMPXCommonContainerSearchFieldWrapper* aParent )
+    {
+    CreateWindowL();
+
+    SetMopParent( aParent );
+    iParent = aParent;
+
+    iEditor = new (ELeave) CEikGlobalTextEditor;
+
+    iInputFrame = CAknInputFrame::NewL( iEditor,
+                                        EFalse,
+                                        KAvkonBitmapFile,
+                                        EMbmAvkonQgn_indi_find_glass,
+                                        EMbmAvkonQgn_indi_find_glass_mask,
+                                        CAknInputFrame::EPopupLayout );
+    iInputFrame->SetContainerWindowL( *this );
+
+    AknEditUtils::ConstructEditingL ( iEditor,
+                                      40, // TODO
+                                      1,
+                                      EAknEditorCharactersLowerCase,
+                                      EAknEditorAlignRight,
+                                      EFalse,
+                                      ETrue,
+                                      EFalse );
+    iEditor->SetContainerWindowL( *this );
+    iEditor->SetObserver( this );
+    iEditor->SetBorder( TGulBorder::ENone );
+    iEditor->SetAknEditorCase( EAknEditorLowerCase );
+    iEditor->SetAknEditorInputMode( EAknEditorTextInputMode );
+
+    // Disallow chinese input.
+    if ( FeatureManager::FeatureSupported( KFeatureIdAvkonApac ) )
+        {
+        iEditor->SetAknEditorAllowedInputModes( EAknEditorTextInputMode |
+                                                EAknEditorNumericInputMode );
+        }
+
+    // Find keyword should use EAknEditorFlagDefault since in find
+    // input we allow all types of input.
+   	iEditor->SetAknEditorFlags( ( ( iFindKeywordMode ) ?
+   	                                    EAknEditorFlagDefault :
+   	                                    EAknEditorFlagLatinInputModesOnly ) |
+   	                            EAknEditorFlagUseSCTNumericCharmap );
+    iEditor->SetAknEditorPermittedCaseModes( EAknEditorUpperCase |
+                                             EAknEditorLowerCase );
+
+    iSearchFieldKeyHandler = new (ELeave) CMPXCommonContainerSearchFieldKeyHandler( *this );
+
+    /* TODO?
+    iAvkonAppUi->AddToStackL( iSearchFieldKeyHandler,
+                              ECoeStackPriorityFep + 1,
+                              ECoeStackFlagRefusesFocus );
+    */
+
+    iEditor->SetEdwinObserver( iSearchFieldKeyHandler );
+	iEditor->SetSkinBackgroundControlContextL( NULL );
+
+	CCoeEnv::Static()->AddFepObserverL(
+	    static_cast<MCoeFepObserver &>( *this ) );
+
+	iPrevKeyword = KNullDesC().AllocL();
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::SetOrdinalPosition( TInt aPos )
+    {
+    Window().SetOrdinalPosition( aPos );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandleFindSizeChanged()
+    {
+    if ( IsVisible() )
+        {
+        TRect searchRect = iParent->GetSearchFieldRect( ETrue,
+                                                        iParent->ClientRect() );
+        AknLayoutUtils::LayoutControl( this,
+                                       searchRect,
+                                       AknLayout::popup_find_window() );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::EnableKeyEventHandlerL( TBool aEnable )
+    {
+    iSearchFieldKeyHandler->EnableL( aEnable );
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandleControlEventL( CCoeControl* /*aControl*/,
+                                             TCoeEvent aEventType )
+    {
+	if ( iFindKeywordMode )
+		{
+	    if ( iEditor->AknEditorCurrentInputMode() == EAknEditorCalculatorNumberModeKeymap
+            // When the user copies and paste's content to the find dialog, the editor
+            // is in Text Input mode, The engine should still get the find keyword request
+            || iEditor->AknEditorCurrentInputMode() == EAknEditorTextInputMode )
+	    	{
+		    if ( aEventType == MCoeControlObserver::EEventStateChanged )
+		        {
+		        HBufC* newText = GetTextLC();
+		        if ( ! newText )
+		            {
+		            newText = KNullDesC().AllocLC();
+		            }
+
+		        if ( iPrevKeyword->Compare( *newText ) != 0 )
+		        	{
+		            delete iPrevKeyword;
+		            iPrevKeyword = newText;
+		            CleanupStack::Pop( newText );
+
+					iParent->FindKeywordL( *newText );
+
+					iHandleFEPFind = EFalse;
+		        	}
+				else
+					{
+					CleanupStack::PopAndDestroy( newText );
+					}
+		        }
+	    	}
+		}
+
+    if ( aEventType == EEventRequestFocus )
+        {
+        FocusChanged( EDrawNow );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CMPXCommonContainerSearchField::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                TEventCode aType )
+    {
+    // Escape key event handling.
+    if ( aType == EEventKey && aKeyEvent.iCode == EKeyEscape )
+        {
+        // TODO: Check that closing Search Field goes ok with this case.
+
+        CCoeEnv::Static()->AppUi()->RemoveFromStack( this );
+        MakeVisible( EFalse );
+        SetFocus( EFalse );
+        return EKeyWasConsumed;
+        }
+
+	if ( aType == EEventKey )
+		{
+		/* TODO: This feature not needed?
+		// Handle up and down arow keys to search for next and previous keywords.
+		if ( aKeyEvent.iCode == EKeyUpArrow )
+			{
+			// Find previous keyword.
+			iParent->FindKeywordL( NULL, EFalse );
+			iHandleFEPFind = EFalse;
+			return EKeyWasConsumed;
+			}
+		if ( aKeyEvent.iCode == EKeyDownArrow )
+			{
+			// Find next keyword.
+			iParent->FindKeywordL( NULL, ETrue );
+			iHandleFEPFind = EFalse;
+			return EKeyWasConsumed;
+			}
+		*/
+		}
+
+	return iEditor->OfferKeyEventL( aKeyEvent, aType );
+	}
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    if ( ! AknLayoutUtils::PenEnabled() )
+        {
+        return;
+        }
+
+    // Pointer is inside the Search Field.
+    if ( Rect().Contains( aPointerEvent.iPosition ) )
+        {
+        iSearchFieldKeyHandler->EnableL( ETrue );
+        iEditor->HandlePointerEventL( aPointerEvent );
+        iSearchFieldKeyHandler->SetFirstKeyEvent( EFalse );
+        }
+    else
+        {
+        // Pointer outside of control, close control?
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TInt CMPXCommonContainerSearchField::CountComponentControls() const
+    {
+    return 2; // iEditor and iInputFrame.
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+CCoeControl* CMPXCommonContainerSearchField::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            {
+			return iInputFrame;
+            }
+        case 1:
+            {
+            return iEditor;
+            }
+        default:
+            {
+            return NULL;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::SizeChanged()
+    {
+    iInputFrame->SetRect( Rect() );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::FocusChanged( TDrawNow aDrawNow )
+    {
+    // this is a workaround
+    TRAP_IGNORE( iSearchFieldKeyHandler->EnableL( IsFocused() ) );
+    CCoeControl::FocusChanged( aDrawNow );
+    iEditor->SetFocus( IsFocused() );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TInt CMPXCommonContainerSearchField::TextLength() const
+    {
+    return iEditor->TextLength();
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+HBufC* CMPXCommonContainerSearchField::GetTextLC() const
+    {
+    HBufC *retVal = NULL;
+
+    if ( TextLength() || iFindKeywordMode )
+        {
+        retVal = HBufC::NewLC( TextLength() + 1 );
+        TPtr ptr = retVal->Des();
+        iEditor->GetText( ptr );
+        ptr.ZeroTerminate();
+        }
+
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::SetTextL( const TDesC& aTxt )
+    {
+    iEditor->SetTextL( &aTxt );
+
+    TInt curPos = TextLength();
+    iEditor->SetSelectionL( curPos, curPos );
+	iEditor->DrawNow();
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::SelectAllL()
+    {
+    iEditor->SelectAllL();
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::SetInfoTextL( const TDesC& aText )
+    {
+    iInputFrame->SetInfoTextL( aText );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::ClipboardL( CEikEdwin::TClipboardFunc aClipboardFunc )
+    {
+    iEditor->ClipboardL( aClipboardFunc );
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+CEikEdwin* CMPXCommonContainerSearchField::Editor() const
+    {
+    return iEditor;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+CMPXCommonContainerSearchFieldKeyHandler::CMPXCommonContainerSearchFieldKeyHandler( CMPXCommonContainerSearchField& aSearchField )
+ :  iEnabled( EFalse ),
+    iFirstKeyEvent( ETrue ),
+    iLeftRightEvent ( EFalse ),
+    iSearchField( aSearchField )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+TKeyResponse CMPXCommonContainerSearchFieldKeyHandler::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                          TEventCode aType )
+    {
+    TKeyResponse response( EKeyWasNotConsumed );
+    iLeftRightEvent = EFalse;
+
+    if ( iEnabled && aType == EEventKey )
+        {
+        switch( aKeyEvent.iCode )
+            {
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+                {
+                iFirstKeyEvent = EFalse;
+                break;
+                }
+
+            case EKeyLeftArrow:
+            case EKeyRightArrow:
+                {
+                iFirstKeyEvent = EFalse;
+                iLeftRightEvent = ETrue;
+
+				// Below added to compensate for a weird key event situation:
+				//   For some reason the CMPXCommonContainerSearchField::OfferKeyEventL function
+				//   is not being called for an EEventKey when you press the left/right
+				//   arrows in the menupane produced to paste previously used special
+				//   chars (this is brought up by pressing the pen button on the phone).
+				//   This only happens when the cursor is in the first or last position in
+				//   the Search Field with text in it.
+				//   Therefore, in this particular scenario, we need to process the EEventKey
+				//   here since we will not be able to in CMPXCommonContainerSearchField::OfferKeyEventL
+                // TODO if ( CBrowserAppUi::Static()->ContentView()->MenuBar()->MenuPane()->IsFocused())
+		        // TODO    {
+		        // TODO    response = CBrowserAppUi::Static()->ContentView()->MenuBar()->MenuPane()->OfferKeyEventL( aKeyEvent, aType );
+		        // TODO    }
+                break;
+                }
+
+            case EKeyBackspace:
+            case EKeyDelete:
+                {
+                if ( iFirstKeyEvent )
+                    {
+                    iFirstKeyEvent = EFalse;
+                    iCoeEnv->SimulateKeyEventL( aKeyEvent, aType );
+                    response = EKeyWasConsumed;
+                    }
+                break;
+                }
+
+            default:
+                {
+                if ( iFirstKeyEvent )
+                    {
+                    if ( TChar( aKeyEvent.iCode ).IsPrint() )
+                        {
+                        iFirstKeyEvent = EFalse;
+                        response = EKeyWasConsumed;
+                        iCoeEnv->SimulateKeyEventL( aKeyEvent, aType );
+                        }
+                    }
+                break;
+                }
+            }
+        }
+
+    return response;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchFieldKeyHandler::HandleEdwinEventL( CEikEdwin* /*aEdwin*/,
+                                                     TEdwinEvent aEventType )
+    {
+    if ( aEventType == EEventTextUpdate )
+        {
+        // if text changed in the editor we don't have to handle clear key anymore.
+        iFirstKeyEvent = EFalse;
+
+        // For some reason typing letters on the qwerty keyboard of one product
+        // does not trigger the HandleCompletionOfTransactionL() or the
+        // HandleControlEventL(). Therefore we must check the text here.
+        iSearchField.UpdateFindKeywordL();
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchFieldKeyHandler::EnableL( TBool aEnable )
+    {
+    iEnabled = aEnable;
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchFieldKeyHandler::Reset()
+    {
+    iFirstKeyEvent = ETrue;
+    }
+	
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TBool CMPXCommonContainerSearchFieldKeyHandler::IsLeftRightEvent()
+    {
+    return iLeftRightEvent;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchFieldKeyHandler::SetFirstKeyEvent( TBool aFirstKeyEvent )
+    {
+    iFirstKeyEvent = aFirstKeyEvent;
+    }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandleResourceChange( TInt aType )
+	{
+	CCoeControl::HandleResourceChange( aType );
+	}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandleStartOfTransactionL()
+	{
+	}
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::HandleCompletionOfTransactionL()
+	{
+	if ( iParent && iFindKeywordMode && this->IsVisible() && iHandleFEPFind )
+		{
+		UpdateFindKeywordL();
+		}
+
+    iHandleFEPFind = ETrue;
+	}
+
+// ----------------------------------------------------------------------------
+// Simulates pointer event to force VKB.
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::ActivateVkbL()
+    {
+    if ( iEditor && iEditor->TextView() )
+        {
+        // Make sure observer is set.
+        iCoeEnv->SyncNotifyFocusObserversOfChangeInFocus();
+
+       	// First get point at cursor location.
+        TInt pos = iEditor->CursorPos();
+       	CTextView* textView = iEditor->TextView();
+       	TPoint curPos;
+       	textView->DocPosToXyPosL( pos, curPos );
+
+       	TPointerEvent pe;
+       	pe.iPosition = curPos;
+
+       	pe.iType = TPointerEvent::EButton1Down;
+       	iEditor->HandlePointerEventL( pe );
+
+        // VKB will only activate is nothing selected
+        iEditor->SetSelectionL( pos, pos );
+
+       	pe.iType = TPointerEvent::EButton1Up;
+       	iEditor->HandlePointerEventL( pe );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+//
+// ----------------------------------------------------------------------------
+//
+void CMPXCommonContainerSearchField::UpdateFindKeywordL()
+    {
+    HBufC* newKeyword = GetTextLC();
+
+    if ( newKeyword->Compare( *iPrevKeyword ) != 0 )
+        {
+        delete iPrevKeyword;
+        iPrevKeyword = newKeyword;
+        CleanupStack::Pop( newKeyword );
+
+        iParent->FindKeywordL( *newKeyword );
+        }
+    else
+        {
+        CleanupStack::PopAndDestroy( newKeyword );
+        }
+    }