diff -r 000000000000 -r eb1f2e154e89 textinput/peninputcommonctrls/src/peninputselectionlist/peninputcommonchoicelist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textinput/peninputcommonctrls/src/peninputselectionlist/peninputcommonchoicelist.cpp Tue Feb 02 01:02:04 2010 +0200 @@ -0,0 +1,324 @@ +/* +* Copyright (c) 2002-2005 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: Implement of touch input mode switch +* +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define MIN_WORD_LENGTH 200 //temperarily added. +const TInt KExtraMargine = 10; +// --------------------------------------------------------------------------- +// C++ constructor. +// --------------------------------------------------------------------------- +// +EXPORT_C CPeninputCommonChoiceList:: + CPeninputCommonChoiceList( CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aItemSkinID, + TAknsItemID aBackgroundSkinID, + ECommonChoiceListStyle aListStyle ) +: CFepLayoutChoiceList( aUiLayout, aControlId ) + { + iItemSkinID = aItemSkinID; + iBackgroundSkinID = aBackgroundSkinID; + iListStyle = aListStyle; +#ifdef RD_TACTILE_FEEDBACK + //Advanced Tactile feedback REQ417-47932 + if(aUiLayout) + { + if (aUiLayout->PenInputType() == EPluginInputModeFSQ|| + aUiLayout->PenInputType() == EPluginInputModeVkb) + { + SetTactileFeedbackType(ETouchFeedbackBasicButton); + aUiLayout->ChangeFeedbackType(reinterpret_cast(this),ETouchFeedbackBasicButton); + } + else + { + SetTactileFeedbackType(ETouchFeedbackSensitiveInput); + aUiLayout->ChangeFeedbackType(reinterpret_cast(this),ETouchFeedbackSensitiveInput); + } + } +#endif //RD_TACTILE_FEEDBACK + } + +// --------------------------------------------------------------------------- +// Symbian Constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CPeninputCommonChoiceList* CPeninputCommonChoiceList:: + NewL( CFepUiLayout* aUiLayout, + TInt aControlId, + TAknsItemID aItemSkinID, + TAknsItemID aBackgroundSkinID, + ECommonChoiceListStyle aListStyle ) + { + CPeninputCommonChoiceList *self = new (ELeave) + CPeninputCommonChoiceList( aUiLayout, + aControlId, + aItemSkinID, + aBackgroundSkinID, + aListStyle ); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +EXPORT_C CPeninputCommonChoiceList::~CPeninputCommonChoiceList() + { + iItemRects.Close(); + } + +EXPORT_C void CPeninputCommonChoiceList::AddItemRectL( const TRect& aRect ) + { + iItemRects.AppendL( aRect ); + } + +EXPORT_C void CPeninputCommonChoiceList::RemoveAllItemsRect() + { + iItemRects.Reset(); + } + +EXPORT_C void CPeninputCommonChoiceList:: + SetTextLayout( const TAknTextLineLayout& aTextLayout ) + { + iTextLayout = aTextLayout; + } + +TInt CPeninputCommonChoiceList::MaxWidthOfListItem() + { + if( iTextLayout.FontId() == 0 ) + return 0; + + TInt maxLength = 0; + const CFont* font = AknLayoutUtils::FontFromId(iTextLayout.FontId(), NULL); + ASSERT( font ); + + for( TInt i = 0; i < ItemsCount(); i++ ) + { + TInt length = font->TextWidthInPixels( ItemByIndex(i)->iText ); + maxLength = length > maxLength ? length : maxLength; + } + maxLength = maxLength > MIN_WORD_LENGTH ? maxLength : MIN_WORD_LENGTH; + return maxLength; + } + +EXPORT_C void CPeninputCommonChoiceList::ReCalcLayout() + { + if( iItemRects.Count() == 0 ) + { + return; + } + + if( iListStyle == EAutoFitLength ) + { + TInt itemLength = MaxWidthOfListItem() + iTextLayout.il + iTextLayout.ir; + TInt offsetLength = 0; + offsetLength = Rect().Width() - iItemRects[0].Width(); + + if( itemLength + offsetLength + KExtraMargine > UiLayout()->Rect().Width() ) + { + itemLength = UiLayout()->Rect().Width() - KExtraMargine - offsetLength; + } + TRect rect; + for( TInt i = 0; i < iItemRects.Count(); i++ ) + { + rect = iItemRects[i]; + offsetLength = itemLength - rect.Width(); + rect.SetRect(rect.iTl, TSize( itemLength, rect.Height() ) ); + iItemRects[i] = rect; + } + rect = Rect(); + rect.Resize( offsetLength, 0 ); + SetRect( rect ); + } + } + +EXPORT_C void CPeninputCommonChoiceList::Draw() + { + if(!AbleToDraw()) + return; + + DrawBackground(); + + //draw Item + for(int ii = 0; ii < ItemsCount(); ++ii) + { + DrawItem(ii, CurrentFocusedIndex() == ii); + } + } + +void CPeninputCommonChoiceList::DrawBackground() + { + DrawOpaqueMaskBackground( Rect() ); + if( iBackgroundSkinID.iMajor != EAknsMajorNone && + iBackgroundSkinID.iMinor != EAknsMinorNone ) + { + TRect rtInnerRect( Rect() ); + rtInnerRect.Shrink( 1, 1 ); + CFbsBitGc* gc = static_cast(BitGc()); + + gc->Activate( BitmapDevice() ); + gc->SetBrushColor( KRgbWhite ); + gc->Clear( Rect() ); + AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), + *gc, + Rect(), + rtInnerRect, + iBackgroundSkinID, + KAknsIIDDefault ); + } + } + +void CPeninputCommonChoiceList::DrawItem( TInt aIndex, TBool aIsFocus ) + { + TRect rtFocusRect(iItemRects[aIndex]); + rtFocusRect.Move( Rect().iTl ); + + if( aIsFocus ) + { + //draw focus bitmap + TRect rtInnerRect( rtFocusRect ); + rtInnerRect.Shrink( 7, 7 ); + + if( iItemSkinID.iMajor != EAknsMajorNone && + iItemSkinID.iMinor != EAknsMinorNone) + { + CFbsBitGc* gc = static_cast(BitGc()); + gc->Activate( BitmapDevice() ); + AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), + *gc, + rtFocusRect, + rtInnerRect, + iItemSkinID, + KAknsIIDDefault ); + } + + } + + // draw text + TAknLayoutText textLayout; + textLayout.LayoutText(rtFocusRect, iTextLayout); + TRgb color( KRgbBlack ); // sane default for nonskinned case + TAknsQsnTextColorsIndex clrIndex; + clrIndex = aIsFocus ? EAknsCIQsnTextColorsCG10 : EAknsCIQsnTextColorsCG20; + + if ( AknsUtils::AvkonSkinEnabled() ) + { + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + color, KAknsIIDQsnTextColors, clrIndex ); + } + + textLayout.DrawText(*BitGc(), ItemByIndex(aIndex)->iText, ETrue, color); + } + +EXPORT_C void CPeninputCommonChoiceList::SetListColumnNumWithLafL( TInt aMaxCount) + { + if( iLastColumnNum == aMaxCount ) + return; + + iLastColumnNum = aMaxCount; + RemoveAllItemsRect(); + + TAknWindowLineLayout appWnd = AknLayoutScalable_Avkon::application_window(0).LayoutLine(); + TAknWindowLineLayout mainPane = AknLayoutScalable_Avkon::main_pane(4).LayoutLine(); + TAknLayoutRect mainPaneRect; + mainPaneRect.LayoutRect(appWnd.Rect(), mainPane); + + TAknWindowLineLayout menuWnd = AknLayoutScalable_Avkon:: + popup_menu_window(13).LayoutLine(); + TAknWindowLineLayout choiceWnd = AknLayoutScalable_Avkon:: + popup_submenu_window(aMaxCount - 1).LayoutLine(); + TAknLayoutRect choiceRect; + choiceRect.LayoutRect(mainPaneRect.Rect(), choiceWnd); + + TRect rectChoiseList( 0, 0 , + choiceRect.Rect().Width(), + choiceRect.Rect().Height()); + // set list window rect + SetRect( rectChoiseList ); + + TAknWindowLineLayout listPopupPane = AknLayoutScalable_Avkon:: + listscroll_popup_sub_pane(0).LayoutLine(); + TAknLayoutRect listPopupPaneRect; + listPopupPaneRect.LayoutRect(rectChoiseList, listPopupPane); + TAknWindowLineLayout listSubMenuPane = AknLayoutScalable_Avkon:: + list_submenu_pane(1).LayoutLine(); + TAknLayoutRect listSubMenuPaneRect; + listSubMenuPaneRect.LayoutRect(listPopupPaneRect.Rect(), listSubMenuPane); + + TAknWindowLineLayout listSinglePane; + TAknLayoutRect listSinglePaneRect; + + // set list item rect + for( TInt i = 0; i < aMaxCount; i++ ) + { + listSinglePane = AknLayoutScalable_Avkon:: + list_single_popup_submenu_pane(i, 0, 0).LayoutLine(); + listSinglePaneRect.LayoutRect( listSubMenuPaneRect.Rect(), listSinglePane ); + iItemRects.AppendL(listSinglePaneRect.Rect()); + } + + // set list text layout + SetTextLayout(AknLayoutScalable_Avkon::list_single_popup_submenu_pane_t1(0).LayoutLine()); + } + +EXPORT_C void CPeninputCommonChoiceList::SetListSkinID( TAknsItemID aItemSkinID, + TAknsItemID aBackgroundSkinID ) + { + iItemSkinID = aItemSkinID; + iBackgroundSkinID = aBackgroundSkinID; + } +EXPORT_C TInt CPeninputCommonChoiceList::HitTest(const TPoint& aPoint) + { + TPoint pPoint(aPoint.iX - Rect().iTl.iX,aPoint.iY - Rect().iTl.iY); + TInt arrayCount = iItemRects.Count(); + TInt index = arrayCount; + for(TInt i = 0; i < arrayCount; i++) + { + if(iItemRects[i].Contains(pPoint)) + { + index = i; + } + } + if( index >= arrayCount ) + { + return EListOutside; + } + else + { + return index; + } + } +// End Of File