--- /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 <peninputlayoutchoicelist.h>
+#include <peninputlayout.h>
+#include <AknIconUtils.h>
+#include <AknLayoutDef.h>
+#include <AknsDrawUtils.h>
+#include <AknUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <barsread.h>
+#include <AknsUtils.h>
+#include <bautils.h>
+#include <AknFepGlobalEnums.h>
+#include <peninputcommonchoicelist.h>
+
+
+#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<TInt>(this),ETouchFeedbackBasicButton);
+ }
+ else
+ {
+ SetTactileFeedbackType(ETouchFeedbackSensitiveInput);
+ aUiLayout->ChangeFeedbackType(reinterpret_cast<TInt>(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<CFbsBitGc*>(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<CFbsBitGc*>(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