webengine/webkitutils/ToolBar/ToolBarButton.cpp
changeset 0 dd21522fd290
child 13 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/webkitutils/ToolBar/ToolBarButton.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,1450 @@
+/*
+* Copyright (c) 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:  The Toolbar button class
+*
+*/
+
+// INCLUDE FILES
+#include <e32std.h>
+#include <AknUtils.h>
+#include <stringloader.h>
+#include "ToolBarButton.h"
+#include "ToolBar.h"
+#include "W32STD.H"
+#include "RecentUrlStore.h"
+#include <Uri16.h>
+#include <GULICON.H>
+#include <AknBidiTextUtils.h>
+#include "BrCtlInterface.h"
+#include <favouritesitem.h>
+#include <favouritesitemlist.h>
+#include <favouritessession.h>
+#include <favouritesdb.h>
+
+#include "eikon.hrh"
+
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+const TInt KListItemMargin = 9;
+const TInt KListMargin = 10;
+const TInt KBorderSize = 5;
+const TInt KCursorOffset = 8;
+const TInt KDropdownSlidePixel = 20;
+_LIT(KTitle,"title");
+_LIT(KUrl,"url");
+const TInt KMaxBorderAlpha = 128; // how dark is the shadow around the sprite
+const TInt KDefaultTransparency = 10; // % transparent
+const TInt KToolTipBorder = 4;
+const TInt KTextMargin = 3;
+
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDropDownList::CDropDownList
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CDropDownList::CDropDownList(
+    CDropDownButton& aParent,
+    CArrayPtrFlat<HBufC>* aItemText,
+    CArrayPtrFlat<CGulIcon>* aItemIcon )
+    : iParent( &aParent ), iItemText( aItemText ), iItemIcon( aItemIcon ), iSize( -1, -1 )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::ConstructL()
+    {
+    iAnimTimer = CPeriodic::NewL( CActive::EPriorityHigh );
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDropDownList* CDropDownList::NewL(
+    CDropDownButton& aParent,
+    CArrayPtrFlat<HBufC>* aItemText,
+    CArrayPtrFlat<CGulIcon>* aItemIcon )
+    {
+    CDropDownList *self = new CDropDownList( aParent, aItemText, aItemIcon );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CDropDownList::~CDropDownList()
+    {
+    if ( iItemText )
+        {
+        iItemText->ResetAndDestroy();
+        delete iItemText;
+        }
+    if ( iItemIcon )
+        {
+        iItemIcon->ResetAndDestroy();
+        delete iItemIcon;
+        }
+    if ( iAnimTimer )
+        {
+        iAnimTimer->Cancel();
+        delete iAnimTimer;
+        }
+    delete iDropDownBitmapDevice;
+    delete iDropDownBitmapContext;
+    delete iDropDownBitmap;
+
+    delete iSpriteBitmapDevice;
+    delete iSpriteBitmapContext;
+    delete iSpriteBitmap;
+
+    delete iSpriteMaskBitmapDevice;
+    delete iSpriteMaskBitmapContext;
+    delete iSpriteMaskBitmap;
+
+    delete iMaskBitmapDevice;
+    delete iMaskBitmapContext;
+    delete iMaskBitmap;
+
+    iDropSprite.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::MakeVisible
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::MakeVisible(
+    TBool aVisible )
+    {
+    if ( iVisible == aVisible || iItemText->Count() == 0 )
+        {
+        return;
+        }
+
+    // We have toggled visibility for this dropdown list
+    iVisible = aVisible;
+
+    if ( !iVisible )
+        {
+        // If requesting to close dropdown list, close it without animation
+        iAnimTimer->Cancel();
+        //iDropSlide = 0;
+        iDropSprite.Close();
+           iSpriteInitialised = EFalse;
+        return;
+        }
+
+    if ( !iAnimTimer->IsActive() )
+        {
+        // If not currently animating, animate dropdown list open
+        iAnimTimer->Start( 0, 1000, TCallBack( &DropDownCb, this ) );
+        }
+
+    if ( iVisible )
+        {
+        TBool build( EFalse );
+        // get position
+        iPosition.iX = iParent->ToolBar().Position().iX + iParent->Position().iX;
+        iPosition.iY = iParent->ToolBar().Position().iY + iParent->ToolBar().Size().iHeight - KBorderSize;
+        if ( iSize == TSize( -1, -1 ) )
+            {
+            iSize = CalculateListSize();
+            TRAP_IGNORE(CreateBitmapL());
+            }
+        // adjust position
+        CCoeControl& view = iParent->ToolBar().ToolBarCallback().View();
+        // out of the view case
+        if ( iPosition.iX + iSize.iWidth > view.Size().iWidth )
+            {
+            iPosition.iX -= ( ( iPosition.iX + iSize.iWidth ) - view.Size().iWidth );
+            }
+        // y
+        if ( iPosition.iY + iSize.iHeight > view.Size().iHeight )
+            {
+            build = !iDropUp;
+            iDropUp = ETrue;
+            iPosition.iY = iParent->ToolBar().Position().iY - iSize.iHeight + KBorderSize;
+            }
+        else
+            {
+            build = iDropUp;
+            iDropUp = EFalse;
+            }
+
+        if ( build || iSelectedItem != -1 )
+            {
+            iSelectedItem = -1;
+            TRAP_IGNORE(DrawDropDownListL());
+            }
+
+        ConstructSprite();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDropDownList::HandleOfferKeyEventL
+//
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CDropDownList::HandleOfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aEventCode )
+    {
+    if ( !iVisible )
+        {
+        return EKeyWasNotConsumed;
+        }
+    // The arrow key events
+    if ( aEventCode == EEventKey )
+        {
+        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
+
+             || 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
+            {
+            iParent->ToolBar().MakeToolTipVisible(EFalse);
+            if (    ( !iDropUp && (    aKeyEvent.iCode == EKeyLeftUpArrow       // Northwest
+                                    || aKeyEvent.iCode == EStdKeyDevice10       //   : Extra KeyEvent supports diagonal event sim
+                                    || aKeyEvent.iCode == EKeyUpArrow           // North
+                                    || aKeyEvent.iCode == EKeyRightUpArrow      // Northeast
+                                    || aKeyEvent.iCode == EStdKeyDevice11 ) )   //   : Extra KeyEvent supports diagonal event sim
+
+                 || (  iDropUp && (    aKeyEvent.iCode == EKeyLeftDownArrow     // Southwest
+                                    || aKeyEvent.iCode == EStdKeyDevice13       //   : Extra KeyEvent supports diagonal event sim
+                                    || aKeyEvent.iCode == EKeyDownArrow         // South
+                                    || aKeyEvent.iCode == EKeyRightDownArrow    // Southeast
+                                    || aKeyEvent.iCode == EStdKeyDevice12 ) ) ) //   : Extra KeyEvent supports diagonal event sim
+                {
+                // can go down to -1
+                iSelectedItem = --iSelectedItem >= -1 ? iSelectedItem : -1;
+                }
+            else
+                {
+                iSelectedItem = ++iSelectedItem > iItemText->Count() - 1 ? 0 : iSelectedItem;
+                }
+            DrawDropDownListL();
+            // update cursor unless we move out of the dropdown
+            if ( iSelectedItem != -1 )
+                {
+                TSize bmSize( iDropDownBitmap->SizeInPixels() );
+                const CFont* font = LatinBold16();
+                TInt height( font->AscentInPixels() + KListItemMargin );
+                TPoint curPos( bmSize.iWidth/2, KListMargin + iSelectedItem * height + KCursorOffset );
+                if ( iDropUp )
+                    {
+                    curPos.iY = bmSize.iHeight - curPos.iY - height + KCursorOffset;
+                    }
+                curPos+= iPosition;
+                iParent->ToolBar().ToolBarCallback().SetAndUpdateCursorPosition( curPos );
+
+                //iParent->ToolBar().Draw(*(CWindowGc*)NULL);
+                iParent->ToolBar().Draw();
+                iParent->ToolBar().SelectableItemHighlighted();
+                }
+             else
+                {
+                iParent->ToolBar().UpdateCursorPosition();
+                iParent->ToolBar().ToolBarCallback().View().DrawDeferred();
+                }
+            }
+        else if ( aKeyEvent.iCode == EKeyDevice3 && SelectedItem() != -1 )
+            {
+            // The activate
+            iParent->ActivatedL( SelectedItem() );
+            return EKeyWasConsumed;
+            }
+        }
+    return EKeyWasNotConsumed;
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::HandlePointerEventL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CDropDownList::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    TPointerEvent::TType pEventType = aPointerEvent.iType;
+    if ( pEventType == TPointerEvent::EButton1Up )
+        {
+        TRect listRect(iPosition, iSize);
+        if (listRect.Contains(aPointerEvent.iPosition))
+            {
+            TInt itemCount = iItemText->Count();
+            TInt itemHight = (listRect.Height()-KBorderSize)/itemCount;
+            TSize itemSize(listRect.Width(), itemHight);
+            TPoint cPosition = iPosition;
+            iOldSelectedItem = SelectedItem();
+
+            TInt n;
+            for ( n = iDropUp ? (itemCount - 1):0; iDropUp ? n >= 0:n <= itemCount ; iDropUp ? n--:n++)
+                {
+                TRect itemRect(cPosition, itemSize);
+                if (itemRect.Contains(aPointerEvent.iPosition))
+                    {
+                    iSelectedItem = n;
+                    DrawDropDownListL();
+                    iParent->ToolBar().ToolBarCallback().View().DrawNow();
+                    if (SelectedItem() == iOldSelectedItem && iSelectedItem != -1)
+                        {
+                        iParent->ActivatedL( SelectedItem() );
+                        }
+                    return EFalse;
+                    }
+                cPosition.iY += itemHight;
+                }
+            }
+        }
+    return ETrue;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDropDownList::Draw
+//
+// -----------------------------------------------------------------------------
+//
+//void CDropDownList::Draw(
+  //  CWindowGc& /*aGc*/ )
+void CDropDownList::Draw()
+    {
+    if ( iVisible || iAnimTimer->IsActive() )
+        {
+        TSpriteMember spriteMem;
+        TSize bmSize( iSpriteBitmap->SizeInPixels() );
+        //
+        iSpriteBitmapContext->Clear();
+        iSpriteMaskBitmapContext->Clear();
+        if ( iDropUp )
+            {
+            iSpriteBitmapContext->BitBlt( TPoint( 0, bmSize.iHeight - iDropSlide/* - yOffset*/ ), *iDropDownBitmapContext,
+                TRect( TPoint( 0, 0 ), TSize( bmSize.iWidth, iDropSlide )  ) );
+            iSpriteMaskBitmapContext->BitBlt( TPoint( 0, bmSize.iHeight - iDropSlide /*- yOffset*/ ), iMaskBitmap,
+                TRect( TPoint( 0, 0 ), TSize( bmSize.iWidth, iDropSlide )  ) );
+            }
+        else
+            {
+            iSpriteBitmapContext->BitBlt( TPoint( 0, 0 ), *iDropDownBitmapContext,
+                TRect( TPoint( 0, bmSize.iHeight - iDropSlide  ), TSize( bmSize.iWidth, iDropSlide )  ) );
+            iSpriteMaskBitmapContext->BitBlt( TPoint( 0, 0 ), iMaskBitmap,
+                TRect( TPoint( 0, bmSize.iHeight - iDropSlide ), TSize( bmSize.iWidth, iDropSlide )  ) );
+            }
+
+        spriteMem.iBitmap = iSpriteBitmap;
+        spriteMem.iMaskBitmap = iSpriteMaskBitmap;
+        if (iSpriteInitialised)
+            {
+            iDropSprite.UpdateMember(0, spriteMem);
+            }
+        else
+            {
+            iSpriteInitialised = ETrue;
+            iDropSprite.AppendMember(spriteMem);
+            iDropSprite.SetPosition(iPosition);
+            iDropSprite.Activate();
+            }
+        }
+    iParent->RefreshToolTip();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::UpdateIconsL
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::UpdateIconsL(
+    CArrayPtrFlat<CGulIcon>* aItemIcon )
+    {
+    delete iItemIcon;
+    iItemIcon = aItemIcon;
+    //
+    CCoeControl& view = iParent->ToolBar().ToolBarCallback().View();
+    TSize size( CalculateListSize() );
+    if ( iSize != size )
+        {
+        TInt diff( size.iWidth - iSize.iWidth );
+        iSize = size;
+        CreateBitmapL();
+        // adjust dropdown x pos
+        if ( iPosition.iX - diff > 0 )
+            {
+            iPosition.iX -= diff;
+            }
+        }
+    DrawDropDownListL();
+
+   iParent->ToolBar().Draw();
+    }
+// -----------------------------------------------------------------------------
+// CDropDownList::DropDownCb
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::AnimateDropDown()
+    {
+    TSize bmSize( iDropDownBitmap->SizeInPixels() );
+
+    if ( iVisible )
+        {
+        iDropSlide+=KDropdownSlidePixel;
+        if ( iDropSlide >= bmSize.iHeight )
+            {
+            iDropSlide = Min( iDropSlide, bmSize.iHeight );
+            iAnimTimer->Cancel();
+            }
+        }
+    else
+        {
+        iDropSlide-=KDropdownSlidePixel;
+        if ( iDropSlide <= 0 )
+            {
+            iDropSlide = Max( iDropSlide, 0 );
+            iAnimTimer->Cancel();
+            }
+        }
+
+        iParent->ToolBar().Draw();
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::DropDownCb
+//
+// -----------------------------------------------------------------------------
+//
+TInt CDropDownList::DropDownCb(
+    TAny* aPtr )
+    {
+    static_cast<CDropDownList*>(aPtr)->AnimateDropDown();
+    return ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::CreateBitmapL
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::CreateBitmapL()
+    {
+
+    delete iDropDownBitmapDevice;
+    iDropDownBitmapDevice = NULL;
+    delete iDropDownBitmapContext;
+    iDropDownBitmapContext = NULL;
+    delete iDropDownBitmap;
+    iDropDownBitmap = NULL;
+    iDropDownBitmap = new (ELeave) CFbsBitmap;
+    User::LeaveIfError( iDropDownBitmap->Create( iSize, EColor16MA ) );
+    iDropDownBitmapDevice = CFbsBitmapDevice::NewL( iDropDownBitmap );
+    User::LeaveIfError( iDropDownBitmapDevice->CreateContext( iDropDownBitmapContext ) );
+
+    // draw shadows only once
+    TRect r( TPoint( 0, 0 ), iDropDownBitmap->SizeInPixels() );
+    iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha );
+    iDropDownBitmapContext->SetBrushStyle( CGraphicsContext::ESolidBrush );
+    iDropDownBitmapContext->SetPenStyle( CGraphicsContext::ENullPen );
+    iDropDownBitmapContext->SetBrushColor( TRgb( 242, 244, 242, 20 ) );
+    iDropDownBitmapContext->DrawRect( r );
+
+    iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha );
+    iDropDownBitmapContext->SetPenStyle( CGraphicsContext::ESolidPen );
+    iDropDownBitmapContext->SetBrushStyle( CGraphicsContext::ENullBrush );
+    // wider shadow to bottom, no shadow to top
+    TInt bw = KBorderSize;
+    for (TInt n=1;n<=2*bw-1;n++)
+        {
+        iDropDownBitmapContext->SetPenColor(TRgb(0,0,0,n*n*KMaxBorderAlpha/(2*2*bw*bw)));
+        iDropDownBitmapContext->DrawRect( r );
+        r.iTl.iX += n%2;
+        r.iBr.iX -= n%2;
+        r.iBr.iY -= 1;
+        }
+
+    delete iSpriteBitmapDevice;
+    iSpriteBitmapDevice = NULL;
+    delete iSpriteBitmapContext;
+    iSpriteBitmapContext = NULL;
+    delete iSpriteBitmap;
+    iSpriteBitmap = NULL;
+    iSpriteBitmap = new (ELeave) CFbsBitmap;
+    User::LeaveIfError( iSpriteBitmap->Create( iSize, EColor16MA ) );
+    iSpriteBitmapDevice = CFbsBitmapDevice::NewL( iSpriteBitmap );
+    User::LeaveIfError( iSpriteBitmapDevice->CreateContext( iSpriteBitmapContext ) );
+    iSpriteBitmapContext->CopySettings(*iDropDownBitmapContext);
+
+    //mask
+    delete iSpriteMaskBitmapDevice;
+    iSpriteMaskBitmapDevice = NULL;
+    delete iSpriteMaskBitmapContext;
+    iSpriteMaskBitmapContext = NULL;
+    delete iSpriteMaskBitmap;
+    iSpriteMaskBitmap = NULL;
+    iSpriteMaskBitmap = new (ELeave) CFbsBitmap;
+    User::LeaveIfError( iSpriteMaskBitmap->Create( iSize, EColor256 ) );
+    iSpriteMaskBitmapDevice = CFbsBitmapDevice::NewL( iSpriteMaskBitmap );
+    User::LeaveIfError( iSpriteMaskBitmapDevice->CreateContext( iSpriteMaskBitmapContext ) );
+
+    delete iMaskBitmapDevice;
+    iMaskBitmapDevice = NULL;
+    delete iMaskBitmapContext;
+    iMaskBitmapContext = NULL;
+    delete iMaskBitmap;
+    iMaskBitmap = NULL;
+    iMaskBitmap = new (ELeave) CFbsBitmap;
+    User::LeaveIfError( iMaskBitmap->Create( iSize, EColor256 ) );
+    iMaskBitmapDevice = CFbsBitmapDevice::NewL( iMaskBitmap );
+    User::LeaveIfError( iMaskBitmapDevice->CreateContext( iMaskBitmapContext ) );
+
+    // draw shadows only once
+    r.SetRect( TPoint( 0, 0 ), iDropDownBitmap->SizeInPixels() );
+    iMaskBitmapContext->SetBrushStyle( CGraphicsContext::ESolidBrush );
+    iMaskBitmapContext->SetPenStyle( CGraphicsContext::ESolidPen );
+    iMaskBitmapContext->SetPenColor( TRgb( 30, 30, 30 ) );
+    iMaskBitmapContext->SetBrushColor( TRgb( 30, 30, 30 ) );
+    iMaskBitmapContext->DrawRect( r );
+
+    iMaskBitmapContext->SetPenStyle( CGraphicsContext::ESolidPen );
+    iMaskBitmapContext->SetBrushStyle( CGraphicsContext::ENullBrush );
+
+    // wider shadow to bottom, no shadow to top
+    for (TInt n=1;n<=2*bw-1;n++)
+        {
+        TInt grade = 85*n/(2*bw);
+        iMaskBitmapContext->SetPenColor(TRgb(255-grade,255-grade,255-grade));
+        iMaskBitmapContext->DrawRect( r );
+        r.iTl.iX += n%2;
+        r.iBr.iX -= n%2;
+        r.iBr.iY -= 1;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::ConstructSprite
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::ConstructSprite()
+    {
+    CToolBar& toolbar = iParent->ToolBar();
+    CCoeControl& view = toolbar.ToolBarCallback().View();
+
+    iDropSprite = RWsSprite(view.ControlEnv()->WsSession());
+    RWindowTreeNode *window =  (RDrawableWindow* )toolbar.ToolBarCallback().CCoeControlParent().DrawableWindow();
+    iDropSprite.Construct(*window,iPosition,ESpriteNoChildClip);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::DrawDropDownListL
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownList::DrawDropDownListL()
+    {
+    if ( iItemText->Count() )
+        {
+        TSize bmSize( iDropDownBitmap->SizeInPixels() );
+
+        TRect r( TPoint( KBorderSize, 2 ), iDropDownBitmap->SizeInPixels() - TSize( 2*KBorderSize, 2*KBorderSize ) );
+        iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha );
+        iDropDownBitmapContext->SetBrushStyle( CGraphicsContext::ESolidBrush );
+        iDropDownBitmapContext->SetPenStyle( CGraphicsContext::ENullPen );
+        iDropDownBitmapContext->SetBrushColor( TRgb( 242, 244, 242, 255*(100-KDefaultTransparency)/100 ) );
+        iDropDownBitmapContext->DrawRect( r );
+
+        const CFont* font = LatinBold16();
+
+        iDropDownBitmapContext->UseFont( font );
+        iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModePEN );
+        iDropDownBitmapContext->SetPenStyle( CGraphicsContext::ESolidPen );
+        TInt height( font->AscentInPixels() + KListItemMargin );
+        TInt x( KBorderSize + KListMargin );
+        x += iItemIcon ? ( height ) : 0;
+        TInt y( KListMargin - KListItemMargin );
+        for ( TInt i = 0; i < iItemText->Count(); i++ )
+            {
+            y += height;
+            iDropDownBitmapContext->SetPenColor( TRgb( 0,0,0 ) );
+            TPoint upperXY( KBorderSize, y - height +  KListItemMargin / 2 );
+            if ( iDropUp )
+                {
+                upperXY.iY = bmSize.iHeight - y - height + KListItemMargin / 2;
+                }
+            if ( i == iSelectedItem )
+                {
+                iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModeWriteAlpha );
+                iDropDownBitmapContext->SetBrushStyle( CGraphicsContext::ESolidBrush );
+
+                TSize selSize( bmSize.iWidth - 2*KBorderSize, height );
+
+                for ( TInt j = selSize.iHeight/2; j >= 0 ; j-- )
+                    {
+                    iDropDownBitmapContext->SetPenColor( TRgb( 50 + j*12, 50 + j*12, 255, 255*(100-KDefaultTransparency)/100) );
+                    iDropDownBitmapContext->DrawRect( TRect( upperXY + TPoint( 0, j ), TSize( selSize.iWidth, 1 ) ) );
+                    iDropDownBitmapContext->DrawRect( TRect( upperXY + TPoint( 0, selSize.iHeight - j ), TSize( selSize.iWidth, 1 ) ) );
+                    }
+                iDropDownBitmapContext->SetDrawMode( CGraphicsContext::EDrawModePEN );
+                iDropDownBitmapContext->SetPenStyle( CGraphicsContext::ESolidPen );
+                iDropDownBitmapContext->SetPenColor( TRgb( 0xff, 0xff, 0xff ) );
+                }
+            // item icon
+            if ( iItemIcon && iItemIcon->At( i ) )
+                {
+                TInt iconSize( Min( height, iItemIcon->At( i )->Bitmap()->SizeInPixels().iHeight ) );
+
+                iDropDownBitmapContext->BitBltMasked( upperXY + TPoint( KBorderSize, height/2 - iconSize/2 ),
+                    iItemIcon->At( i )->Bitmap(),
+                    TRect( TPoint( 0, 0 ), TSize( iconSize, iconSize ) ),
+                    iItemIcon->At( i )->Mask(), EFalse );
+                }
+            CGraphicsContext::TDrawTextExtendedParam aParam;
+            TChar a( (iItemText->At( i ))->Des()[0]);
+            TChar::TBdCategory cat = a.GetBdCategory();
+            if (cat == TChar::ERightToLeft || cat == TChar::ERightToLeftArabic || cat == TChar::ERightToLeftEmbedding || cat == TChar::ERightToLeftOverride)
+               {
+               aParam.iParRightToLeft = ETrue;
+               iDropDownBitmapContext->DrawTextExtended(*(iItemText->At( i )),TPoint( x, iDropUp ? bmSize.iHeight - y : y ),aParam);
+               }
+            else
+               {
+               iDropDownBitmapContext->DrawText( *(iItemText->At( i )), TPoint( x, iDropUp ? bmSize.iHeight - y : y ) );
+               }
+            }
+        iDropDownBitmapContext->DiscardFont();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownList::CalculateListSize
+//
+// -----------------------------------------------------------------------------
+//
+TSize CDropDownList::CalculateListSize()
+    {
+    CToolBar& toolbar = iParent->ToolBar();
+    CCoeControl& view = toolbar.ToolBarCallback().View();
+    TInt maxWidth( view.Size().iWidth / 3 * 2 );
+    TInt maxHeight = Max( toolbar.Position().iY, ( view.Size().iHeight - toolbar.Position().iY - toolbar.Size().iHeight ) );
+    const CFont* font = LatinBold16();
+    TInt itemHeight( font->AscentInPixels() + KListItemMargin );
+    //
+    TSize strSize( 0, 2*KBorderSize + 2*KListMargin );
+    TInt count( iItemText->Count() );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TPtr text = iItemText->At( i )->Des();
+        // pick the longest text
+        TInt width( font->TextWidthInPixels( text ) + 2*KBorderSize + 2*KListMargin );
+        if ( strSize.iWidth < width )
+            {
+            if ( width > maxWidth )
+                {
+                TextUtils::ClipToFit( text, *font, maxWidth - 2*KBorderSize - 2*KListMargin );
+                width = maxWidth;
+                }
+            strSize.iWidth = width;
+            }
+        if ( strSize.iHeight + itemHeight > maxHeight )
+            {
+            // remove extra items
+            for ( TInt j = count - 1; j >= i ; j-- )
+                {
+                HBufC* text = iItemText->At( j );
+                iItemText->Delete( j );
+                delete text;
+                }
+            break;
+            }
+        strSize.iHeight += itemHeight;
+        }
+    // remove item margin from the last item
+    strSize.iHeight -= KListItemMargin;
+    if ( iItemIcon )
+        {
+        // icon is square. use item height for width
+        strSize.iWidth += itemHeight;
+        }
+    return strSize;
+    }
+
+// -----------------------------------------------------------------------------
+// CToolBarButton::CToolBarButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CToolBarButton::CToolBarButton(
+    CToolBar& aParent ) : iParent( &aParent )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CToolBarButton::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CToolBarButton::BaseConstructL(
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    iParent->GetButtonImage(aButtonCmd,iToolBarButton,iToolBarButtonMask);
+    iToolTip = aToolTip.AllocL();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CToolBarButton::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CToolBarButton* CToolBarButton::NewL(
+    CToolBar& aParent,
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    CToolBarButton *self = new CToolBarButton( aParent );
+    CleanupStack::PushL(self);
+    self->BaseConstructL( aButtonCmd, aToolTip );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CToolBarButton::~CToolBarButton()
+    {
+    delete iToolTip;
+    delete iToolBarButton;
+    delete iToolBarButtonMask;
+
+    delete iToolTipBitmapDevice;
+    delete iToolTipBitmapContext;
+    delete iToolTipBitmap;
+
+    delete iToolTipMaskDevice;
+    delete iToolTipMaskContext;
+    delete iToolTipMask;
+    }
+
+// -----------------------------------------------------------------------------
+// CToolBarButton::SetFocus
+//
+// -----------------------------------------------------------------------------
+//
+void CToolBarButton::SetFocus(
+    TBool aFocusOn )
+    {
+    if ( !aFocusOn)
+        {
+        ShowToolTip(EFalse);
+        }
+    }
+
+//-------------------------------------------------------------------------------
+// CToolBarButton::ShowToolTip()
+// Method that draws the tooltip
+//-------------------------------------------------------------------------------
+void CToolBarButton::ShowToolTip(TBool aVisible)
+    {
+    if (aVisible)
+        {
+        delete iToolTipMask;
+        iToolTipMask = 0;
+        delete iToolTipBitmap;
+        iToolTipBitmap = 0;
+        delete iToolTipMaskDevice;
+        iToolTipMaskDevice = 0;
+        delete iToolTipBitmapDevice;
+        iToolTipBitmapDevice = 0;
+        delete iToolTipMaskContext;
+        iToolTipMaskContext = 0;
+        delete iToolTipBitmapContext;
+        iToolTipBitmapContext = 0;
+
+        const CFont* myFont = LatinBold13();
+
+        TPoint cp = iParent->ToolBarCallback().CursorPosition();
+
+        TRect rect = iParent->ToolBarCallback().View().Rect();
+
+        TInt sW = iParent->ToolBarCallback().View().Rect().Width();
+        TInt sH = iParent->ToolBarCallback().View().Rect().Height();
+
+
+        TInt w = myFont->TextWidthInPixels(*iToolTip) + 2*KToolTipBorder + 2*KTextMargin;
+        TInt h = myFont->HeightInPixels() + 2*KTextMargin  + 2*KToolTipBorder;
+        HBufC* visualText= 0;
+        TRAPD(err, visualText = HBufC::NewL( iToolTip->Length() + KAknBidiExtraSpacePerLine);
+        //
+        TPtr visualTextPtr = visualText->Des();
+        // convert the text to lines
+        AknBidiTextUtils::ConvertToVisualAndClip( *iToolTip,visualTextPtr,*myFont, w,w););
+
+        if ( err != KErrNone)
+            {
+            return;
+            }
+
+        TPoint p;
+        p.iX = Min(sW - w, Max(0,cp.iX - w/2));
+        p.iY = Max(iParent->Position().iY - h,0);
+        if (p.iY == 0)
+            {
+            // show tool tip below toolbar
+            p.iY = iParent->Position().iY + iParent->Size().iHeight;
+            }
+
+        TRect boundingRect(TPoint(0,0),TSize(w,h));
+
+        //mask
+        iToolTipMask = new (ELeave) CFbsBitmap;
+        User::LeaveIfError( iToolTipMask->Create( TSize(w,h), EColor16MA ) );
+        iToolTipMaskDevice = CFbsBitmapDevice::NewL( iToolTipMask );
+        User::LeaveIfError( iToolTipMaskDevice->CreateContext( iToolTipMaskContext ) );
+        iToolTipMaskContext->SetPenColor(KRgbBlack);
+        iToolTipMaskContext->SetBrushColor(KRgbBlack);
+        iToolTipMaskContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
+        iToolTipMaskContext->SetPenStyle(CGraphicsContext::ESolidPen);
+        iToolTipMaskContext->DrawRoundRect(boundingRect,TSize(4,4));
+
+        //bitmap
+        iToolTipBitmap = new (ELeave) CFbsBitmap;
+        User::LeaveIfError( iToolTipBitmap->Create( TSize(w,h), EColor16MA ) );
+        iToolTipBitmapDevice = CFbsBitmapDevice::NewL( iToolTipBitmap );
+        User::LeaveIfError( iToolTipBitmapDevice->CreateContext( iToolTipBitmapContext ) );
+        iToolTipBitmapContext->SetPenColor(KRgbBlack);
+        iToolTipBitmapContext->SetBrushColor(TRgb(0xfa,0xfa,0xd2));
+        iToolTipBitmapContext->SetBrushStyle(CGraphicsContext::ESolidBrush);
+        iToolTipBitmapContext->SetPenStyle(CGraphicsContext::ESolidPen);
+        iToolTipBitmapContext->DrawRoundRect(boundingRect,TSize(4,4));
+
+        //add text
+        iToolTipBitmapContext->SetPenColor(KRgbBlack);
+        iToolTipBitmapContext->SetBrushStyle(CGraphicsContext::ENullBrush);
+
+        iToolTipBitmapContext->UseFont(myFont);
+        TPoint pt = boundingRect.iTl;
+        pt += TPoint(KToolTipBorder + KTextMargin,KToolTipBorder + KTextMargin);
+        iToolTipBitmapContext->DrawText(*visualText,
+                    TPoint(pt.iX,pt.iY + myFont->AscentInPixels()));
+        iToolTipBitmapContext->DiscardFont();
+
+        CCoeControl& view = iParent->ToolBarCallback().View();
+
+        iToolTipSprite = RWsSprite(view.ControlEnv()->WsSession());
+        RWindowTreeNode *window =  (RDrawableWindow* )iParent->ToolBarCallback().CCoeControlParent().DrawableWindow();
+        iToolTipSprite.Construct(*window,p, ESpriteNoChildClip);
+
+        TSpriteMember spriteMem;
+        spriteMem.iBitmap = iToolTipBitmap;
+        spriteMem.iMaskBitmap = iToolTipMask;
+        spriteMem.iInvertMask = ETrue;
+
+        iToolTipSprite.AppendMember(spriteMem);
+        iToolTipSprite.Activate();
+        delete visualText;//visual text
+
+        }
+    else  // aVisible = false
+        {
+        iToolTipSprite.Close();
+        }
+
+    iToolTipSpriteVisible = aVisible;
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::RefreshToolTip
+//
+// -----------------------------------------------------------------------------
+//
+void CToolBarButton::RefreshToolTip()
+    {
+    if (iToolTipSpriteVisible)
+        {
+        ShowToolTip(EFalse);// hide
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::CDropDownButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CDropDownButton::CDropDownButton(
+    CToolBar& aParent ) : CToolBarButton( aParent )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+CDropDownButton::~CDropDownButton()
+    {
+    delete iDropDown;
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::Focus
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownButton::SetFocus(
+    TBool aFocus )
+    {
+    CToolBarButton::SetFocus( aFocus );
+    iDropDown->MakeVisible( aFocus );
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::HandleOfferKeyEventL
+//
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CDropDownButton::HandleOfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aEventCode )
+    {
+    return iDropDown->HandleOfferKeyEventL( aKeyEvent, aEventCode );
+    }
+
+TBool CDropDownButton::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    return iDropDown->HandlePointerEventL(aPointerEvent);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::Draw
+//
+// -----------------------------------------------------------------------------
+//
+//void CDropDownButton::Draw(
+  //  CWindowGc& aGc ) const
+void CDropDownButton::Draw() const
+    {
+    iDropDown->Draw();
+    }
+
+// -----------------------------------------------------------------------------
+// CDropDownButton::ShowToolTip
+//
+// -----------------------------------------------------------------------------
+//
+void CDropDownButton::ShowToolTip( )
+    {
+    if ( iDropDown->SelectedItem() < 0)
+       {
+       CToolBarButton::ShowToolTip();
+       }
+    }
+
+// -----------------------------------------------------------------------------
+// CBackButton::CBackButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CVisitedButton::CVisitedButton(
+    CToolBar& aParent ) : CDropDownButton( aParent ), iCurrentFavicon( -1 )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CVisitedButton::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CVisitedButton::ConstructL(
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    BaseConstructL( aButtonCmd, aToolTip );
+
+    iRecentUrlStore = CRecentUrlStore::NewL();
+
+    iListIcons = new( ELeave) CArrayPtrFlat<CGulIcon>(5);
+    CArrayPtrFlat<HBufC>* listItems = new( ELeave) CArrayPtrFlat<HBufC>(5);
+    CleanupStack::PushL( listItems );
+    CArrayPtrFlat<HBufC>* hosts = new( ELeave) CArrayPtrFlat<HBufC>(5);
+    CleanupStack::PushL( hosts );
+
+    iVisitedUrls = new( ELeave) CArrayPtrFlat<HBufC>(5);
+
+    CDesCArrayFlat* visitedNames = new( ELeave ) CDesCArrayFlat( 20 );
+    CleanupStack::PushL( visitedNames );
+    CDesCArrayFlat* visitedUrls = new( ELeave ) CDesCArrayFlat( 20 );
+    CleanupStack::PushL( visitedUrls );
+
+    iRecentUrlStore->GetData(*visitedUrls, *visitedNames);
+
+    TInt visitedPageCount( visitedUrls->Count() );
+    // latest on top
+    for ( TInt i = 0; i < visitedPageCount ; i++ )
+        {
+        HBufC* url = (*visitedUrls)[ i ].AllocLC();
+        HBufC* name = (*visitedNames)[ i ].AllocLC();
+        TPtr namePtr( name->Des() );
+        TPtr urlPtr( url->Des() );
+        TUriParser parser;
+        TInt status( parser.Parse( urlPtr ) );
+
+        if ( status == KErrNone )
+            {
+            TPtrC host = parser.Extract( EUriHost );
+            TBool found( EFalse );
+            for ( TInt j = 0; j < hosts->Count(); j++ )
+                {
+                if ( host == *(hosts->At( j )) )
+                    {
+                    found = ETrue;
+                    break;
+                    }
+                }
+            if ( !found )
+                {
+                // save this host
+                hosts->AppendL( host.AllocL() );
+
+                // remove the trailing '/' character
+                TInt len( urlPtr.Length() - 1 );
+                if ( urlPtr[ len ] == '/' )
+                    {
+                    urlPtr = urlPtr.Left( len );
+                    }
+                // use url if name is empty
+                if ( namePtr.Length() == 0 )
+                    {
+                    CleanupStack::PopAndDestroy(); // name
+                    name = NULL;
+                    name = urlPtr.AllocLC();
+                    }
+
+                listItems->AppendL( name );
+                CleanupStack::Pop(); // name
+                iVisitedUrls->AppendL( url );
+                CleanupStack::Pop(); // url
+                }
+            else
+                {
+                CleanupStack::PopAndDestroy(); // name
+                CleanupStack::PopAndDestroy(); // url
+                }
+
+            }
+        else
+            {
+            CleanupStack::PopAndDestroy(); // name
+            CleanupStack::PopAndDestroy(); // url
+            }
+        }
+    CleanupStack::PopAndDestroy( 3 ); // visitedNames, visitedUrls, hosts
+
+    iDropDown = CDropDownList::NewL( *this, listItems );
+    CleanupStack::Pop(); // listItem
+    iFaviTimer = CIdle::NewL( CActive::EPriorityLow );
+    iFaviTimer->Start( TCallBack( &ReadFaviconCb, this ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CVisitedButton::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CVisitedButton* CVisitedButton::NewL(
+    CToolBar& aParent,
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    CVisitedButton *self = new CVisitedButton( aParent );
+    CleanupStack::PushL(self);
+    self->ConstructL(aButtonCmd,aToolTip);
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CVisitedButton::~CVisitedButton()
+    {
+    delete iRecentUrlStore;
+    if ( iVisitedUrls )
+        {
+        iVisitedUrls->ResetAndDestroy();
+        delete iVisitedUrls;
+        }
+    if ( iListIcons )
+        {
+        iListIcons->ResetAndDestroy();
+        delete iListIcons;
+        }
+    delete iFaviTimer;
+    }
+
+// -----------------------------------------------------------------------------
+// CVisitedButton::ActivatedL
+//
+// -----------------------------------------------------------------------------
+//
+void CVisitedButton::ActivatedL(
+    TInt aSelectedItem )
+    {
+    ToolBar().ToolBarCallback().LoadUrlL( *(iVisitedUrls->At( aSelectedItem )), TBrCtlDefs::ECacheModeNormal );
+    ToolBar().ToolBarCallback().CloseToolBarL();
+    }
+//-------------------------------------------------------------------------------
+// CVisitedButton::ReadNextFavicon
+//
+//-------------------------------------------------------------------------------
+TBool CVisitedButton::ReadNextFaviconL()
+    {
+    TBool next( ++iCurrentFavicon < iVisitedUrls->Count() );
+    if ( next )
+        {
+        CGulIcon* icon = NULL;
+        icon = iParent->ToolBarCallback().GetFaviconL( *(iVisitedUrls->At( iCurrentFavicon ) ) );
+        CleanupStack::PushL( icon );
+        iListIcons->AppendL( icon );
+        CleanupStack::Pop(); //icon
+        }
+    else if ( iListIcons->Count() > 0 )
+        {
+        iDropDown->UpdateIconsL( iListIcons );
+        iListIcons = NULL;
+        }
+    return next;
+    }
+//-------------------------------------------------------------------------------
+// CVisitedButton::ReadFaviconCb
+//
+//-------------------------------------------------------------------------------
+TBool CVisitedButton::ReadFaviconCb(
+    TAny* aAny )
+    {
+    TBool result( EFalse );
+    TRAP_IGNORE( result = static_cast<CVisitedButton*>(aAny)->ReadNextFaviconL() );
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CRssButton::CRssButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CRssButton::CRssButton(
+    CToolBar& aParent ) : CDropDownButton( aParent )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CRssButton::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CRssButton::ConstructL(
+    TInt aButtonCmd,
+    const TDesC& aToolTip,
+    const RPointerArray<TBrCtlSubscribeTo>& aRssArray )
+    {
+    BaseConstructL( aButtonCmd, aToolTip );
+
+    CArrayPtrFlat<HBufC>* listItems = new( ELeave) CArrayPtrFlat<HBufC>(5);
+    CleanupStack::PushL( listItems );
+
+    iSubscribeToItemsUrls = new( ELeave) CArrayPtrFlat<HBufC>(5);
+
+    // Add the items.
+    for ( TInt i = 0; i < aRssArray.Count(); i++ )
+        {
+        // Resolve the url and append it to iSubscribeToItemsUrls.  The resolved
+        // url is added to this list to store the value after this method returns
+        // and so the memory can be cleaned up later.
+        HBufC* resolvedUrl = ToolBar().ToolBarCallback().ResolveUrlL( aRssArray[i]->Url() );
+        CleanupStack::PushL( resolvedUrl );
+        iSubscribeToItemsUrls->AppendL(resolvedUrl);
+        CleanupStack::Pop();
+
+        if (aRssArray[i]->Title().Length())
+            {
+            listItems->AppendL( aRssArray[i]->Title().AllocL() );
+            }
+        else
+            {
+            listItems->AppendL( aRssArray[i]->Url().AllocL() );
+            }
+        }
+
+    iDropDown = CDropDownList::NewL( *this, listItems );
+    CleanupStack::Pop(); // listItem
+    }
+
+// -----------------------------------------------------------------------------
+// CRssButton::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CRssButton* CRssButton::NewL(
+    CToolBar& aParent,
+    TInt aButtonCmd,
+    const TDesC& aToolTip,
+    const RPointerArray<TBrCtlSubscribeTo>& aRssArray )
+    {
+    CRssButton *self = new CRssButton( aParent );
+    CleanupStack::PushL(self);
+    self->ConstructL(aButtonCmd,aToolTip,aRssArray );
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CRssButton::~CRssButton()
+    {
+    if (iSubscribeToItemsUrls)
+        {
+        iSubscribeToItemsUrls->ResetAndDestroy();
+        delete iSubscribeToItemsUrls;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CRssButton::ActivatedL
+//
+// -----------------------------------------------------------------------------
+//
+void CRssButton::ActivatedL(
+    TInt aSelectedItem )
+    {
+    CArrayFixFlat<TPtrC> *attrNames = new (ELeave) CArrayFixFlat<TPtrC>(1);
+    CleanupStack::PushL(attrNames);
+    CArrayFixFlat<TPtrC> *attrValues = new (ELeave) CArrayFixFlat<TPtrC>(1);
+    CleanupStack::PushL(attrValues);
+
+    attrNames->AppendL(KTitle());
+    attrNames->AppendL(KUrl());
+
+    const HBufC& text = iDropDown->SelectedItemText();
+    TPtrC title;
+    title.Set(*(text.AllocL()));
+    attrValues->AppendL(title);
+
+    TPtrC url( *iSubscribeToItemsUrls->At( aSelectedItem )->AllocL() );
+    attrValues->AppendL(url);
+
+    ToolBar().ToolBarCallback().SendCommandsToClient(TBrCtlDefs::EClientCommandSubscribeToFeeds,*attrNames,*attrValues);
+
+    CleanupStack::PopAndDestroy(2);
+    }
+
+////// BOOKMARKS IN TOOLBAR
+
+
+
+// -----------------------------------------------------------------------------
+// CBookmarksButton::CBookmarksButton
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CBookmarksButton::CBookmarksButton(
+    CToolBar& aParent ) : CDropDownButton( aParent ), iCurrentFavicon( -1 )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CBookmarksButton::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CBookmarksButton::ConstructL(
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    BaseConstructL( aButtonCmd, aToolTip );
+
+    // MJB: before from favouritesengine/clientserver/internal/...
+
+    // ----------------------------------------------------------
+    // CFavouritesEngineTestAppUi::TestSomethingL()
+    // ----------------------------------------------------------
+    //
+
+
+    CFavouritesItemList* bookmarks = new (ELeave) CFavouritesItemList();
+    CleanupStack::PushL( bookmarks );
+    RFavouritesSession session;       ///< Session.
+
+    User::LeaveIfError( session.Connect() );
+
+    RFavouritesDb bookmarksDb;
+    TInt err = bookmarksDb.Open( session, KBrowserBookmarks );
+    if ( err )
+        {
+        return;
+        }
+
+    CleanupClosePushL<RFavouritesDb>( bookmarksDb );
+
+    err = bookmarksDb.GetAll( *bookmarks, KFavouritesRootUid, CFavouritesItem::EItem);
+
+    CleanupStack::PopAndDestroy();  // Close db.
+    session.Close();
+
+    iListIcons = new( ELeave) CArrayPtrFlat<CGulIcon>(5);
+    CArrayPtrFlat<HBufC>* listItems = new( ELeave) CArrayPtrFlat<HBufC>(5);
+    CleanupStack::PushL( listItems );
+
+    iBookmarkUrls = new( ELeave) CArrayPtrFlat<HBufC>(5);
+
+    TInt bookmarksCount( bookmarks->Count() );
+    // latest on top
+    for ( TInt i = 0; i < bookmarksCount ; i++ )
+        {
+        HBufC* url = (*bookmarks)[ i ]->Url().AllocLC();
+        HBufC* name = (*bookmarks)[ i ]->Name().AllocLC();
+
+        listItems->AppendL( name );
+        CleanupStack::Pop(); // name
+
+        iBookmarkUrls->AppendL( url );
+        CleanupStack::Pop(); // url
+        }
+
+    iDropDown = CDropDownList::NewL( *this, listItems );
+    CleanupStack::Pop(); // listItems
+    CleanupStack::PopAndDestroy();  // bookmarks
+    iFaviTimer = CIdle::NewL( CActive::EPriorityLow );
+    iFaviTimer->Start( TCallBack( &ReadFaviconCb, this ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CBookmarksButton::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CBookmarksButton* CBookmarksButton::NewL(
+    CToolBar& aParent,
+    TInt aButtonCmd,
+    const TDesC& aToolTip )
+    {
+    CBookmarksButton *self = new CBookmarksButton( aParent );
+    CleanupStack::PushL(self);
+    self->ConstructL(aButtonCmd,aToolTip);
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+CBookmarksButton::~CBookmarksButton()
+    {
+    if ( iBookmarkUrls )
+        {
+        iBookmarkUrls->ResetAndDestroy();
+        delete iBookmarkUrls;
+        }
+    if ( iListIcons )
+        {
+        iListIcons->ResetAndDestroy();
+        delete iListIcons;
+        }
+    delete iFaviTimer;
+    }
+
+// -----------------------------------------------------------------------------
+// CBookmarksButton::ActivatedL
+//
+// -----------------------------------------------------------------------------
+//
+void CBookmarksButton::ActivatedL(
+    TInt aSelectedItem )
+    {
+    ToolBar().ToolBarCallback().LoadUrlL( *(iBookmarkUrls->At( aSelectedItem )), TBrCtlDefs::ECacheModeNormal );
+    ToolBar().ToolBarCallback().CloseToolBarL();
+    }
+//-------------------------------------------------------------------------------
+// CBookmarksButton::ReadNextFavicon
+//
+//-------------------------------------------------------------------------------
+TBool CBookmarksButton::ReadNextFaviconL()
+    {
+    TBool next( ++iCurrentFavicon < iBookmarkUrls->Count() );
+    if ( next )
+        {
+        CGulIcon* icon = NULL;
+        icon = iParent->ToolBarCallback().GetFaviconL( *(iBookmarkUrls->At( iCurrentFavicon ) ) );
+        CleanupStack::PushL( icon );
+        iListIcons->AppendL( icon );
+        CleanupStack::Pop(); //icon
+        }
+    else if ( iListIcons->Count() > 0 )
+        {
+        iDropDown->UpdateIconsL( iListIcons );
+        iListIcons = NULL;
+        }
+    return next;
+    }
+//-------------------------------------------------------------------------------
+// CBookmarksButton::ReadFaviconCb
+//
+//-------------------------------------------------------------------------------
+TBool CBookmarksButton::ReadFaviconCb(
+    TAny* aAny )
+    {
+    TBool result( EFalse );
+    TRAP_IGNORE( result = static_cast<CBookmarksButton*>(aAny)->ReadNextFaviconL() );
+    return result;
+    }
+
+//  End of File
+
+
+
+
+
+