diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/eikslb.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/eikslb.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,394 @@ +/* +* Copyright (c) 2002 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: +* +*/ + + +#include +#include +#include +#include +#include +#include "eikslbProt.h" +#include "eikslbProtFactory.h" +#include +#include + +#include +#ifdef RD_UI_TRANSITION_EFFECTS_LIST +#include +#include +#endif + +#include "akntrace.h" +// +// settings itemdrawer +// + +EXPORT_C CSettingsListBoxItemDrawer::CSettingsListBoxItemDrawer( MTextListBoxModel* aTextListBoxModel, + const CFont* aFont, + CSettingsListBoxData* aSettingsData) + : CFormattedCellListBoxItemDrawer( aTextListBoxModel, aFont, aSettingsData ) + { + } + +EXPORT_C CSettingsListBoxItemDrawer::~CSettingsListBoxItemDrawer() + { + } + +EXPORT_C CSettingsListBoxData* CSettingsListBoxItemDrawer::SettingsData() const + { + return STATIC_CAST(CSettingsListBoxData*,iData); + } + +EXPORT_C void CSettingsListBoxItemDrawer::DrawItemText( TInt aItemIndex, + const TRect& aItemTextRect, + TBool aItemIsCurrent, + TBool /*aViewIsEmphasized*/, + TBool /*aItemIsSelected*/) const + { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE("DrawItemText: aItemIndex=%d, aItemTextRect=(%d,%d,%d,%d), aItemIsCurrent=%d", + aItemIndex, aItemTextRect.iTl.iX, aItemTextRect.iTl.iY, aItemTextRect.iBr.iX, + aItemTextRect.iBr.iY, aItemIsCurrent); +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + MAknListBoxTfxInternal* transApi = CAknListLoader::TfxApiInternal( iGc ); + if ( transApi ) + { + transApi->StartDrawing( MAknListBoxTfxInternal::EListNotSpecified ); + } +#endif //RD_UI_TRANSITION_EFFECTS_LIST + iGc->SetBrushColor( AKN_LAF_COLOR( 0 ) ); +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + if ( transApi ) + { + transApi->StopDrawing(); + } +#endif //RD_UI_TRANSITION_EFFECTS_LIST + + DrawBackgroundAndSeparatorLines( aItemTextRect ); + + if ( aItemIsCurrent ) + { + FormattedCellData()->SetCurrentItemIndex( aItemIndex ); + } + + FormattedCellData()->SetCurrentlyDrawnItemIndex( aItemIndex ); + + FormattedCellData()->DrawSettingHighlight( *iGc, aItemTextRect, aItemIsCurrent ); + + TBool drawBackground = ETrue; + TPtrC temp = iModel->ItemText( aItemIndex ); + TPtrC columnText; + + TextUtils::ColumnText( columnText, 3, &temp ); + + if ( columnText == KNullDesC ) + { + drawBackground = EFalse; + } + +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + if ( transApi ) + { + transApi->StartDrawing( MAknListBoxTfxInternal::EListItem ); + iGc->SetClippingRect( iViewRect ); + } +#endif // RD_UI_TRANSITION_EFFECTS_LIST + + // draw setting item's background + if ( drawBackground ) + { + TAknLayoutRect outerRect; + TAknWindowComponentLayout valuePane; +#ifdef RD_LIST_STRETCH + if ( Layout_Meta_Data::IsLandscapeOrientation() && + Layout_Meta_Data::IsListStretchingEnabled() && + FormattedCellData()->StretchingEnabled() ) + { + valuePane = AknLayoutScalable_Avkon::set_value_pane_cp_vc( 0 ); + } + else +#endif // RD_LIST_STRETCH + { + valuePane = AknLayoutScalable_Avkon::set_value_pane_cp( 0 ); + } + + outerRect.LayoutRect( aItemTextRect, TAknWindowComponentLayout::Compose( + valuePane, + AknLayoutScalable_Avkon::bg_set_opt_pane( 0 ) ).LayoutLine() ); + + TBool frameDrawn = EFalse; + MAknsControlContext *cc = AknsDrawUtils::ControlContext( FormattedCellData()->Control() ); + + if ( !cc ) + { + cc = FormattedCellData()->SkinBackgroundContext(); + } + + if ( cc ) + { + TAknLayoutRect innerRect; + innerRect.LayoutRect( aItemTextRect, TAknWindowComponentLayout::Compose( + valuePane, + AknLayoutScalable_Avkon::bg_set_opt_pane_g1() ).LayoutLine() ); + + frameDrawn = AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), + *iGc, + outerRect.Rect(), + innerRect.Rect(), + KAknsIIDQsnFrSetOptFoc, + KAknsIIDQsnFrSetOptFocCenter ); + } + + if ( !frameDrawn ) + { + iGc->SetBrushColor( AKN_LAF_COLOR( 243 ) ); + iGc->Clear( outerRect.Rect() ); + } + } + + SetupGc( aItemIndex ); + + CFormattedCellListBoxData::TColors colors; + + TBufC target; + + // Try to allocate buffer dynamically. If out of memory, use the fixed size stack buffer. + // This size should be sufficient. + TInt size = temp.Length() * 2; + HBufC* buffer = NULL; + + if ( size > KMaxTotalDataLength ) + { + buffer = HBufC::New( size ); + } + + TPtr des = ( buffer ? buffer->Des() : target.Des() ); + TDesC* targetptr = &temp; + + if ( columnText == KNullDesC ) + { +#ifdef RD_LIST_STRETCH + // If list stretching is used and the device is in landscape orientation + // there is only one text cell available. Therefore, word wrapping + // cannot be done. Instead the first text cell must be omitted and the + // possible text moved to the second cell. If both text cells contain + // data they are combined and the data is moved to the second cell (i.e. + // the first cell is never drawn in landscape if list stretching is + // turned on). + if ( Layout_Meta_Data::IsLandscapeOrientation() && + Layout_Meta_Data::IsListStretchingEnabled() && + FormattedCellData()->StretchingEnabled() ) + { + TBool swapCells = ETrue; + TPtrC itemText; + + // check if cell swapping should be done at all + for ( TInt i = 2; i <= 4; ++i ) + { + if ( TextUtils::ColumnText( itemText, i, targetptr ) == KErrNotFound ) + { + break; + } + + if ( itemText != KNullDesC ) + { + swapCells = EFalse; + break; + } + } + + TextUtils::ColumnText( itemText, 1, targetptr ); + + if ( swapCells && itemText.Length() > 0 ) + { + TPtrC secondaryText; + TextUtils::ColumnText( secondaryText, 5, targetptr ); + + // remove text from the first text cell + AknLAFUtils::ReplaceColumn( des, targetptr, (TDesC16*)&KNullDesC, KColumnListSeparator, 1 ); + + // ReplaceColumn does not update descriptor's length :( + des.Set( buffer ? buffer->Des() : target.Des() ); + + TInt secondaryPos = 0; + TPtrC temp; + temp.Set( des ); + + // add separators if needed + for ( TInt i = 0; i < 5; ++i ) + { + TInt position = temp.Locate( KColumnListSeparator ); + + if ( position != KErrNotFound ) + { + if ( position < temp.Length() ) + { + ++position; + } + + secondaryPos += position; + } + else + { + des.Append( KColumnListSeparator ); + secondaryPos = des.Length(); + } + + temp.Set( des.Mid( secondaryPos ) ); + } + + des.Insert( secondaryPos, itemText ); + + if ( secondaryText != KNullDesC ) + { + _LIT( KEmptySpace, " " ); + des.Insert( secondaryPos + itemText.Length(), KEmptySpace ); + } + + targetptr = &des; + } + } + else + { + WordWrapListItem( des, *targetptr, 1, 5, aItemIndex ); + // Set again because ReplaceColumn in WordWrapListItem does not update the length to 'des' ! + des.Set( buffer ? buffer->Des() : target.Des() ); + targetptr = &des; + } +#else + WordWrapListItem( des, temp, 1, 5, aItemIndex ); + // Set again because ReplaceColumn in WordWrapListItem does not update the length to 'des' ! + des.Set( buffer ? buffer->Des() : target.Des() ); + targetptr = &des; +#endif // RD_LIST_STRETCH + } + +#ifdef RD_UI_TRANSITION_EFFECTS_LIST + if ( transApi ) + { + iGc->CancelClippingRect(); + transApi->StopDrawing(); + } +#endif // RD_UI_TRANSITION_EFFECTS_LIST + + if (FormattedCellData()->IsMarqueeOn() && + FormattedCellData()->CurrentMarqueeItemIndex() != aItemIndex && + aItemIsCurrent) + { + FormattedCellData()->ResetMarquee(); + FormattedCellData()->SetCurrentMarqueeItemIndex(aItemIndex); + } + + SettingsData()->Draw( Properties( aItemIndex ), + *iGc, + targetptr, + aItemTextRect, + aItemIsCurrent, + colors ); + + delete buffer; + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C void CSettingsListBoxItemDrawer::CFormattedCellListBoxItemDrawer_Reserved() + { + } + +// +// Settings listbox +// +EXPORT_C CEikSettingsListBox::CEikSettingsListBox() + { + _AKNTRACE_FUNC_ENTER; + AKNTASHOOK_ADD( this, "CEikSettingsListBox" ); + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C CSettingsListBoxItemDrawer* CEikSettingsListBox::ItemDrawer() const + { + return(CSettingsListBoxItemDrawer*)iItemDrawer; + } + +EXPORT_C void CEikSettingsListBox::CreateItemDrawerL() + { + _AKNTRACE_FUNC_ENTER; + CSettingsListBoxData* cellData=CSettingsListBoxData::NewL(); + CleanupStack::PushL( cellData ); + + if ( FeatureManager::FeatureSupported( KFeatureIdSettingsProtection ) ) + { + iItemDrawer = SettingsProtListBoxItemDrawerFactory:: + CreateSettingsProtListBoxItemDrawerL( + Model(), + CEikonEnv::Static()->NormalFont(), + cellData, + this ); + } + else + { + iItemDrawer = new ( ELeave ) CSettingsListBoxItemDrawer( + Model(), CEikonEnv::Static()->NormalFont(), cellData ); + } + + CleanupStack::Pop(); + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C CListBoxView* CEikSettingsListBox::MakeViewClassInstanceL() + { + return new ( ELeave )CSettingsListBoxView; + } + +#define ITEM_EXISTS_ONCE(x) (((x) > -1) && ((x) < iModel->NumberOfItems())) + +EXPORT_C void CEikSettingsListBox::HandlePointerEventL(const TPointerEvent& aPointerEvent) + { + _AKNTRACE_FUNC_ENTER; + CEikFormattedCellListBox::HandlePointerEventL(aPointerEvent); + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C void* CEikSettingsListBox::ExtensionInterface( TUid /*aInterface*/ ) + { + return NULL; + } + +EXPORT_C void CEikSettingsListBox::CEikListBox_Reserved() + { + } + +EXPORT_C void CSettingsListBoxView::Draw(const TRect* clipRect) const + { + _AKNTRACE_FUNC_ENTER; + CFormattedCellListBoxView::Draw( clipRect ); + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C void CSettingsListBoxView::DrawItem( TInt aItemIndex ) const + { + _AKNTRACE_FUNC_ENTER; + _AKNTRACE("DrawItem: aItemIndex=%d",aItemIndex); + CListBoxView::DrawItem( aItemIndex ); + _AKNTRACE_FUNC_EXIT; + } + +EXPORT_C TAny* CSettingsListBoxView::Reserved_1() + { + return NULL; + } + +// End of File