--- a/widgetmanager/src/wmlistbox.cpp Thu Dec 17 08:40:49 2009 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,678 +0,0 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies)..
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description:
-* Implementation of the widget listbox for WidgetManager
-*
-*/
-
-// INCLUDE FILES
-#include <coemain.h>
-#include <StringLoader.h>
-#include <aknstyluspopupmenu.h>
-#include <AknsDrawUtils.h>
-#include <AknsFrameBackgroundControlContext.h>
-#include <AknsListBoxBackgroundControlContext.h>
-
-#include <widgetmanagerview.rsg>
-#include <widgetmanager.mbg>
-#include "wmcommon.h"
-#include "wmplugin.h"
-#include "wmresourceloader.h"
-#include "wmlistbox.h"
-#include "wmwidgetdata.h"
-
-// CONSTANTS
-const TInt KFrameRoundRadius = 4;
-const TInt KFocusFrameWidth = 2;
-const TInt KLeftMarginBig = 5;
-const TInt KRightMargin = 1;
-const TInt KTopTextMargin = 2;
-const TInt KRightTextMargin = 3;
-const TInt KRightMarginBig = 5;
-const TInt KTopMargin = 1;
-const TInt KTopMarginBig = 5;
-const TInt KBottomMargin = 1;
-const TInt KBottomMarginBig = 5;
-const TInt KLogoWidth = 55;
-const TInt KLogoHeight = 55;
-
-// MEMBER FUNCTIONS
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::NewL
-// ---------------------------------------------------------
-//
-CWmListItemDrawer* CWmListItemDrawer::NewL(
- CWmPlugin& aWmPlugin,
- MTextListBoxModel* aTextListBoxModel,
- const CFont* aFont,
- CFormattedCellListBoxData* aFormattedCellData,
- CWmListBox* aListBox )
- {
- CWmListItemDrawer* self = new ( ELeave ) CWmListItemDrawer(
- aWmPlugin,
- aTextListBoxModel,
- aFont,
- aFormattedCellData,
- aListBox );
- CleanupStack::PushL(self);
- self->ConstructL();
- CleanupStack::Pop(self);
- return self;
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::CWmListItemDrawer
-// ---------------------------------------------------------
-//
-CWmListItemDrawer::CWmListItemDrawer(
- CWmPlugin& aWmPlugin,
- MTextListBoxModel* aTextListBoxModel,
- const CFont* aFont,
- CFormattedCellListBoxData* aFormattedCellData,
- CWmListBox* aListBox )
- : CFormattedCellListBoxItemDrawer( aTextListBoxModel,aFont,aFormattedCellData ),
- iWmPlugin( aWmPlugin )
- {
- iCellData = aFormattedCellData;
- iListBox = aListBox;
- iFont = aFont;
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::ConstructL
-// ---------------------------------------------------------
-//
-void CWmListItemDrawer::ConstructL()
- {
- SetSkinEnabledL( ETrue );
-
- AknsUtils::CreateIconL(
- AknsUtils::SkinInstance(),
- KAknsIIDQgnMenuHswidget,
- iDefaultLogoImage,
- iDefaultLogoImageMask,
- iWmPlugin.ResourceLoader().IconFilePath(),
- EMbmWidgetmanagerQgn_menu_hswidget,
- EMbmWidgetmanagerQgn_menu_hswidget_mask
- );
-
- AknsUtils::CreateIconL(
- AknsUtils::SkinInstance(),
- KAknsIIDQgnIndiWmAdd,
- iAddWidgetBtnImage,
- iAddWidgetBtnMask,
- iWmPlugin.ResourceLoader().IconFilePath(),
- EMbmWidgetmanagerAdd_widget_button,
- EMbmWidgetmanagerAdd_widget_button_mask
- );
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::~CWmListItemDrawer
-// ---------------------------------------------------------
-//
-CWmListItemDrawer::~CWmListItemDrawer()
- {
- iCellData = NULL;
- iListBox = NULL;
-
- // dispose icons
- delete iDefaultLogoImage;
- delete iDefaultLogoImageMask;
- delete iAddWidgetBtnImage;
- delete iAddWidgetBtnMask;
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::CalculateRectangles
-// ---------------------------------------------------------
-//
-void CWmListItemDrawer::CalculateRectangles( const TSize& aSize )
- {
- iCurrentSize = aSize;
-
- // LOGO RECT
- TSize logoSize = iListBox->LogoSize();
- TInt val = ( aSize.iHeight - KBottomMarginBig * 4 );
- TSize newSize( val, val );
- if ( logoSize != newSize ||
- logoSize.iHeight >= aSize.iHeight )
- {
- logoSize = newSize;
- }
- iRelativeLogoRect.SetRect(
- TPoint( KLeftMarginBig, KTopMarginBig ),
- TSize( logoSize ) );
-
- // ADD BUTTON RECT
- TInt btnWidth = ( aSize.iWidth / 7 );
- TInt btnHeight = ( aSize.iHeight / 3 );
- TPoint btnLocation(
- ( aSize.iWidth - KRightMarginBig - btnWidth ),
- ( aSize.iHeight / 2 - btnHeight / 2 ) );
- iRelativeAddButtonRect.SetRect( btnLocation, TSize( btnWidth, btnHeight ) );
-
- // TEXT RECT
- iRelativeTitleRect.SetRect(
- KLeftMarginBig + logoSize.iWidth + KRightMarginBig,
- KTopMargin,
- aSize.iWidth - KRightMargin - btnWidth - KRightMargin,
- aSize.iHeight - KBottomMargin - KBottomMargin );
-
- // RESIZE BITMAPS
- AknIconUtils::SetSize(
- iDefaultLogoImage, iRelativeLogoRect.Size(), EAspectRatioNotPreserved );
- AknIconUtils::SetSize(
- iDefaultLogoImageMask, iRelativeLogoRect.Size(), EAspectRatioNotPreserved );
- AknIconUtils::SetSize(
- iAddWidgetBtnImage, iRelativeAddButtonRect.Size(), EAspectRatioNotPreserved );
- AknIconUtils::SetSize(
- iAddWidgetBtnMask, iRelativeAddButtonRect.Size(), EAspectRatioNotPreserved );
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::DrawFrame
-// ---------------------------------------------------------
-//
-void CWmListItemDrawer::DrawFrame(
- const TRect& aOutterRect,
- const TRect& aInnerRect,
- const TAknsItemID& aID,
- const TAknsItemID& aCenterID ) const
- {
- CWindowGc& gc = *Gc();
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- AknsDrawUtils::DrawFrame( skin, gc, aOutterRect, aInnerRect,
- aID, aCenterID );
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::DrawItemRect
-// ---------------------------------------------------------
-//
-void CWmListItemDrawer::DrawItemRect(
- const TRect& aActualItemRect ) const
- {
- CWindowGc& gc = *Gc();
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- MAknsControlContext *cc = AknsDrawUtils::ControlContext( iListBox );
- AknsDrawUtils::Background( skin, cc, iListBox, gc, aActualItemRect );
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::DrawItem
-// ---------------------------------------------------------
-//
-void CWmListItemDrawer::DrawItem( TInt aItemIndex, TPoint aItemRectPos,
- TBool /*aItemIsSelected*/, TBool /*aItemIsCurrent*/,
- TBool /*aViewIsEmphasized*/, TBool /*aViewIsDimmed*/ ) const
- {
- TInt w = ItemWidthInPixels( aItemIndex );
- TInt h = iListBox->ItemHeight();
- CWmWidgetData& wData = iListBox->WidgetData( aItemIndex );
- if ( iCurrentSize != TSize(w,h) )
- {
- // re-calculate all rects
- // note: members are manipulated here, although this method is const!
- const_cast<CWmListItemDrawer&>(*this).CalculateRectangles( TSize(w,h) );
- wData.SetLogoSize( iRelativeLogoRect.Size() );
- }
-
- TInt selectedIndex = iListBox->CurrentItemIndex();
- TBool isInFocus = ( selectedIndex == aItemIndex );
- TBool listFocused = iListBox->IsFocused();
- TRect itemRect = TRect( aItemRectPos, TSize( w, h ) );
- TRect fullRect = TRect( aItemRectPos,
- TSize( iListBox->Rect().Width(), h ) );
-
- DrawItemRect( fullRect );
-
- TRect logoRect( iRelativeLogoRect );
- logoRect.Move( aItemRectPos );
- TRect addBtnRect( iRelativeAddButtonRect );
- addBtnRect.Move( aItemRectPos );
- TRect textRect( iRelativeTitleRect );
- textRect.Move( aItemRectPos );
-
- if ( isInFocus && listFocused )
- {
- TRect innerRect( itemRect );
- const TInt highlightOffset = 5;
- innerRect.Shrink( highlightOffset, highlightOffset );
- DrawFrame( itemRect, innerRect,
- iListBox->PressedDown() ?
- KAknsIIDQsnFrListPressed : KAknsIIDQsnFrList,
- KAknsIIDQsnFrListCenter );
- }
-
- // Get graphics context which is used for drawing.
- CWindowGc& gc = *Gc();
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
-
- // DRAW LOGO
- CFbsBitmap* bitmap = const_cast<CFbsBitmap*>(wData.LogoImage());
- CFbsBitmap* mask = const_cast<CFbsBitmap*>(wData.LogoImageMask());
- if ( !bitmap )
- {
- TRect bmpRect( TPoint(0,0), TSize( iDefaultLogoImage->SizeInPixels() ) );
- gc.BitBltMasked( logoRect.iTl, iDefaultLogoImage,
- bmpRect, iDefaultLogoImageMask, ETrue );
- }
- else
- {
- TRect bmpRect( TPoint(0,0), TSize( bitmap->SizeInPixels() ) );
- if ( bitmap && mask )
- {
- gc.BitBltMasked( logoRect.iTl, bitmap,
- bmpRect, mask, ETrue );
- }
- else
- {
- gc.BitBlt( logoRect.iTl, bitmap, bmpRect );
- }
- }
-
- TRgb textColor;
- TAknsQsnTextColorsIndex index = ( isInFocus && listFocused )?
- EAknsCIQsnTextColorsCG10 : EAknsCIQsnTextColorsCG6;
-
- AknsUtils::GetCachedColor(
- skin, textColor, KAknsIIDQsnTextColors, index );
-
- // DRAW TEXT
- gc.UseFont( iFont );
- gc.SetPenColor( textColor );
- gc.SetPenSize( TSize(2,2) );
-
- gc.DrawText( wData.Name(), textRect,
- ( KTopTextMargin + iFont->FontMaxHeight() ),
- CGraphicsContext::ELeft, KRightTextMargin );
-
- if ( wData.HsContentInfo().CanBeAdded() )
- {
- // DRAW ADD BUTTON
- gc.BitBltMasked( addBtnRect.iTl, iAddWidgetBtnImage,
- TRect( TPoint(0,0), iAddWidgetBtnImage->SizeInPixels() ),
- iAddWidgetBtnMask, ETrue );
-
- // DRAW BUTTON FOCUS
- if ( isInFocus && listFocused )
- {
- // draw focused frame around button if item is selected
- gc.SetPenStyle( CGraphicsContext::ESolidPen );
- gc.SetPenSize( TSize( KFocusFrameWidth, KFocusFrameWidth ) );
- //Draw the rounded rectangle
- gc.DrawRoundRect( addBtnRect, TSize( KFrameRoundRadius, KFrameRoundRadius ) );
- gc.SetBrushStyle( CGraphicsContext::ENullBrush );
- gc.SetPenStyle( CGraphicsContext::ENullPen );
- }
- }
-
- gc.SetPenSize(TSize(1,1));
-
- // DRAW DESCRIPTION TEXT
- HBufC* buf = wData.Description().Alloc();
- if ( buf )
- {
- TPtr bufPtr = buf->Des();
- bufPtr.Copy( wData.Description() );
- TextUtils::ClipToFit( bufPtr, *iFont, textRect.Width() );
- gc.DrawText( bufPtr, textRect,
- ( iFont->HeightInPixels() + textRect.Height()/2 ),
- CGraphicsContext::ELeft, KRightTextMargin );
- delete buf;
- }
-
- gc.DiscardFont();
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::DefaultLogoImage()
-// ---------------------------------------------------------
-//
-const CFbsBitmap* CWmListItemDrawer::DefaultLogoImage()
- {
- return iDefaultLogoImage;
- }
-
-// ---------------------------------------------------------
-// CWmListItemDrawer::DefaultLogoMask()
-// ---------------------------------------------------------
-//
-const CFbsBitmap* CWmListItemDrawer::DefaultLogoMask()
- {
- return iDefaultLogoImageMask;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::NewL
-// ---------------------------------------------------------
-//
-CWmListBox* CWmListBox::NewL(
- CWmPlugin& aWmPlugin,
- const TRect& aRect,
- const CCoeControl* aParent,
- TInt aFlags )
- {
- CWmListBox* self = new ( ELeave ) CWmListBox( aWmPlugin);
- CleanupStack::PushL( self );
- self->ConstructL( aRect, aParent, aFlags );
- CleanupStack::Pop( self );
- return self;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::CWmListBox
-// ---------------------------------------------------------
-//
-CWmListBox::CWmListBox( CWmPlugin& aWmPlugin ):
- CAknDouble2LargeStyleListBox(),
- iWmPlugin( aWmPlugin )
- {
- iFindPaneIsVisible = EFalse;
- iPressedDown = EFalse;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::~CWmListBox
-// ---------------------------------------------------------
-//
-CWmListBox::~CWmListBox()
- {
- iWidgetDatas.ResetAndDestroy();
- }
-
-// ---------------------------------------------------------
-// CWmListBox::ConstructL
-// ---------------------------------------------------------
-//
-void CWmListBox::ConstructL(
- const TRect& aRect,
- const CCoeControl* aParent,
- TInt aFlags )
- {
- CEikFormattedCellListBox::ConstructL( aParent, aFlags );
- SetContainerWindowL( *aParent );
-
- // set model point to the widgets array
- Model()->SetItemTextArray( &iWidgetDatas );
- Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
-
- SetRect( aRect );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::WidgetData
-// ---------------------------------------------------------
-//
-CWmWidgetData* CWmListBox::WidgetData()
- {
- TInt index = CurrentListBoxItemIndex();
- return (index>=0 ? iWidgetDatas[index] : NULL);
- }
-
-// ---------------------------------------------------------
-// CWmListBox::WidgetData
-// ---------------------------------------------------------
-//
-CWmWidgetData& CWmListBox::WidgetData( TInt aItemIndex )
- {
- return *iWidgetDatas[ RealIndex( aItemIndex ) ];
- }
-
-// ---------------------------------------------------------
-// CWmListBox::AddWidgetDataL
-// ---------------------------------------------------------
-//
-void CWmListBox::AddWidgetDataL( CWmWidgetData* aWidgetData )
- {
- aWidgetData->SetObserver( this );
- aWidgetData->SetLogoSize( LogoSize() );
- iWidgetDatas.InsertInOrderAllowRepeatsL( aWidgetData,
- SortOrder(EStoredOrder) );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::RemoveWidgetData
-// ---------------------------------------------------------
-//
-void CWmListBox::RemoveWidgetData( TInt aItemIndex )
- {
- TInt realIndex = RealIndex( aItemIndex );
- TBool current = ( aItemIndex == CurrentItemIndex() );
- // remove widget data
- CWmWidgetData* data = iWidgetDatas[realIndex];
- iWidgetDatas.Remove( realIndex );
- delete data;
-
- // reorganise
- TRAP_IGNORE(
- AknListBoxUtils::HandleItemRemovalAndPositionHighlightL(
- this, realIndex, current ) );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::RedrawItem
-// ---------------------------------------------------------
-//
-void CWmListBox::RedrawItem( TInt aItemIndex )
- {
- View()->DrawItem( aItemIndex );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::SetSortOrderL
-// ---------------------------------------------------------
-//
-void CWmListBox::SetSortOrderL( TSortOrder aOrder )
- {
- // now sort the existing data
- iWidgetDatas.Sort( SortOrder( aOrder ) );
- DrawNow();
- }
-
-// ---------------------------------------------------------
-// CWmListBox::CreateItemDrawerL
-// ---------------------------------------------------------
-//
-void CWmListBox::CreateItemDrawerL()
- {
- CFormattedCellListBoxData* cellData = CFormattedCellListBoxData::NewL();
- CleanupStack::PushL( cellData );
- iItemDrawer = CWmListItemDrawer::NewL(
- iWmPlugin,
- Model(),
- iEikonEnv->DenseFont(),
- cellData,
- this );
- CleanupStack::Pop(); // cellData
- }
-
-// ---------------------------------------------------------
-// CWmListBox::HandleLayoutChanged
-// ---------------------------------------------------------
-//
-void CWmListBox::HandleLayoutChanged()
- {
- TSize ls = LogoSize();
- for ( TInt i=0; i<iWidgetDatas.Count(); i++)
- {
- iWidgetDatas[i]->ReCreateLogo( ls );
- }
- }
-
-// ---------------------------------------------------------
-// CWmListBox::HandleWidgetDataChanged
-// ---------------------------------------------------------
-//
-void CWmListBox::HandleWidgetDataChanged( CWmWidgetData* aWidgetData )
- {
- if ( !iFindPaneIsVisible )
- {
- // spontaneous change in the model. Cause table to redraw
- TInt index = iWidgetDatas.Find( aWidgetData );
- if ( index >= 0 )
- {
- // redraw item.
- RedrawItem( RealIndex( index ) );
- }
- }
- }
-
-// ---------------------------------------------------------
-// CWmListBox::SortOrder
-// ---------------------------------------------------------
-//
-TLinearOrder<CWmWidgetData> CWmListBox::SortOrder( TSortOrder aOrder )
- {
- if ( aOrder == EStoredOrder )
- {
- return TLinearOrder<CWmWidgetData>(
- CWmWidgetData::CompareByPersistentWidgetOrder );
- }
- else
- {
- return TLinearOrder<CWmWidgetData>(
- CWmWidgetData::CompareByName );
- }
- }
-
-// ---------------------------------------------------------
-// CWmListBox::CurrentListBoxItemIndex
-// ---------------------------------------------------------
-//
-TInt CWmListBox::CurrentListBoxItemIndex()
- {
- TInt index( KErrNotFound );
- if ( Model()->NumberOfItems() > 0 )
- {
- index = CurrentItemIndex();
- }
- return RealIndex( index );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::RealIndex
-// ---------------------------------------------------------
-//
-TInt CWmListBox::RealIndex( TInt aIndex )
- {
- TInt realIndex = aIndex;
- if ( iFindPaneIsVisible && aIndex >= 0 )
- {
- realIndex = static_cast<CAknFilteredTextListBoxModel*>(Model())->Filter()
- ->FilteredItemIndex( aIndex );
- }
- return realIndex;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::SizeChanged
-// ---------------------------------------------------------
-//
-void CWmListBox::SizeChanged()
- {
- CAknsListBoxBackgroundControlContext* context =
- static_cast<CAknsListBoxBackgroundControlContext*>(
- ItemDrawer()->FormattedCellData()->
- SkinBackgroundContext() );
- if ( context ) context->SetRect( Rect() );
- CAknDouble2LargeStyleListBox::SizeChanged();
- }
-
-// ---------------------------------------------------------
-// CWmListBox::Draw
-// ---------------------------------------------------------
-//
-void CWmListBox::Draw( const TRect& aRect ) const
- {
- CWindowGc& gc = SystemGc();
- MAknsSkinInstance* skin = AknsUtils::SkinInstance();
- MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
- AknsDrawUtils::Background( skin, cc, this, gc, Rect() );
- CAknDouble2LargeStyleListBox::Draw( aRect );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::HandlePointerEventL
-// ---------------------------------------------------------
-//
-void CWmListBox::HandlePointerEventL( const TPointerEvent& aPointerEvent )
- {
- // Check if pointer is down ( needed for drawing correct hightlight frame )
- if ( Rect().Contains( aPointerEvent.iPosition ) )
- {
- if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
- {
- iPressedDown = ETrue;
- RedrawItem( CurrentListBoxItemIndex() );
- }
- else if( aPointerEvent.iType == TPointerEvent::EButton1Up )
- {
- iPressedDown = EFalse;
- RedrawItem( CurrentListBoxItemIndex() );
- }
- }
-
- CAknDouble2LargeStyleListBox::HandlePointerEventL( aPointerEvent );
- }
-
-// ---------------------------------------------------------
-// CWmListBox::LogoSize
-// ---------------------------------------------------------
-//
-TSize CWmListBox::LogoSize()
- {
- TSize size( KLogoWidth,KLogoHeight );
- TInt val = ( ItemHeight() - KBottomMarginBig * 4 );
- if ( val > 0 )
- {
- size.SetSize( val, val );
- }
- return size;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::DefaultLogo
-// ---------------------------------------------------------
-//
-const CFbsBitmap* CWmListBox::DefaultLogo()
- {
- CWmListItemDrawer* itemDrawer =
- static_cast <CWmListItemDrawer*>( iItemDrawer );
- if ( itemDrawer )
- {
- return itemDrawer->DefaultLogoImage();
- }
- return NULL;
- }
-
-// ---------------------------------------------------------
-// CWmListBox::DefaultMask
-// ---------------------------------------------------------
-//
-const CFbsBitmap* CWmListBox::DefaultMask()
- {
- CWmListItemDrawer* itemDrawer =
- static_cast <CWmListItemDrawer*>( iItemDrawer );
- if ( itemDrawer )
- {
- return itemDrawer->DefaultLogoMask();
- }
- return NULL;
- }
-
-// End of File
-