browserui/browser/FavouritesSrc/BrowserAdaptiveListPopup.cpp
changeset 0 84ad3b177aa3
child 10 57d5b8e231c4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/browserui/browser/FavouritesSrc/BrowserAdaptiveListPopup.cpp	Mon Mar 30 12:49:49 2009 +0300
@@ -0,0 +1,1187 @@
+/*
+* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 CBrowserPopupList and CBrowserAdaptiveListPopup
+*
+*
+*/
+
+
+
+// INCLUDE FILES
+#include  <e32std.h>
+#include <AknPopup.h>
+#include <AknListQueryDialog.h>
+#include <AknIconArray.h>
+#include "RecentUrlStore.h"
+#include <AknsUtils.h>
+#include <AknsListBoxBackgroundControlContext.h>
+#include <AppApacLayout.cdl.h>
+#include <AppLayout.cdl.h>
+#include <AknLayout.cdl.h>
+#include <SkinLayout.cdl.h>
+#include <AknLayout2ScalableDef.h>
+#include <AknLayoutScalable_Avkon.cdl.h>
+#include <AknLayoutScalable_Apps.cdl.h>
+#include <LayoutMetaData.cdl.h>
+#include <AknEnv.h>
+#include <aknsdrawutils.h>
+#include <browser.mbg>
+#include "BrowserContentView.h"
+#include "BrowserAdaptiveListPopup.h"
+#include "BrowserAppUi.h"
+#include "CommonConstants.h"
+#include "BrowserAppViewBase.h"
+#include <data_caging_path_literals.hrh>
+
+#include "eikon.hrh"
+
+
+// CONSTANTS
+const TInt KMaxIcons = 2;
+const TInt KListLengthToShow = 64;//the length of the string in the list
+_LIT( KItemTab, "1\t");//prefix for items
+_LIT( KDirTab, "0\t");//prefix for directories
+const TInt KArrayGranularity = 10;
+_LIT( KProtocolIdentifier,"://" );
+const TUint KSlash('/');
+const TUint KPeriod('.');
+
+static void TextPos(TPoint *aResultArray, const TAknTextLineLayout
+&aLayout, TSize aItemSize)
+    {
+    TRect itemRect(TPoint(0,0), aItemSize);
+    TAknLayoutText textLayout;
+    textLayout.LayoutText(itemRect, aLayout);
+    aResultArray[0] = textLayout.TextRect().iTl;
+    aResultArray[1] = textLayout.TextRect().iTl +
+textLayout.TextRect().Size();
+    }
+
+static void GfxPos(TPoint *aResultArray, const TAknWindowLineLayout
+&aLayout, TSize aItemSize)
+    {
+    TRect itemRect(TPoint(0,0), aItemSize);
+    TAknLayoutRect layout;
+    layout.LayoutRect(itemRect, aLayout);
+    aResultArray[0] = layout.Rect().iTl;
+    aResultArray[1] = layout.Rect().iTl + layout.Rect().Size();
+    }
+
+TSize ListBoxItemSize(CEikListBox &aListBox, CFormattedCellListBoxItemDrawer *aItemDrawer)
+    {
+    TSize size = TSize( aItemDrawer->LafItemSize().iWidth, aListBox.View()->ItemSize().iHeight );
+    return size;
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CBrowserPopupList::CBrowserPopupList()
+//
+// ---------------------------------------------------------
+//
+CBrowserPopupList::CBrowserPopupList(TParentType aParentType):CAknSingleGraphicPopupMenuStyleListBox()
+    {
+    iParentType = aParentType;
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::~CBrowserPopupList()
+//
+// ---------------------------------------------------------
+//
+CBrowserPopupList::~CBrowserPopupList()
+    {
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::ConstructL
+//
+// ---------------------------------------------------------
+//
+void CBrowserPopupList::ConstructL(const CCoeControl* aParent, TInt aFlags)
+    {
+    CAknSingleGraphicPopupMenuStyleListBox::ConstructL( aParent, aFlags);
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::SetHighLight
+// Sets the highlight of the list
+// ---------------------------------------------------------
+//
+void CBrowserPopupList::SetHighLight(TBool aHighLight)
+    {
+    iListBoxFlags = ( aHighLight ?  iListBoxFlags &~ CEikListBox::EDisableHighlight : iListBoxFlags | CEikListBox::EDisableHighlight );
+    if ( aHighLight )
+        {
+        iItemDrawer->ClearFlags( CListItemDrawer::EDisableHighlight );
+        }
+    else
+        {
+        iItemDrawer->SetFlags( CListItemDrawer::EDisableHighlight );
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::HighLightEnabled()
+// Enables the highlight in the list
+// ---------------------------------------------------------
+//
+TBool CBrowserPopupList::HighLightEnabled()
+    {
+    return !( iItemDrawer->Flags() & CListItemDrawer::EDisableHighlight );
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::SizeChanged()
+// sets the inner layout
+// ---------------------------------------------------------
+//
+void CBrowserPopupList::SizeChanged()
+    {
+    CAknSingleGraphicPopupMenuStyleListBox::SizeChanged();
+    TAknWindowLineLayout windowLineLayout;
+    TAknWindowLineLayout windowLineLayoutTmp;
+    TAknWindowLineLayout windowLineLayoutTmp2;
+    TAknLayoutRect layoutRect;
+    TPoint area[2] ;
+    TRgb color;
+    CEikFormattedCellListBox &aListBox = *this;
+    CFormattedCellListBoxItemDrawer *itemDrawer = aListBox.ItemDrawer();
+    AknListBoxLayouts::SetupStandardListBox(aListBox);
+
+    AknListBoxLayouts::SetupListboxPos( aListBox, AppLayout::list_single_graphic_popup_wml_pane( 0 ));
+
+    GfxPos(area,
+    AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_g1(),
+    ListBoxItemSize(*this, ItemDrawer()) );
+
+    AknListBoxLayouts::SetupFormGfxCell(aListBox,
+                                        itemDrawer,
+                                        0,
+                                        AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_g2(),
+                                        area[0],
+                                        area[1]);
+
+    //sets the rectangle of the text
+    TextPos(area,
+    AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_t1( ),
+    ListBoxItemSize(*this, ItemDrawer()) );
+    AknListBoxLayouts::SetupFormAntiFlickerTextCell(aListBox,
+                                                    itemDrawer,
+                                                    1,
+                                                    AknLayoutScalable_Apps::list_single_graphic_popup_wml_pane_t1( ),
+                                                    area[0],
+                                                    area[1]);
+    }
+
+// ---------------------------------------------------------
+// CBrowserPopupList::Draw()
+// ---------------------------------------------------------
+//
+void CBrowserPopupList::Draw(const TRect& /*aRect*/) const
+    {
+    TRect windowRect = this->Rect();
+    CEikFormattedCellListBox::Draw( windowRect );
+    return;
+    }
+
+
+// ================= CBrowserAdaptiveListPopup =======================
+
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::CBrowserAdaptiveListPopup()
+// ---------------------------------------------------------
+//
+CBrowserAdaptiveListPopup::CBrowserAdaptiveListPopup( CEikEdwin* aGotoPaneEdit, CCoeControl* aParent, TParentType aParentType):
+    iEditor( aGotoPaneEdit ), iParent( aParent ), iParentType( aParentType )
+    {
+    iTouchSupported = AknLayoutUtils::PenEnabled();
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::ConstructL(const TRect& aRect)
+// EPOC two-phased constructor
+// ---------------------------------------------------------
+void CBrowserAdaptiveListPopup::ConstructL( )
+    {
+    CreateWindowL();
+//-------- list ------
+    iList = new(ELeave) CBrowserPopupList( iParentType );
+    iList->ConstructL( this , CEikListBox::ELeftDownInViewRect );
+    iList->SetContainerWindowL( *this );
+    if (iTouchSupported)
+        {
+        iList->SetListBoxObserver( this );
+        }
+    iList->CreateScrollBarFrameL( ETrue );
+    iList->SetMopParent(iParent);
+    iList->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                CEikScrollBarFrame::EOff,
+                                CEikScrollBarFrame::EAuto);
+    iList->ScrollBarFrame()->SetTypeOfVScrollBar( CEikScrollBarFrame::EDoubleSpan );
+    iList->UpdateScrollBarsL();
+    iList->SetBorder(TGulBorder::ESingleBlack);
+    iList->ItemDrawer()->FormattedCellData()->EnableMarqueeL( ETrue );
+//---------- items storing arrays ---------
+    iItems = new(ELeave) CDesCArrayFlat(KArrayGranularity);
+    iItemNames = new(ELeave) CDesCArrayFlat(KArrayGranularity);
+    iItemNamesToShow = new(ELeave) CDesCArrayFlat(KArrayGranularity);
+//---------- model ----------
+    CTextListBoxModel* model = iList->Model();
+    model->SetItemTextArray( iItemNamesToShow );
+    model->SetOwnershipType( ELbmDoesNotOwnItemArray );
+//---------- icons -----------
+    SetIconsL();
+//--------- other --------
+    iFirstGotoContent = KNullDesC().AllocL();
+    iPrevGotoContent = KNullDesC().AllocL();
+    iPoppedUp = EFalse;
+    iDirectoryMode = ETrue;
+    iOpenCBA=EFalse;
+    iItemDrawer = iList->ItemDrawer();
+    iPrevItem = -2;
+    iUrlCompletionMode = EFalse;
+    iRecentUrlStore = CBrowserAppUi::Static()->RecentUrlStore();
+    if (!iRecentUrlStore)
+        {
+        User::Leave(KErrCouldNotConnect);
+        }
+
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::~CBrowserAdaptiveListPopup()
+// Destructor
+// ---------------------------------------------------------
+CBrowserAdaptiveListPopup::~CBrowserAdaptiveListPopup()
+    {
+    delete iList;
+    delete iItems;
+    delete iItemNames;
+    delete iItemNamesToShow;
+    delete iPrevGotoContent;
+    delete iFirstGotoContent;
+}
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::SetOrdinalPosition
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::SetOrdinalPosition( TInt aPos )
+    {
+    Window().SetOrdinalPosition( aPos );
+    }
+
+void CBrowserAdaptiveListPopup::HandlePointerEventL(const TPointerEvent& aPointerEvent)
+    {
+    if (iList && iTouchSupported)
+        {
+        TInt idx = iList->CurrentItemIndex();
+
+        //the first time
+        if ( !iList->HighLightEnabled() )
+            {
+            iList->SetHighLight( ETrue );
+
+            //save the original content
+            if ( iFirstGotoContent != NULL )
+                {
+                delete iFirstGotoContent;
+                iFirstGotoContent = NULL;
+                }
+            iFirstGotoContent = iEditor->GetTextInHBufL();
+            if ( iFirstGotoContent == NULL )
+                {
+                iFirstGotoContent = KNullDesC().AllocL();
+                }
+            }
+
+        //using ComponentControl(0) instead of iList because need access to a
+        //protected function
+        ComponentControl(0)->HandlePointerEventL( aPointerEvent );
+        TInt idx2 = iList->CurrentItemIndex();
+        if ((idx2 != idx) || (idx == 0)) // 0 is pre-selected
+            {
+            idx2 = iItems->Count() - idx2 - 1;
+            TPtrC16 item;
+            TPtrC rightSide;
+            item.Set( (*iItems)[ idx2 ] );
+            //cut the slash from the end if needed
+            //permanent sollution until AHLE does not
+            //solve this problem related to ID: TMCN-5TTRXV error
+            if ( item[item.Length() - 1] != KSlash )
+                {
+                rightSide.Set( item.Left( item.Length() ) );
+                }
+            else
+                {
+                rightSide.Set( item.Left( item.Length() - 1 ) );
+                }
+
+            //if true then append the suffix(rightSide), to the
+            //user-typed data
+            //else just use the recent URLs text(rightSide) only
+            if ( iUrlCompletionMode )
+                {
+                HBufC* currentCompletion = HBufC::NewLC(
+                    iFirstGotoContent->Des().Length() + rightSide.Length() + 1 );
+                TPtr currentCompletionPtr = currentCompletion->Des();
+
+                currentCompletionPtr.Copy( iFirstGotoContent->Des() );
+                currentCompletionPtr.Append( rightSide );
+                currentCompletionPtr.ZeroTerminate();
+                iEditor->SetTextL( currentCompletion );
+                iEditor->SetCursorPosL( currentCompletionPtr.Length(), EFalse );
+                CleanupStack::PopAndDestroy( currentCompletion );
+                }
+            else
+                {
+                iEditor->SetTextL( &rightSide );
+                iEditor->SetCursorPosL( rightSide.Length(), EFalse );
+                }
+            iEditor->HandleTextChangedL();
+
+            delete iPrevGotoContent;
+            iPrevGotoContent = NULL;
+            iPrevGotoContent = item.AllocL();
+            iEditor->DrawNow();
+            //change the CBA depending on whether the highlight is
+            //on url or domain
+            CBrowserAppUi::Static()->UpdateCbaL();
+            }
+        }
+    }
+
+void CBrowserAdaptiveListPopup::HandleListBoxEventL(CEikListBox* aListBox,TListBoxEvent aEventType)
+    {
+    if (iList && aListBox == iList && iTouchSupported)
+        {
+        switch (aEventType)
+            {
+            case MEikListBoxObserver::EEventItemDoubleClicked:
+                {
+                TKeyEvent keyEvent;
+                keyEvent.iModifiers = 0;
+                keyEvent.iRepeats = 0;
+                keyEvent.iCode = EKeyDevice3;
+                keyEvent.iScanCode = EStdKeyDevice3;
+                if ( iParentType == EBookmarksGotoPane )
+                    {
+                    CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKeyDown );
+                    }
+                CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKey );
+                if ( iParentType == EBookmarksGotoPane )
+                    {
+                    CCoeEnv::Static()->SimulateKeyEventL( keyEvent, EEventKeyUp );
+                    }
+                }
+                break;
+            default:
+                break;
+            }
+        }
+    }
+
+//------------------------------------------------------------------
+// CBrowserAdaptiveListPopup::ShowSingleItemPopupListWithGraphicsL(TBool aShowTitle)
+// shows "List pane for single item with graphic"
+//------------------------------------------------------------------
+void CBrowserAdaptiveListPopup::ShowPopupListL(TBool aRelayout)
+    {
+    TAknWindowLineLayout windowLineLayout;
+    TAknWindowLineLayout windowLineLayoutTmp;
+    TAknWindowLineLayout windowLineLayoutMain;
+    TAknWindowLineLayout windowLineLayoutMainTmp;
+    TAknWindowLineLayout windowLineLayoutLW;
+    TAknWindowLineLayout windowLineLayoutLWTmp;
+    TAknWindowLineLayout windowLineLayoutSLW;
+    TAknWindowLineLayout windowLineLayoutSLWTmp;
+    TAknLayoutRect layoutRect;
+    TAknLayoutRect layoutMainRect;
+    TAknLayoutRect layoutLWRect;
+    TAknLayoutRect layoutSLWRect;
+
+    //turn of the highlight
+    iList->SetHighLight( EFalse );
+    //clear arrays
+    iItems->Reset();
+    iItemNames->Reset();
+    iItemNamesToShow->Reset();
+
+    TInt offset;
+    HBufC* newText;
+    //get create and get the string from the edit field
+    if ( iEditor->TextLength() > 0 )
+        {
+        newText = iEditor->GetTextInHBufL();
+        CleanupStack::PushL( newText );
+        //cut the protokolidentifier from the string
+        offset = newText->Find( KProtocolIdentifier );
+        if ( offset == KErrNotFound )
+            {
+            offset = newText->Length();
+            }
+        else
+            {
+            offset = newText->Length() - offset - 3;
+            }
+        }
+    else
+        {
+             offset = 0;
+             newText = KNullDesC().AllocLC();
+        }
+    TPtrC trimmedContent( newText->Right( offset ) );
+    TBuf<KListLengthToShow> buf;
+
+    //find out if the user typed a ".", if so, bring up the url completion list
+    TInt periodPos = trimmedContent.LocateReverse( TChar(KPeriod) );
+    if ((periodPos != KErrNotFound) && ((periodPos + 1) == trimmedContent.Length()))
+        {
+        //add the url completion entries to the popup list
+        iUrlCompletionMode = ETrue;
+        CreateURLCompletionListL();
+        }
+    else
+        {
+        iUrlCompletionMode = EFalse;
+        //only include recent URLs if not including the url completion items
+        iRecentUrlStore->GetData( *iItems, *iItemNames, trimmedContent );
+        }
+    iDirectoryMode = EFalse;
+    CleanupStack::PopAndDestroy();//newText
+    TInt k;
+    k = iItems->Count();
+    iItemNo = k;
+    TInt length = KListLengthToShow - 2;
+    if ( k > 0 )
+        {
+        TInt j;
+        TPtrC textToShow;
+        TPtrC itemJ;
+        //changeing the order
+        for (j=k-1; j>-1; j--)
+            {
+            itemJ.Set( (*iItems)[j] );
+            textToShow.Set( itemJ.Left( length ) );
+            if ( iDirectoryMode )
+                {
+            //directories and items
+                if ( itemJ[ itemJ.Length() - 1 ] == KSlash )
+                    {
+                //item
+                    buf.Format( _L( "%S%S" ), &KItemTab, &textToShow );
+                    }
+                else
+                    {
+                    //directory
+                    buf.Format( _L( "%S%S" ), &KDirTab, &textToShow );
+                    }
+                }
+            else
+                {
+            //items only
+                buf.Format( _L( "%S%S" ), &KItemTab, &textToShow );
+                }
+            iItemNamesToShow->AppendL( buf );
+            }
+        //set how many item will be shown
+        TInt itemstoshow;
+
+        if ( k >  iMaxRecentUrlsToShow)
+            {
+            itemstoshow = iMaxRecentUrlsToShow;
+            }
+        else
+            {
+            itemstoshow = k;
+            }
+
+        //set the main rect of the window
+        // fixing bug RFON-7E2PPV, don't use ApplicationRect()
+        TRect  rect;
+        AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect);
+        windowLineLayoutMain = AknLayout::main_pane( rect, 0, 2, 1 );
+        windowLineLayoutMainTmp = windowLineLayoutMain;
+        layoutMainRect.LayoutRect( rect, windowLineLayoutMainTmp );
+
+        if ( iParentType == EBookmarksGotoPane )
+        {
+            windowLineLayoutLW = AppLayout::popup_wml_address_window( 1, itemstoshow );
+        }
+        else
+        {
+            windowLineLayoutLW = AppLayout::popup_wml_address_window( 1, itemstoshow );
+        }
+        windowLineLayoutLWTmp = windowLineLayoutLW;
+        layoutLWRect.LayoutRect( layoutMainRect.Rect(), windowLineLayoutLWTmp );
+        windowLineLayoutSLW = AknLayoutScalable_Apps::listscroll_popup_wml_pane();
+        windowLineLayoutSLWTmp = windowLineLayoutSLW;
+        layoutSLWRect.LayoutRect( layoutLWRect.Rect(), windowLineLayoutSLWTmp );
+        windowLineLayout = AppLayout::list_wml_pane( itemstoshow - 1 );
+        windowLineLayoutTmp = windowLineLayout;
+        layoutRect.LayoutRect( layoutLWRect.Rect(), windowLineLayoutTmp );
+
+        TRect rectTemp(layoutSLWRect.Rect());
+        // force listbox on top of goto pane
+        rectTemp.iBr.iY = iParent->PositionRelativeToScreen().iY;
+        rectTemp.iTl.iX = iParent->PositionRelativeToScreen().iX;
+        // shrink list box to size of list
+        rectTemp.iTl.iY =  rectTemp.iBr.iY - (AppLayout::list_single_graphic_popup_wml_pane( 0 ).iH * itemstoshow);
+        // set bottom right x axis to full width
+        rectTemp.iBr.iX = rect.iBr.iX;
+        
+        // we only want to call SetRect() when we have a relayout, otherwise just
+        // scroll the list to the correct position. Doing this will reduce the amount
+        // of flicker seen while typing into the gotopane
+        if ((rectTemp.Size() != Rect().Size()) || aRelayout)
+            {
+            //set the window rect
+            SetRect( rectTemp );
+            }
+        rectTemp = TRect( 0, 0, Rect().Width(), Rect().Height() );
+        if ( rectTemp!=iList->Rect() )
+            {
+            //set the rect of the list
+            iList->SetRect( rectTemp );
+            }
+        else
+            {
+            // this scrolls list to the correct position, probably still does too much work
+            AknListBoxLayouts::SetupListboxPos( *iList, AppLayout::list_single_graphic_popup_wml_pane( 0 ));
+            }
+        //the last item is visible
+        iList->ScrollToMakeItemVisible( iList->Model()->NumberOfItems()-1 );
+        MakeVisible( ETrue );
+        iPoppedUp = ETrue;
+        DrawNow();
+        iList->Draw(rectTemp);
+        }
+    else
+        {
+        MakeVisible( EFalse );
+        iPoppedUp = EFalse;
+        CBrowserAppUi::Static()->UpdateCbaL();
+        }
+    if (!IsActivated())
+        {
+        ActivateL();
+        }
+    iPrevItem = -2;
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::CreateURLCompletionListL
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::CreateURLCompletionListL()
+    {
+    _LIT(KSeparator, ",");
+
+    if (iUrlSuffixBuf)
+        {
+        TPtrC urlSuffix(iUrlSuffixBuf->Des());
+        TInt index(urlSuffix.FindF(KSeparator));
+        TInt offset = 0;
+
+        while (index != KErrNotFound)
+            {
+            // Omit empty string
+            if (index > 0)
+                {
+                iItems->AppendL( urlSuffix.Mid(offset,index) );
+                }
+
+            offset += (index + 1);
+            TPtrC remainder(urlSuffix.Mid(offset));
+            index = remainder.FindF(KSeparator);
+            }
+
+        // Cover the cases where we only have one suffix in the list and/or
+        // the last suffix in the list does not have a comma
+        if (offset < urlSuffix.Length())
+            {
+            TPtrC remainderB(urlSuffix.Mid(offset, urlSuffix.Length() - offset));
+            iItems->AppendL( remainderB );
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::HandleControlEventL
+// if the content of the edit box changes
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::HandleControlEventL(CCoeControl* aControl,enum MCoeControlObserver::TCoeEvent aEventType)
+    {
+    CEikEdwin* edwin = ( CEikEdwin* )aControl;
+    // the content of the edit box changes
+    if ( MCoeControlObserver::EEventStateChanged == aEventType )
+        {
+        HBufC* newText = edwin->GetTextInHBufL();
+        if (!newText)
+            {
+            newText = KNullDesC().AllocL();
+            }
+        CleanupStack::PushL( newText );
+        //check whether the last content is different to the one in the editbox
+        if ( !iPrevGotoContent || iPrevGotoContent->Compare( *newText ) )
+            {
+            ShowPopupListL();
+            delete iPrevGotoContent;
+            iPrevGotoContent = NULL;
+            iPrevGotoContent = newText;
+            CleanupStack::Pop( newText );//ownership is taken
+            }
+        else
+            {
+            if ( !iPrevGotoContent )
+                {
+                CleanupStack::PopAndDestroy( newText );
+                }
+            else
+                {
+                ShowPopupListL();
+                delete iPrevGotoContent;
+                iPrevGotoContent = NULL;
+                iPrevGotoContent = newText;
+                CleanupStack::Pop( newText );//ownership is taken
+                }
+            }
+        //change the CBA
+        if ( iOpenCBA )
+            {
+            iOpenCBA = EFalse;
+            CBrowserAppUi::Static()->UpdateCbaL();
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::CountComponentControls
+//
+// ---------------------------------------------------------
+//
+TInt CBrowserAdaptiveListPopup::CountComponentControls() const
+    {
+    if ( iList == NULL )
+        {
+        return 0;
+        }
+    return 1;
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::ComponentControl
+//
+// ---------------------------------------------------------
+//
+CCoeControl* CBrowserAdaptiveListPopup::ComponentControl(TInt aIndex) const
+    {
+    if (aIndex==0)
+        {
+        return iList;
+        }
+    else
+        {
+        return NULL;
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::OfferKeyEventL
+// Handles key events
+// ---------------------------------------------------------
+//
+TKeyResponse CBrowserAdaptiveListPopup::OfferKeyEventL
+( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    TKeyResponse resp = EKeyWasNotConsumed;
+    if (( iPoppedUp &&
+    !CBrowserAppUi::Static()->ContentView()->MenuBar()->MenuPane()->IsVisible() &&
+    (CBrowserAppUi::Static()->LastActiveViewId() == KUidBrowserContentViewId) ) || (( iPoppedUp ) &&
+    (CBrowserAppUi::Static()->LastActiveViewId() != KUidBrowserContentViewId)))
+        {
+        TInt currIndex = iItems->Count() - iList->CurrentItemIndex() - 1;
+
+        //the joystick is pressed
+        if ( aKeyEvent.iCode == EKeyOK )
+            {
+            if ( ( iList->HighLightEnabled() )
+              && ( iDirectoryMode )
+              && ( (*iItems)[ currIndex ][(*iItems)[ currIndex ].Length() - 1] != KSlash ) )
+                {
+                SetDirectoryModeL( EFalse );
+                resp = EKeyWasConsumed;
+                }
+            else
+                {
+                if (iEditor->TextLength()!=0)
+                    {
+                    HidePopupL();
+                    }
+                }
+            }
+
+        //the joystick is pressed up
+        else if (    aKeyEvent.iCode == EKeyLeftUpArrow      // Northwest
+                  || aKeyEvent.iCode == EStdKeyDevice10      //   : Extra KeyEvent supports diagonal event simulator wedge
+                  || aKeyEvent.iCode == EKeyUpArrow          // North
+                  || aKeyEvent.iCode == EKeyRightUpArrow     // Northeast
+                  || aKeyEvent.iCode == EStdKeyDevice11 )    //   : Extra KeyEvent supports diagonal event simulator wedge
+            {
+            resp = EKeyWasConsumed;
+            //the first time
+            if ( !iList->HighLightEnabled() )
+                {
+                iList->SetHighLight( ETrue );
+                currIndex = iList->Model()->NumberOfItems()-1;
+                iList->ScrollToMakeItemVisible( currIndex );
+                iList->SetCurrentItemIndex( currIndex );
+                DrawNow();
+                //save the original content
+                if ( iFirstGotoContent != NULL )
+                    {
+                    delete iFirstGotoContent;
+                    iFirstGotoContent = NULL;
+                    }
+                iFirstGotoContent = iEditor->GetTextInHBufL();
+                if (iFirstGotoContent == NULL)
+                    {
+                    iFirstGotoContent = KNullDesC().AllocL();
+                    }
+                }
+            else
+                {
+                resp=iList->OfferKeyEventL( aKeyEvent, aType );
+                }
+            if ( currIndex > -1 )
+                {
+                //copy the selected item to edit field
+                TPtrC16 item;
+                TPtrC rightSide;
+                TInt newIndex;
+                newIndex = iItems->Count() - iList->CurrentItemIndex() - 1;
+                item.Set( (*iItems)[ newIndex ] );
+                //cut the slash from the end if needed
+                //permanent sollution until AHLE does not
+                //solve this problem related to ID: TMCN-5TTRXV error
+
+                //if URL completion, then we want to append the item to the item in the edit field
+                if (iUrlCompletionMode)
+                    {
+                    TPtr16 ptr = iFirstGotoContent->Des();
+
+                    HBufC* buf = HBufC::NewLC(ptr.Length() + item.Length() + 1);
+
+                    buf->Des().Copy(ptr);
+                    buf->Des().Append(item);
+                    buf->Des().ZeroTerminate();
+
+
+                    rightSide.Set(buf->Des());
+
+                    iEditor->SetTextL( &rightSide );
+                    iEditor->SetCursorPosL( rightSide.Length(), EFalse );
+
+                    CleanupStack::PopAndDestroy(); //buf
+                    }
+                else
+                    {
+                    if ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash )
+                        {
+                        rightSide.Set( item.Left( item.Length() ) );
+                        }
+                    else
+                        {
+                        rightSide.Set( item.Left( item.Length() - 1 ) );
+                        }
+                    iEditor->SetTextL( &rightSide );
+                    iEditor->SetCursorPosL( rightSide.Length(), EFalse );
+                    }
+                delete iPrevGotoContent;
+                iPrevGotoContent = NULL;
+                iPrevGotoContent = item.AllocL();
+                iEditor->DrawNow();
+                //change the CBA depending on whether the highlight is
+                //on url or domain
+                if ( ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) && iDirectoryMode )
+                    {
+                    iOpenCBA = ETrue;
+                    }
+                else
+                    {
+                    iOpenCBA = EFalse;
+                    }
+                CBrowserAppUi::Static()->UpdateCbaL();
+                }
+            }
+
+        //the joystisk is pressed down
+        else if (    aKeyEvent.iCode == EKeyLeftDownArrow    // Southwest
+                  || aKeyEvent.iCode == EStdKeyDevice13      //   : Extra KeyEvent supports diagonal event simulator wedge
+                  || aKeyEvent.iCode == EKeyDownArrow        // South
+                  || aKeyEvent.iCode == EKeyRightDownArrow   // Southeast
+                  || aKeyEvent.iCode == EStdKeyDevice12 )    //   : Extra KeyEvent supports diagonal event simulator wedge
+            {
+            resp = EKeyWasConsumed;
+            //it was the last item
+            if ( iPrevItem == 0 )
+                {
+                //write back the original string
+                iList->SetHighLight( EFalse );
+                iEditor->SetTextL( iFirstGotoContent );
+                iEditor->HandleTextChangedL();
+                iEditor->SetCursorPosL( iFirstGotoContent->Length(), EFalse );
+                delete iPrevGotoContent;
+                iPrevGotoContent = NULL;
+                iPrevGotoContent = iFirstGotoContent->AllocL();
+                iEditor->DrawNow();
+                DrawNow();
+                //change the CBA
+                if ( iOpenCBA )
+                    {
+                    iOpenCBA = EFalse;
+                    CBrowserAppUi::Static()->UpdateCbaL();
+                    }
+                return resp;
+                }
+            else if ( ( currIndex > -1 ) && iList->HighLightEnabled() )
+                {
+                //write the selected items string to the editor
+                TPtrC16 item;
+                TPtrC rightSide;
+                TInt newIndex;
+                resp = iList->OfferKeyEventL( aKeyEvent, aType );
+                newIndex = iItems->Count() - iList->CurrentItemIndex() - 1;
+                item.Set( (*iItems)[ newIndex ] );
+                //cut the slash from the end if needed
+                //permanent sollution until AHLE does not
+                //solve this problem related to ID: TMCN-5TTRXV error
+                if ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash )
+                    {
+                    rightSide.Set( item.Left( item.Length() ) );
+                    }
+                else
+                    {
+                    rightSide.Set( item.Left( item.Length() - 1 ) );
+                    }
+
+                //if true then append the suffix (rightSide), to the
+                //user-typed data
+                //else just use the recent URLs text(rightSide) only
+                if ( iUrlCompletionMode )
+                    {
+                    HBufC* currentCompletion = HBufC::NewLC(
+                        iFirstGotoContent->Des().Length() + rightSide.Length() + 1 );
+                    TPtr currentCompletionPtr = currentCompletion->Des();
+
+                    currentCompletionPtr.Copy( iFirstGotoContent->Des() );
+                    currentCompletionPtr.Append( rightSide );
+                    currentCompletionPtr.ZeroTerminate();
+                    iEditor->SetTextL( currentCompletion );
+                    iEditor->SetCursorPosL( currentCompletionPtr.Length(), EFalse );
+                    CleanupStack::PopAndDestroy( currentCompletion );
+                    }
+                else
+                    {
+                    iEditor->SetTextL( &rightSide );
+                    iEditor->SetCursorPosL( rightSide.Length(), EFalse );
+                    }
+                iEditor->HandleTextChangedL();
+
+                if ( iPrevGotoContent != NULL )
+                    {
+                    delete iPrevGotoContent;
+                    iPrevGotoContent = NULL;
+                    }
+                iPrevGotoContent = item.AllocL();
+                iEditor->DrawNow();
+                //change the CBA depending on whether the highlight is
+                //on url or domain
+                if ( ( (*iItems)[ newIndex ][(*iItems)[ newIndex ].Length() - 1] != KSlash ) && iDirectoryMode )
+                    {
+                    iOpenCBA = ETrue;
+                    }
+                else
+                    {
+                    iOpenCBA = EFalse;
+                    }
+                CBrowserAppUi::Static()->UpdateCbaL();
+                }
+            }
+
+        if ( iList->HighLightEnabled() )
+            {
+            iPrevItem = currIndex;
+            }
+        }
+    return resp;
+    }
+
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::HidePopupL
+// Hides the popup list
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::HidePopupL()
+    {
+    //clear the lists
+    if ( iPoppedUp )
+        {
+        HBufC* newText = HBufC::NewLC( iEditor->TextLength() );
+        TPtr newTextDes = newText->Des();
+        iEditor->GetText( newTextDes );
+        iEditor->ClearSelectionL();
+        iEditor->SetTextL( newText );
+        iEditor->SetCursorPosL( iEditor->TextLength(), EFalse );
+        CleanupStack::PopAndDestroy( newText );
+        iItemNames->Reset();
+        iList->Reset();
+        if (!IsActivated())
+            {
+            ActivateL();
+            }
+        MakeVisible(EFalse);
+        DrawNow();
+        iPrevItem = -2;
+        iPoppedUp = EFalse;
+        // highlight a directory, cancel goto pane
+        // activate goto pane again -> softkey problem
+        iOpenCBA = EFalse;
+        CBrowserAppUi::Static()->UpdateCbaL();
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::IsInDirectoryMode
+// gives back the directory mode
+// ---------------------------------------------------------
+//
+TBool CBrowserAdaptiveListPopup::IsInDirectoryMode()
+    {
+    return iDirectoryMode;
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::SetDirectoryMode
+// Sets the directory mode
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::SetDirectoryModeL(TBool aDirMode)
+    {
+    iDirectoryMode = aDirMode;
+    if ( aDirMode == EFalse )
+        {
+        //put the slash to the back of the editor fileds string
+        //it will show the directory mode
+        TInt length;
+        length = iEditor->TextLength() + 1;
+        HBufC* newText = HBufC::NewLC( length );
+        TPtr newTextDes = newText->Des();
+        iEditor->GetText( newTextDes );
+        newTextDes.Append( TChar(KSlash) );
+        iEditor->SetTextL( newText );
+        iEditor->SetCursorPosL( length, EFalse );
+        CleanupStack::PopAndDestroy( newText );
+        iEditor->DrawNow();
+        ShowPopupListL();
+        //change the CBA
+        if ( iOpenCBA )
+            {
+            iOpenCBA = EFalse;
+            CBrowserAppUi::Static()->UpdateCbaL();
+            }
+        }
+    return;
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::IsOpenDirToShow
+// Show which CBA is about to show
+// ---------------------------------------------------------
+//
+TBool CBrowserAdaptiveListPopup::IsOpenDirToShow()
+{
+    return iOpenCBA;
+}
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::IsPoppedUp
+// Show whether the list is popped up or not
+// ---------------------------------------------------------
+//
+TBool CBrowserAdaptiveListPopup::IsPoppedUp()
+{
+    return iPoppedUp;
+}
+
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::HandleResourceChange
+// If new skin is set the icons will be reloaded
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::HandleResourceChange( TInt aType )
+    {
+    TRAP_IGNORE( HandleResourceChangeL( aType ) );
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::HandleResourceChangeL
+// If new skin is set the icons will be reloaded
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::HandleResourceChangeL( TInt aType )
+    {
+    if (( aType == KAknsMessageSkinChange )||
+       ( aType == KEikDynamicLayoutVariantSwitch ) )
+        {
+        CArrayPtr<CGulIcon>* array =
+                            iList->ItemDrawer()->ColumnData()->IconArray();
+
+        array->ResetAndDestroy();
+        delete array;
+        SetIconsL();
+        }
+
+    CCoeControl::HandleResourceChange(aType);
+    if (aType == KEikDynamicLayoutVariantSwitch)
+        {
+        TRect  rect;
+        if (AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane, rect))
+            {
+            SetRect(rect);
+            }
+        }
+
+    if ( ( aType == KEikDynamicLayoutVariantSwitch ) && ( iPoppedUp ) )
+        {
+
+        if ( AknLayoutUtils::PenEnabled() )
+            {
+            SetOrdinalPosition( 0 );
+            }
+
+        TInt selectionIndex = -1;
+        HBufC* originalText = NULL;
+        TInt popitem( 0 );
+        if ( iList->HighLightEnabled() )
+            {
+            selectionIndex = iList->CurrentItemIndex();
+            //save the editors content
+            originalText = iEditor->GetTextInHBufL();
+            if (originalText == NULL)
+                {
+                originalText = KNullDesC().AllocL();
+                }
+            CleanupStack::PushL( originalText );
+            ++popitem;
+            //write back the first string
+            iEditor->SetTextL( iFirstGotoContent );
+            iEditor->HandleTextChangedL();
+            }
+        ShowPopupListL(ETrue);
+        if ( selectionIndex > -1)
+            {
+            iEditor->SetTextL( originalText );
+            iEditor->SetCursorPosL( originalText->Length(), EFalse );
+            iEditor->HandleTextChangedL();
+            iList->SetHighLight( ETrue );
+            iList->ScrollToMakeItemVisible( selectionIndex );
+            iList->SetCurrentItemIndex( selectionIndex );
+            DrawNow();
+            iEditor->DrawNow();
+            }
+        if ( popitem )
+            {
+            CleanupStack::PopAndDestroy( popitem );  // originalText
+            }
+        }
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::SetIconsL()
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::SetIconsL()
+{
+    CArrayPtr<CGulIcon>* icons =
+    new(ELeave) CAknIconArray( KMaxIcons );
+    CleanupStack::PushL(icons); // PUSH Icon
+    CGulIcon* newIcon;
+    CFbsBitmap *newIconBmp;
+    CFbsBitmap *newIconMaskBmp;
+
+    TParse* fp = new(ELeave) TParse();
+    CleanupStack::PushL(fp);
+    TInt err = fp->Set(KBrowserDirAndFile, &KDC_APP_BITMAP_DIR, NULL);
+    if (err != KErrNone)
+        {
+        User::Leave(err);
+        }
+    TBuf<KMaxFileName> iconFile= fp->FullName();
+    CleanupStack::PopAndDestroy(fp);
+
+    MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance();
+    AknsUtils::CreateIconL( skinInstance,
+                                           KAknsIIDQgnPropWmlFolderAdap,
+                                           newIconBmp,
+                                           newIconMaskBmp,
+                                           iconFile,
+                                           EMbmBrowserQgn_prop_wml_folder_adap,
+                                           EMbmBrowserQgn_prop_wml_folder_adap_mask);
+    newIcon = CGulIcon::NewL( newIconBmp, newIconMaskBmp);
+    CleanupStack::PushL(newIcon);
+    icons->AppendL( newIcon );
+    CleanupStack::Pop(newIcon);
+    AknsUtils::CreateIconL( skinInstance,
+                                           KAknsIIDQgnPropWmlBmAdap,
+                                           newIconBmp,
+                                           newIconMaskBmp,
+                                           iconFile,
+                                           EMbmBrowserQgn_prop_wml_bm_adap,
+                                           EMbmBrowserQgn_prop_wml_bm_adap_mask);
+    newIcon = CGulIcon::NewL( newIconBmp, newIconMaskBmp);
+    CleanupStack::PushL(newIcon);
+    icons->AppendL( newIcon );
+    CleanupStack::Pop(newIcon);
+    iList->ItemDrawer()->FormattedCellData()->SetIconArrayL(icons);
+    CleanupStack::Pop();    // POP Icon
+}
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::SetUrlSuffixList()
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::SetUrlSuffixList(HBufC* urlSuffixList)
+    {
+    iUrlSuffixBuf = urlSuffixList;
+    }
+
+// ---------------------------------------------------------
+// CBrowserAdaptiveListPopup::SetMaxRecentUrls()
+// ---------------------------------------------------------
+//
+void CBrowserAdaptiveListPopup::SetMaxRecentUrls (TInt maxRecentUrls)
+    {
+    iMaxRecentUrlsToShow = maxRecentUrls;
+    }
+
+
+// End of File