connectionmonitoring/connectionmonitorui/src/ConnectionMonitorUiDetailsContainer.cpp
changeset 0 5a93021fdf25
child 2 086aae6fc07e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/connectionmonitoring/connectionmonitorui/src/ConnectionMonitorUiDetailsContainer.cpp	Thu Dec 17 08:55:21 2009 +0200
@@ -0,0 +1,615 @@
+/*
+* 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:  container control class
+*
+*
+*/
+
+// INCLUDE FILES
+#include "ConnectionMonitorUiDetailsContainer.h"
+
+#include <aknnavi.h>    //for CNaviPane
+#include <aknnavide.h>  //for CAknNavigationDecorator
+#include <StringLoader.h>
+#include <ConnectionMonitorUi.rsg>
+
+#include "ConnectionArray.h"
+#include "ConnectionMonitorUiLogger.h"
+#include "ConnectionMonitorUiDetailsView.h"
+#include "ConnectionMonitorUi.hrh"
+
+// CONSTANTS
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::ConstructL( const TRect& aRect )
+// EPOC two phased constructor
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::ConstructL( const TRect& aRect,
+                               CConnectionMonitorUiDetailsView* aParentView )
+    {
+    CMUILOGGER_WRITE( "CConnectionMonitorUiDetailsContainer::ConstructL" );
+    CreateWindowL();
+    
+    iParentView = aParentView;
+    iListBox = new( ELeave ) CAknSingleHeadingStyleListBox;
+    iListBox->SetContainerWindowL( *this );
+    TInt flags = 0;
+    flags |= EAknListBoxViewerFlags;
+    iListBox->ConstructL( this, flags );
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                                 CEikScrollBarFrame::EOff,
+                                                 CEikScrollBarFrame::EAuto );
+
+    CMUILOGGER_WRITE( "Creating connection details array" );
+
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+
+    SetRect( aRect );
+
+    HBufC* noConn = StringLoader::LoadLC( R_QTN_CMON_NO_ACTIVE_CONNECTIONS,
+                                          iEikonEnv );
+    CListBoxView *lbview = iListBox->View();
+    lbview->SetListEmptyTextL( *noConn );
+    CleanupStack::PopAndDestroy( noConn );
+
+
+    GetPanesL();
+
+    ActivateL();
+    CMUILOGGER_WRITE( "CConnectionMonitorUiDetailsContainer::ConstructL" );
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::SetSelectedConnectionL
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::SetSelectedConnectionL(
+                                                    TUint aConnectionIndex )
+    {
+    CMUILOGGER_ENTERFN( "CConnectionMonitorUiDetailsContainer::SetSelectedConnectionL" );
+    CMUILOGGER_WRITE_F( "aConnectionIndex : %d", &aConnectionIndex );
+    CMUILOGGER_WRITE_F( "iConnectionArray->MdcaCount() : %d",
+                        iConnectionArray->MdcaCount() );
+    
+    CConnectionInfoBase* temp = ( *iConnectionArray ).At( aConnectionIndex );
+    CDesCArrayFlat* tempArray = temp ? temp->GetDetailsArray() : NULL ;
+    if ( tempArray )
+        {
+        iConnectionIndex = aConnectionIndex;
+        iConnectionInfo = temp;
+        iListBox->Model()->SetItemTextArray( tempArray );
+        iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray );
+        iListBox->Reset();
+        iListBox->UpdateScrollBarsL();        
+        }
+    
+    CMUILOGGER_LEAVEFN( "CConnectionMonitorUiDetailsContainer::SetSelectedConnectionL" );    
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::~CConnectionMonitorUiDetailsContainer
+// ---------------------------------------------------------
+//
+CConnectionMonitorUiDetailsContainer::~CConnectionMonitorUiDetailsContainer()
+    {
+    delete iListBox;
+    delete iNaviDecorator;
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiContainer::CConnectionMonitorUiContainer
+// ---------------------------------------------------------
+//
+CConnectionMonitorUiDetailsContainer::CConnectionMonitorUiDetailsContainer(
+                             const CConnectionArray* const aConnectionArray )
+    : iConnectionArray( aConnectionArray )
+    {
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::SizeChanged()
+// Called by framework when the view size is changed
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::SizeChanged()
+    {
+    iListBox->SetRect( Rect() );
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::CountComponentControls() const
+// ---------------------------------------------------------
+//
+TInt CConnectionMonitorUiDetailsContainer::CountComponentControls() const
+    {
+    return 1; // return nbr of controls inside this container
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::ComponentControl( TInt aIndex ) const
+// ---------------------------------------------------------
+//
+CCoeControl* CConnectionMonitorUiDetailsContainer::ComponentControl(
+                                                       TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iListBox;
+        default:
+            return NULL;
+        }
+    }
+	
+// ----------------------------------------------------------------------------
+// CLogsDetailView::HandleNaviDecoratorEventL
+// Handler for pointer events, when the Navi Pane arrows have been tapped
+// ----------------------------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::HandleNaviDecoratorEventL( TInt aEventID )
+    {
+    switch (aEventID)
+        {
+        case MAknNaviDecoratorObserver::EAknNaviDecoratorEventRightTabArrow:
+            if ( iConnectionIndex < (iConnectionArray->MdcaCount() - 1) ) {
+                SetSelectedConnectionL(iConnectionIndex + 1);
+            }
+            break;
+        
+        case MAknNaviDecoratorObserver::EAknNaviDecoratorEventLeftTabArrow:
+            if ( iConnectionIndex > 0 ) {
+                SetSelectedConnectionL(iConnectionIndex - 1);
+            }
+            break;
+            
+        default:
+            return;
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::OfferKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CConnectionMonitorUiDetailsContainer::OfferKeyEventL(
+                                                   const TKeyEvent& aKeyEvent,
+                                                   TEventCode aType )
+    {
+    CMUILOGGER_ENTERFN( "CConnectionMonitorUiDetailsContainer::OfferKeyEventL" );    
+    
+    TKeyResponse result( EKeyWasNotConsumed );
+    TInt index = iConnectionIndex;
+    TInt index_closed = iConnectionIndex;
+    CConnectionInfoBase* connection = NULL;
+    if ( aType == EEventKey )
+        {
+        if ( ( aKeyEvent.iCode == EKeyLeftArrow ) ||
+            ( aKeyEvent.iCode == EKeyRightArrow ) )
+            {
+            
+            TInt dir = 0;
+            switch (aKeyEvent.iCode)
+                {
+                case EKeyLeftArrow:
+                    {
+                    dir = -1;
+                    break;
+                    }
+                case EKeyRightArrow:
+                    {
+                    dir = 1;
+                    break;
+                    }
+                }
+            // Handle mirrored layout by negating the directionality
+            if (AknLayoutUtils::LayoutMirrored())
+                {
+                dir = -1 * dir;
+                }
+                
+            index += dir; 
+            
+            TBool step( EFalse );
+            
+            CMUILOGGER_WRITE_F( "OfferKeyEventL index: %d", index );
+            
+            while ( ( index > -1 ) && ( index < iConnectionArray->MdcaCount()
+                    && !step ) )
+                {
+                connection = ( *iConnectionArray )[index];
+                TBool alive = connection->IsAlive();
+                CMUILOGGER_WRITE_F( "OfferKeyEventL alive: %b", alive );
+
+                if ( alive )
+                    {
+                    if ( ( index_closed > -1 ) && 
+                       ( index_closed < iConnectionArray->MdcaCount() ) )
+                        {
+                        CConnectionInfoBase* connection_closed 
+                                       = ( *iConnectionArray )[index_closed];
+
+                        if ( iParentView->GetViewRefreshState() )
+                             {
+                             step = ETrue;
+                             CConnectionMonitorUiAppUi* appUi =
+                                            (CConnectionMonitorUiAppUi*)
+                                            iEikonEnv->EikAppUi();
+                            appUi->DeleteDetailsView( 
+                                        GetSelectedConnectionInfo()
+                                                        ->GetConnectionId(),
+                                        GetSelectedConnectionInfo() );
+                            appUi->StartTimerL();
+                            iParentView->SetViewRefreshState( EFalse );
+                            if ( index_closed > index )
+                                {
+                                iConnectionInfo = connection;
+                                iConnectionIndex = index;
+                                }
+                            iListBox->Model()->SetItemTextArray(
+                                            connection->GetDetailsArray() );
+                            iListBox->DrawNow();
+                            iListBox->UpdateScrollBarsL();
+                            PushAndRefreshNaviPaneL();
+                            }
+                        else
+                            {
+                            step = ETrue;
+                            iConnectionInfo = connection;
+                            iConnectionIndex = index;
+                            iListBox->Model()->SetItemTextArray(
+                                            connection->GetDetailsArray() );
+                            iListBox->DrawNow();
+                            iListBox->UpdateScrollBarsL();
+                            PushAndRefreshNaviPaneL();
+                            }
+                        }
+                    }
+                else
+                    {                        
+                    index += dir; 
+                    }    
+                }
+            result = iListBox->OfferKeyEventL( aKeyEvent, aType );                
+            }
+        else if ( aKeyEvent.iCode == EKeyDevice3 )
+            // selection key press -> go back to main view
+            {
+            CConnectionMonitorUiAppUi::Static()->ActivateLocalViewL(
+                            TUid::Uid( EConnectionMonitorUiMainViewTab ) );
+            result = EKeyWasConsumed;
+            }
+        else
+            {
+            result = iListBox->OfferKeyEventL( aKeyEvent, aType );
+            }
+        }
+
+    CMUILOGGER_LEAVEFN( "CConnectionMonitorUiDetailsContainer::OfferKeyEventL" );    
+
+    return result;
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::OnEventL
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::OnEventL(
+                                    const CConnMonEventBase& aConnMonEvent,
+                                    const TInt aIndex )
+    {
+    CMUILOGGER_ENTERFN( "CConnectionMonitorUiDetailsContainer::OnEventL()" );
+    CMUILOGGER_WRITE_F( "aIndex : %d", aIndex );
+    
+    switch ( aConnMonEvent.EventType() )
+        {
+        case EConnMonDeleteConnection:
+            {
+            if ( aIndex == iConnectionIndex )
+                {
+                TUint count = iConnectionArray->MdcaCount();
+                switch ( count )
+                    {
+                    case 0:
+                        {
+                        iListBox->Model()->SetItemTextArray(
+                                           new (ELeave) CDesCArrayFlat( 1 ) );
+                        iListBox->Model()->SetOwnershipType(
+                                                          ELbmOwnsItemArray );
+                        iConnectionIndex = 0;
+                        iConnectionInfo = NULL;
+                        break;
+                        }
+                    case 1:
+                        {
+                        SetSelectedConnectionL( 0 );
+                        break;
+                        }
+                    default :
+                        {
+                        TInt index = iConnectionIndex < count ?
+                                                        iConnectionIndex :
+                                                        iConnectionIndex - 1;
+                        SetSelectedConnectionL( index );
+                        break;
+                        }
+                    }
+                iListBox->DrawNow();
+                iListBox->UpdateScrollBarsL();
+                }
+            break;
+            }
+        case EConnMonCreateConnection:
+            {
+        CMUILOGGER_WRITE_F( "iConnectionInfo : %d", iConnectionInfo );
+            
+            if ( !iConnectionInfo )
+                {
+                SetSelectedConnectionL( 0 );
+                }
+            break;
+            }
+        default:
+            {
+            if ( !iConnectionInfo )
+                {
+                SetSelectedConnectionL( 0 );
+                }            
+            else if ( ( aIndex == iConnectionIndex ) && ( iConnectionArray->MdcaCount() ) )
+                {
+                iListBox->DrawNow();
+                iListBox->UpdateScrollBarsL();
+                }
+            break;
+            }
+        }
+    PushAndRefreshNaviPaneL();
+    CMUILOGGER_LEAVEFN( "CConnectionMonitorUiDetailsContainer::OnEventL()" );    
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::OnTimerEventL
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::OnTimerEventL()
+    {
+    if ( iConnectionArray->MdcaCount() )
+       {
+        iListBox->DrawNow();
+        iListBox->UpdateScrollBarsL();
+        CMUILOGGER_WRITE_F( "CMUIDW GetStatus() before: %d", 
+                            iConnectionInfo->GetStatus() );
+        if ( iConnectionInfo->GetStatus() == EConnectionClosing )
+            {
+            CConnectionMonitorUiAppUi* tempApUi = 
+                        CConnectionMonitorUiAppUi::Static();
+            tempApUi->StopTimer();
+            iConnectionInfo->StatusChangedL();
+            }
+        CMUILOGGER_WRITE_F( "CMUIDW GetStatus() after: %d",
+                            iConnectionInfo->GetStatus() );
+        }
+    PushAndRefreshNaviPaneL();
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::DrawFirstAllListBoxItem
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::DrawFirstAllListBoxItem()
+    {
+    TInt count = iListBox->Model()->NumberOfItems() - 1;
+    for ( TInt i = count; i > -1; --i )
+        {
+        iListBox->DrawItem( i );
+        }
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::ListBox
+// ---------------------------------------------------------
+//
+CAknSingleHeadingStyleListBox*
+                        CConnectionMonitorUiDetailsContainer::ListBox() const
+    {
+    return iListBox;
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::GetPanesL
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::GetPanesL()
+    {
+    CEikStatusPane* statusPane = iEikonEnv->AppUiFactory()->StatusPane();
+
+    iNaviPane =  STATIC_CAST( CAknNavigationControlContainer*,
+                  statusPane->ControlL( TUid::Uid(EEikStatusPaneUidNavi ) ) );
+
+    PushAndRefreshNaviPaneL();
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::PushAndRefreshNaviPaneL
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::PushAndRefreshNaviPaneL()
+    {
+    TUint countOfConnection = iConnectionArray->NumberOfActiveConnections();
+    CMUILOGGER_WRITE_F( "countOfConnection : %d", countOfConnection );
+    
+    if ( ( iConnectionIndex > countOfConnection ) && // spec. index update
+         ( countOfConnection == 0 ) )
+        {
+        iConnectionIndex = iConnectionArray->
+                                GetArrayIndex( 
+                                        GetSelectedConnectionInfo()
+                                                    ->GetConnectionId() );
+        }
+    
+    CMUILOGGER_WRITE_F( "iConnectionIndex : %d", iConnectionIndex );
+
+    if ( iNaviDecorator )
+        {
+        PopNaviPane();
+        }
+    
+    if ( iParentView->GetViewRefreshState() ) // connection closed
+        {
+        iNaviDecorator = iNaviPane->CreateNavigationLabelL( KNullDesC );
+        }
+    else // connection alive
+        {
+        HBufC* textOfNaviPane = NULL;
+
+        CArrayFixFlat<TInt>* array = new( ELeave ) CArrayFixFlat<TInt>( 2 );
+        CleanupStack::PushL( array );
+        
+        if ( ( countOfConnection == 1 ) &&
+             ( iConnectionIndex + 1 >= countOfConnection ) )
+            {
+            array->AppendL( countOfConnection );
+            }
+        else            
+            {            
+            array->AppendL( countOfConnection ? iConnectionIndex + 1 : 0 );
+            }
+            
+        array->AppendL( countOfConnection );
+        textOfNaviPane = StringLoader::LoadLC( 
+                                            R_QTN_CMON_NAVI_NOF_CONNECTION,
+                                            *array );
+
+        iNaviDecorator = iNaviPane->CreateNavigationLabelL( 
+                                                        *textOfNaviPane );
+        
+        CleanupStack::PopAndDestroy( textOfNaviPane );
+        CleanupStack::PopAndDestroy( array );
+        }
+
+    iNaviDecorator->MakeScrollButtonVisible( ETrue );
+    
+    CAknNavigationDecorator::TScrollButton left = CAknNavigationDecorator::ELeftButton;
+    CAknNavigationDecorator::TScrollButton right = CAknNavigationDecorator::ERightButton;
+    if ( AknLayoutUtils::LayoutMirrored() )
+    	{
+    	left = CAknNavigationDecorator::ERightButton;
+    	right = CAknNavigationDecorator::ELeftButton;
+    	}
+
+    if ( iParentView->GetViewRefreshState() )
+        {
+        iNaviDecorator->SetScrollButtonDimmed( left, 
+                                           ( ( iConnectionIndex == 0 ) ||
+                                             ( countOfConnection == 0 ) ) );
+        }
+    else
+        {
+        iNaviDecorator->SetScrollButtonDimmed( 
+                          left, 
+                          ( ( iConnectionIndex == 0 ) ||
+                            ( countOfConnection == 0 ) ||
+                            ( ( countOfConnection == 1 ) &&
+                              ( iConnectionIndex + 1 >= 
+                                    countOfConnection ) ) ) );
+        }
+
+    if ( iParentView->GetViewRefreshState() )
+        {
+        iNaviDecorator->SetScrollButtonDimmed( right, 
+    			                iConnectionIndex >= countOfConnection );
+        }
+    else
+        {
+        iNaviDecorator->SetScrollButtonDimmed( right, 
+    			                iConnectionIndex + 1 >= countOfConnection );
+        }
+        
+    iNaviDecorator->SetNaviDecoratorObserver( this );
+        
+    iNaviPane->PushL( *iNaviDecorator );
+    }
+
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::PopNaviPane
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::PopNaviPane()
+    {
+    iNaviPane->Pop( iNaviDecorator );
+    delete iNaviDecorator;
+    iNaviDecorator = NULL;
+    }
+
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::HandleResourceChange
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        TRect mainPaneRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, 
+                                           mainPaneRect );
+        SetRect( mainPaneRect );
+        DrawNow();
+        }
+    }
+    
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::FocusChanged
+// ---------------------------------------------------------
+//
+void CConnectionMonitorUiDetailsContainer::FocusChanged( TDrawNow aDrawNow )
+    {
+    CMUILOGGER_ENTERFN( "CConnectionMonitorUiDetailsContainer::FocusChanged" );
+    CCoeControl::FocusChanged( aDrawNow );    
+    if ( iListBox )
+        {
+        iListBox->SetFocus( IsFocused() );
+        }        
+    CMUILOGGER_LEAVEFN( "CConnectionMonitorUiDetailsContainer::FocusChanged" );    
+    }    
+    
+    
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::GetIndexOfSelectedItem
+// ---------------------------------------------------------
+//
+TInt CConnectionMonitorUiDetailsContainer::GetIndexOfSelectedItem()
+	{
+    CMUILOGGER_WRITE_F(
+        "CMUIDetailsContainer::GetIndexOfSelectedItem  iConnectionIndex: %d",
+        iConnectionIndex );
+
+    return iConnectionIndex;	
+    }
+
+// ---------------------------------------------------------
+// CConnectionMonitorUiDetailsContainer::GetSelectedConnectionInfo()
+// ---------------------------------------------------------
+//
+    CConnectionInfoBase* CConnectionMonitorUiDetailsContainer::
+                                        GetSelectedConnectionInfo() const
+	{
+	return iConnectionInfo;	
+	}
+    
+
+// End of File