diff -r 000000000000 -r f72a12da539e widgetmanager/src/wmlistbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgetmanager/src/wmlistbox.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,678 @@ +/* +* 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 +#include +#include +#include +#include +#include + +#include +#include +#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(*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(wData.LogoImage()); + CFbsBitmap* mask = const_cast(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; iReCreateLogo( 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 CWmListBox::SortOrder( TSortOrder aOrder ) + { + if ( aOrder == EStoredOrder ) + { + return TLinearOrder( + CWmWidgetData::CompareByPersistentWidgetOrder ); + } + else + { + return TLinearOrder( + 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(Model())->Filter() + ->FilteredItemIndex( aIndex ); + } + return realIndex; + } + +// --------------------------------------------------------- +// CWmListBox::SizeChanged +// --------------------------------------------------------- +// +void CWmListBox::SizeChanged() + { + CAknsListBoxBackgroundControlContext* context = + static_cast( + 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 ( iItemDrawer ); + if ( itemDrawer ) + { + return itemDrawer->DefaultLogoImage(); + } + return NULL; + } + +// --------------------------------------------------------- +// CWmListBox::DefaultMask +// --------------------------------------------------------- +// +const CFbsBitmap* CWmListBox::DefaultMask() + { + CWmListItemDrawer* itemDrawer = + static_cast ( iItemDrawer ); + if ( itemDrawer ) + { + return itemDrawer->DefaultLogoMask(); + } + return NULL; + } + +// End of File +