iaupdate/IAD/ui/src/iaupdatehistorycontainer.cpp
branchRCL_3
changeset 26 8b7f4e561641
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iaupdate/IAD/ui/src/iaupdatehistorycontainer.cpp	Wed Sep 01 12:22:02 2010 +0100
@@ -0,0 +1,505 @@
+/*
+* Copyright (c) 2007-2010 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:   This module contains the implementation of 
+*                CIAUpdateHistoryContainer class member functions.
+*
+*/
+
+
+
+
+#include <coemain.h>
+#include <aknlists.h> // For the listbox
+#include <barsread.h> // TResourceReader
+#include <avkon.mbg>
+#include <AknIconArray.h> 
+#include <gulicon.h>
+#include <AknsUtils.h>
+#include <StringLoader.h> 
+#include <e32std.h>
+#include <data_caging_path_literals.hrh>
+#include <iaupdate.rsg>
+#include <iaupdate.mbg>
+
+#include "iaupdatehistorycontainer.h"
+#include "iaupdatehistory.h"
+#include "iaupdatehistoryitem.h"
+#include "iaupdateutils.h"
+
+
+// MACROS
+_LIT(KIAUpdateIconFileName, "IAUpdate.mif");
+// Format for TTime
+// See: C++ API reference » Date and Time Handling » Using TTime 
+_LIT( KDateFormat, "%*D%*M%Y%/0%4%/1%5" );
+_LIT( KTimeFormat, "%-B%:0%J%:1%T%+B" );
+_LIT( KIconIndexFormat, "%d" );
+_LIT( KTabulator, "\t" );
+
+//CONSTANTS
+// Item list granularity
+const TInt KListGranularity( 8 );
+// There will be two images. One for error and for success.
+const TInt KListIconGranularity( 2 );
+const TInt KTimeLength( 48 );
+// Icon index length is always one because an index is either zero or one
+const TInt iconIndexLength( 1 );
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CIAUpdateHistoryContainer* CIAUpdateHistoryContainer::NewL( const TRect& aRect )
+    {
+    CIAUpdateHistoryContainer* self = 
+        CIAUpdateHistoryContainer::NewLC( aRect );
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::NewLC
+// 
+// -----------------------------------------------------------------------------
+//
+CIAUpdateHistoryContainer* CIAUpdateHistoryContainer::NewLC( const TRect& aRect )
+    {
+    CIAUpdateHistoryContainer* self = 
+        new (ELeave) CIAUpdateHistoryContainer();
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::CIAUpdateHistoryContainer
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CIAUpdateHistoryContainer::CIAUpdateHistoryContainer() 
+: CCoeControl()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::~CIAUpdateHistoryContainer
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CIAUpdateHistoryContainer::~CIAUpdateHistoryContainer()
+    {
+    delete iListBox;
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateHistoryContainer::ConstructL( const TRect& aRect )
+    {
+    // Create a window for this application view
+    CreateWindowL();
+
+    // Create list box
+    iListBox = new( ELeave ) CAknDoubleGraphicStyleListBox();
+    iListBox->SetContainerWindowL( *this );
+    
+    TResourceReader reader;
+    // Inserts reader into the cleanupstack.
+    iEikonEnv->CreateResourceReaderLC( reader, R_IAUPDATE_HISTORY_LIST );
+    iListBox->ConstructFromResourceL( reader );
+    CleanupStack::PopAndDestroy();
+
+    iListBox->EnableStretching( EFalse );
+    iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+    // Setup scroll bars
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->
+        ScrollBarFrame()->
+            SetScrollBarVisibilityL( 
+                CEikScrollBarFrame::EOff, 
+                CEikScrollBarFrame::EOff );    
+    // Create item text array
+    iItemTextArray = new( ELeave ) CDesCArrayFlat( KListGranularity );    
+    iListBox->Model()->SetItemTextArray( iItemTextArray );
+    // Ownership of the array is transferred.
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+        
+    HBufC* text = StringLoader::LoadLC( R_IAUPDATE_NO_UPDATES_DONE );    
+    iListBox->View()->SetListEmptyTextL( *text );
+    CleanupStack::PopAndDestroy( text );
+
+    // Create icon array
+    
+    CFbsBitmap* bitmap( NULL );
+    CFbsBitmap* mask( NULL );
+
+    CArrayPtr<CGulIcon>* iconArray = 
+        new( ELeave ) CAknIconArray( KListIconGranularity );    
+    CleanupStack::PushL( iconArray );
+    
+    HBufC* iconFilePath = HBufC::NewLC( KDC_APP_BITMAP_DIR().Length() + 
+                                        KIAUpdateIconFileName().Length() );
+    TPtr ptr = iconFilePath->Des();
+    ptr.Append( KDC_APP_BITMAP_DIR );
+    ptr.Append( KIAUpdateIconFileName );
+    
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    
+        
+    // This method puts both aBitmap and aMask in the cleanup stack.
+    AknsUtils::CreateIconLC(
+        skin,
+        KAknsIIDQgnPropCaleAccepted,
+        bitmap, 
+        mask, 
+        *iconFilePath, 
+        EMbmIaupdateQgn_prop_cale_accepted, 
+        EMbmIaupdateQgn_prop_cale_accepted_mask );
+    CGulIcon* icon = CGulIcon::NewLC();
+    icon->SetBitmap( bitmap );
+    icon->SetMask( mask );
+    icon->SetBitmapsOwnedExternally( EFalse );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+    CleanupStack::Pop( mask );
+    CleanupStack::Pop( bitmap );
+
+    // This method puts both aBitmap and aMask in the cleanup stack.
+    AknsUtils::CreateIconLC(
+        skin,
+        KAknsIIDQgnPropSwupdFailed,
+        bitmap, 
+        mask, 
+        *iconFilePath, 
+        EMbmIaupdateQgn_prop_swupd_failed, 
+        EMbmIaupdateQgn_prop_swupd_failed_mask);
+    icon = CGulIcon::NewLC();
+    icon->SetBitmap( bitmap );
+    icon->SetMask( mask );
+    icon->SetBitmapsOwnedExternally( EFalse );
+    iconArray->AppendL( icon );
+    CleanupStack::Pop( icon );
+    CleanupStack::Pop( mask );
+    CleanupStack::Pop( bitmap );
+    
+    CleanupStack::PopAndDestroy( iconFilePath );    
+    CleanupStack::Pop( iconArray );
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconArray );
+
+    // Set the windows size
+    SetRect( aRect );
+
+    // Activate the window, which makes it ready to be drawn
+    ActivateL();
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::RefreshL
+// 
+// -----------------------------------------------------------------------------
+//    
+void CIAUpdateHistoryContainer::RefreshL( MIAUpdateHistory& aHistory )
+    {
+    iItemTextArray->Reset();
+    
+    MIAUpdateHistoryItem* item( NULL ); 
+    const RPointerArray< MIAUpdateHistoryItem >& items =
+        aHistory.Items();
+    TInt iconIndex( 0 );
+    for( TInt i = 0; i < items.Count(); ++i ) 
+        {
+        item = items[i];                
+        iconIndex = 0;
+        if ( item->LastOperationErrorCode() != KErrNone
+             || item->StateL() != MIAUpdateHistoryItem::EInstalled )
+            {
+            // If there was an error in the last operation
+            // or if the node has not been installed, 
+            // then use the second icon that is for
+            // error situations.
+            iconIndex = 1;
+            }
+        HBufC* nodeStateDescription = NodeStateDescriptionLC( *item );
+        TPtr ptr = nodeStateDescription->Des();
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( ptr ); 
+ 
+        HBufC* name = item->Name().AllocLC();
+        TBuf<iconIndexLength> iconIndexBuf;
+        iconIndexBuf.Format( KIconIndexFormat, iconIndex );
+
+        HBufC* buffer = HBufC::NewLC( iconIndexBuf.Length() +
+                                      KTabulator.iTypeLength + 
+                                      name->Length() + 
+                                      KTabulator.iTypeLength +
+                                      nodeStateDescription->Length() );  
+
+        buffer->Des() = iconIndexBuf;
+        buffer->Des() += KTabulator();
+        buffer->Des() += *name;
+        buffer->Des() += KTabulator();
+        buffer->Des() += *nodeStateDescription;        
+         
+        iItemTextArray->AppendL( *buffer );
+                 
+        CleanupStack::PopAndDestroy( buffer );
+        CleanupStack::PopAndDestroy( name );
+        CleanupStack::PopAndDestroy( nodeStateDescription );
+        }    
+    
+    if ( items.Count() > 0 )
+        {
+    	iListBox->
+        ScrollBarFrame()->
+            SetScrollBarVisibilityL( 
+                CEikScrollBarFrame::EOn, CEikScrollBarFrame::EAuto ); 
+        }
+    else
+        {
+        iListBox->
+        ScrollBarFrame()->
+            SetScrollBarVisibilityL( 
+                CEikScrollBarFrame::EOff,CEikScrollBarFrame::EOff );	
+        }     
+    iListBox->HandleItemAdditionL();        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::OfferKeyEventL
+// 
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CIAUpdateHistoryContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, 
+                                                        TEventCode aType )
+    {
+    TKeyResponse response = EKeyWasNotConsumed;    
+
+    if( aType == EEventKey )
+        {
+        switch( aKeyEvent.iCode )
+            {
+            // Up and down arrow actions are delegated to the listbox
+            case EKeyUpArrow:
+            case EKeyDownArrow:
+                response = iListBox->OfferKeyEventL( aKeyEvent, aType );        
+                break;
+                
+            case EKeyOK:
+                // Nothing to do here
+                break;
+                
+            default:
+                // Nothing to do here
+                break;
+            }
+        }
+
+    return response;        
+    }
+    
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::SizeChanged
+// 
+// -----------------------------------------------------------------------------
+//
+void CIAUpdateHistoryContainer::SizeChanged()
+    {
+    iListBox->SetRect( Rect() );
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::CountComponentControls
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CIAUpdateHistoryContainer::CountComponentControls() const
+    {
+    return 1;
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::ComponentControl
+// 
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CIAUpdateHistoryContainer::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* control( NULL );
+
+    switch( aIndex )
+        {
+        case 0:
+            control = iListBox;
+            break;
+            
+        default:
+            break;
+        }
+
+    return control;
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::HandleResourceChange
+// 
+// ---------------------------------------------------------------------------
+//
+void CIAUpdateHistoryContainer::HandleResourceChange( TInt aType )
+    {
+	CCoeControl::HandleResourceChange( aType );
+
+    if ( aType == KEikDynamicLayoutVariantSwitch ) //Handle change in layout orientation
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPaneRect );
+        SetRect( mainPaneRect );
+		DrawNow();
+		}
+    }
+
+// -----------------------------------------------------------------------------
+// CIAUpdateHistoryContainer::NodeStateDescriptionLC
+// 
+// -----------------------------------------------------------------------------
+//
+HBufC* CIAUpdateHistoryContainer::NodeStateDescriptionLC( const MIAUpdateHistoryItem& aItem )
+    {
+    HBufC* stateDescription( NULL );
+
+    MIAUpdateHistoryItem::TIAHistoryItemState state( aItem.StateL() );
+    TInt errorCode( aItem.LastOperationErrorCode() );
+
+    HBufC* timeDes = HBufC::NewLC( KTimeLength );
+    TPtr tmpDes = timeDes->Des();
+    
+    // Get the current local time
+    TTime currentTime( 0 );
+    currentTime.HomeTime();
+
+    TTime lastOperationTime = aItem.LastOperationTime();
+    // Get the local time from the unviversal time.
+    TLocale locale;
+    lastOperationTime += locale.UniversalTimeOffset();
+    
+    if ( lastOperationTime - locale.UniversalTimeOffset() == 0 )
+        {
+        // Because the origianal universal operation time was zero, the given time
+        // is not correct. Set the time string empty. So, we will not give wrong information.
+        tmpDes.Copy( KNullDesC() );
+        }
+    else if ( currentTime.DayNoInYear() != lastOperationTime.DayNoInYear()
+         || currentTime.DaysFrom( lastOperationTime ).Int() > 0 )
+        {
+        // Day has changed.
+        // Just to be sure, other checking is done because year may have also changed.
+        lastOperationTime.FormatL( tmpDes, KDateFormat() );       
+        }
+    else
+        {
+        // Same day
+        lastOperationTime.FormatL( tmpDes, KTimeFormat() );       
+        }      
+    
+    if ( errorCode == KErrNoMemory )
+        {
+        // Last operation could not be completed because we were out of memory.
+        // Show this error text.
+        stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_UPDATE_NO_MEMORY,
+                                                 *timeDes ); 
+        }
+    else 
+        {
+        switch( state )
+            {
+            case MIAUpdateHistoryItem::EInstalled:
+                if ( errorCode == KErrNone )
+                    {
+                    // Because item is installed successfully, everything has gone ok.
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_UPDATE_SUCCESSFULL,
+                                                             *timeDes );                    
+                    }
+                else if ( errorCode == KErrCancel )
+                    {
+                    // For some reason, the state says that an item has been installed,
+                    // but the error code is cancel. In this case, trust the error code.
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_INSTALL_CANCELLED,
+                                                             *timeDes );
+                    }
+                else
+                    {
+                    // If everything goes ok, then the item should be installed.
+                    // So, something has gone wrong because we are here. So,
+                    // give the install failed message
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_INSTALL_FAILED,
+                                                             *timeDes );
+                    }                
+                break;
+
+            case MIAUpdateHistoryItem::EDownloaded:
+                if ( errorCode == KErrCancel )
+                    {
+                    // Because item has been downloaded but the error code is cancel
+                    // this means that the install has been cancelled
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_INSTALL_CANCELLED,
+                                                             *timeDes );
+                    }
+                else
+                    {
+                    // If everything goes ok, then the item should be installed.
+                    // So, something has gone wrong because we are here. So,
+                    // give the install failed message
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_INSTALL_FAILED,
+                                                             *timeDes );
+                    }
+                break;
+
+            case MIAUpdateHistoryItem::EPurchased:
+                if ( errorCode == KErrCancel )
+                    {
+                    // Because item has been purchased but the error code is cancel
+                    // this means that the download has been cancelled
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_DOWNLOAD_CANCELLED,
+                                                             *timeDes );
+                    }
+                else
+                    {
+                    // If everything goes ok, then the item should be installed.
+                    // So, something has gone wrong because we are here. So,
+                    // give the download failed message
+                    stateDescription = StringLoader::LoadLC( R_IAUPDATE_TEXT_DOWNLOAD_FAILED,
+                                                             *timeDes );
+                    }
+                break;
+                                
+            default:
+                // We should never come here.
+                stateDescription = KNullDesC().AllocLC();
+                break;
+            }        
+        }
+   
+    CleanupStack::Pop( stateDescription );
+    CleanupStack::PopAndDestroy( timeDes );
+    CleanupStack::PushL( stateDescription );
+         
+    return stateDescription;
+    }
+
+