--- /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
+
+
+
+
+
+