uifw/AvKon/src/eikslb.cpp
changeset 0 2f259fa3e83a
child 3 8ca85d2f0db7
--- /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 <eikslb.h>
+#include <eikfrlb.h>
+#include <eikslbd.h>
+#include <AknUtils.h>
+#include <featmgr.h>
+#include "eikslbProt.h"
+#include "eikslbProtFactory.h"
+#include <layoutmetadata.cdl.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+
+#include <AknTasHook.h>
+#ifdef RD_UI_TRANSITION_EFFECTS_LIST
+#include <aknlistloadertfx.h>
+#include <aknlistboxtfxinternal.h>
+#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<KMaxTotalDataLength> 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