logsui/AppSrc/CLogsDetailControlContainer.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/logsui/AppSrc/CLogsDetailControlContainer.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,456 @@
+/*
+* 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: 
+*     Logs "Detail" view container control class implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <applayout.cdl.h>    //Dynamic layout functions
+#include <Logs.rsg>
+#include <AknUtils.h>
+
+#include "CLogsDetailControlContainer.h"
+#include "CLogsAppUi.h"
+#include "CLogsDetailAdapter.h"
+#include "CLogsDetailView.h"
+#include "CLogsEngine.h"
+#include "MLogsGetEvent.h"
+#include "MLogsEventGetter.h"
+#include "MLogsModel.h"
+#include "MLogsSharedData.h"
+#include "CPhoneNumberFormat.h"
+
+#include "LogsConstants.hrh"
+
+#include "LogsUID.h"
+#include <csxhelp/log.hlp.hrh>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES  
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::NewL
+// ----------------------------------------------------------------------------
+//
+CLogsDetailControlContainer* CLogsDetailControlContainer::NewL
+        ( CLogsDetailView* aView, const TRect& aRect )
+    {
+    CLogsDetailControlContainer* self = new( ELeave )
+                                CLogsDetailControlContainer( aView );
+    self->SetMopParent( aView );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop();  // self
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::~CLogsDetailControlContainer
+// ----------------------------------------------------------------------------
+//
+CLogsDetailControlContainer::~CLogsDetailControlContainer()
+    {
+    delete iListBox;
+    delete iDecoratedTabGroup;
+    delete iPrivateNumber;
+    delete iUnknownNumber;
+    delete iPayphoneNumber;    
+    delete iEmergencyCall;
+    delete iTitleLabel;
+    delete iCsdNumber;
+    delete iOperServNumber;
+    delete iGroupCall;
+    delete iPhoneNumber;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::CLogsDetailControlContainer
+// ----------------------------------------------------------------------------
+//
+CLogsDetailControlContainer::CLogsDetailControlContainer
+    (   CLogsDetailView* aView
+    )
+    : CLogsBaseControlContainer( aView )
+    , iView( aView )
+    {
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::ConstructL
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::ConstructL( const TRect& aRect )
+    {
+    BaseConstructL();
+
+    //FIXME: this can be removed as Phone takes care of leavin csd numbers unlogged if preferred                                             
+    // iShowCsd = iView->Engine()->SharedDataL()->ShowCsdNumber(); 
+    
+    iListBox = new( ELeave ) CAknSingleHeadingStyleListBox;
+    iListBox->ConstructL( this, EEikListBoxMultipleSelection
+                                | EAknListBoxViewerFlags );
+
+    iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );   //Ownership of iAdapter to iListBox
+
+    iAdapter = CLogsDetailAdapter::NewL( iListBox, iView );    
+    
+    iListBox->Model()->SetItemTextArray( iAdapter );            //Ownership of iAdapter transferred to iListBox
+    
+    MakeEmptyTextListBoxL( iListBox, R_LOGS_EVENTVIEW_FETCHING_TEXT );    
+
+    iPrivateNumber = iCoeEnv->AllocReadResourceL( 
+                                    R_DLOGS_DETAILS_PRIVATE_NUMBER );
+    iUnknownNumber = iCoeEnv->AllocReadResourceL( 
+                                    R_DLOGS_DETAILS_UNKNOWN_NUMBER );
+    iPayphoneNumber = iCoeEnv->AllocReadResourceL( 
+                                    R_DLOGS_DETAILS_PAYPHONE_NUMBER ); 
+                                    
+    iEmergencyCall = iCoeEnv->AllocReadResourceL( 
+                                    R_LOGS_EMERG_CALL );
+    iCsdNumber = iCoeEnv->AllocReadResourceL( 
+                                    R_LOGS_DETAILS_CSD_NUMBER );
+    iOperServNumber = iCoeEnv->AllocReadResourceL( 
+                                    R_LOGS_DETAILS_OPER_SERV );
+    iGroupCall = iCoeEnv->AllocReadResourceL( 
+                                    R_LOGS_CON_GROUP_CALL );                                        
+    iTitleLabel = new (ELeave) CEikLabel();
+
+    iPhoneNumber = CPhoneNumberFormat::NewL();
+
+    iDecoratedTabGroup = NaviPaneL()->CreateTabGroupL();
+
+    iDecoratedTabGroup->SetNaviDecoratorObserver(iView);
+
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>( 
+                        iDecoratedTabGroup->DecoratedControl() );
+    tabGroup->SetTabFixedWidthL( KTabWidthWithOneTab );
+    tabGroup->AddTabL( 0, KSpace );
+
+    SetRect( aRect );
+    ActivateL();     
+    }
+   
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::InitNaviPaneL
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::InitNaviPaneL()
+    {
+    const MLogsEventGetter* event = iView->Engine()->GetEventL()->Event();
+
+    TLogsDirection dir = event->Direction();            
+    TUid uid;
+    uid.iUid = event->EventUid().iUid;
+
+    //if( ! iShowCsd &&  //FIXME: this can be removed as Phone takes care of leavin csd numbers unlogged if preferred
+    // (replaced by row below)
+    if( !event->Number() && !event->RemoteParty() &&
+        uid.iUid == KLogDataEventType &&
+        ( dir == EDirOutAlt || dir == EDirOut ) )
+        {
+        //CSD-numbers: some operators don't want to show csd-number. In those cases Phone does not log the phone number 
+        //and may not even log access point to RemoteParty, i.e. the entry is ETypeUnknown. However, for those entries 
+        //show iCsdNumber instad of iUnknownNumber.
+        MakeTitleL( *iCsdNumber );
+        }
+    else
+        {
+        switch( event->EventType() )
+            {
+            case ETypeUsual:
+                 if( event->RemoteParty() )         //If remote party provided. Title pane shows
+                    {                               //on two rows if does not fit to one row
+                    // lets replace paragraph delimiters with single white space, fix for EBWG-6ZPCMZ 
+                    TPtr titleText = event->RemoteParty()->Des();
+                    TBuf<1> charsToRemove;
+                    charsToRemove.Append(TChar(TInt(CEditableText::EParagraphDelimiter)));
+                    AknTextUtils::ReplaceCharacters(titleText, charsToRemove, TChar(TInt(CEditableText::ESpace)));
+                    MakeTitleL(titleText);  
+                    }
+                else if( event->Number() )          //Phone number. Shown on one line only,
+                    {                               //so needs to be clipped if does not fit
+                    //We prefer showing phone number over sip uri. If this order is changed, change it 
+                    //also to CLogsBaseView::CmdSaveToVirtualPhonebookL and other views too
+                    
+                    //First calculate max width in pixels available in title pane
+                    TAknTextLineLayout line = AknLayout::Title_pane_texts_Line_1(0, 0); 
+                    TRect titlePane;
+                    AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::ETitlePane, titlePane);
+                    TAknLayoutText text;
+                    text.LayoutText( titlePane, line);  
+                    TInt maxTextWidthPixels = text.TextRect().Width();   
+                    //Then format the phone number to fit in available space
+                    TBuf<KLogsPhoneNumberMaxLen> tmp;
+                    TBuf<KLogsPhoneNumberMaxLen> clippedNumber;
+                    iPhoneNumber->DTMFStrip( *(event->Number()), tmp );
+                    iPhoneNumber->PhoneNumberFormat
+                                    (   tmp
+                                    ,   clippedNumber
+                                    ,   iTitleLabel->Font()
+                                    ,   maxTextWidthPixels // text.iW  
+                                    );
+                    MakeTitleL( clippedNumber );
+                    }                    
+                else if( event->LogsEventData()->Url().Length() > 0 ) 
+                    {
+                    TBuf<KLogsSipUriMaxLen> buf; 
+                    
+                    if ( iView->Engine()->ConvertToUnicode( event->LogsEventData()->Url(), buf ) )
+                        {
+                        MakeTitleL( KNullDesC );    //Converting failed
+                        }
+                    else
+                        {
+                        MakeTitleL( buf );
+                        }
+                    }
+                break;
+
+            case ETypePoCGroupCall:                
+                 if( event->RemoteParty() )         //If remote party provided. Title pane shows
+                    {                               //on two rows if does not fit to one row
+                    MakeTitleL( *(event->RemoteParty()) );  
+                    }
+                else                                //if no remote party data available, show
+                    {                               //localised text "group call"
+                    MakeTitleL( *iGroupCall );  
+                    }
+                break;                
+
+            case ETypePrivate:
+                MakeTitleL( *iPrivateNumber );
+                break;
+
+            case ETypeUnknown:
+                MakeTitleL( *iUnknownNumber );
+                break;
+
+            case ETypePayphone:
+                MakeTitleL( *iPayphoneNumber );
+                break;
+
+            case ETypeEmerg:
+                MakeTitleL( *iEmergencyCall );
+                break;
+
+            case ETypeSAT:
+                 if( event->RemoteParty() )         
+                    {                               
+                    // sat event with contact
+                    MakeTitleL( *(event->RemoteParty()) );  
+                    }
+                else 
+                    {
+                    MakeTitleL( *iOperServNumber );        
+                    }                    
+                break;
+
+            default:            
+                __ASSERT_DEBUG( EFalse, User::Panic( KPanicText_DetailsCC, KErrCorrupt ));
+                break;
+            }
+        }
+
+    TTime time( event->Time() );
+
+    HBufC* dateTextBuf = HBufC::NewLC( KLogsBuff128 );
+    TPtr dateText( dateTextBuf->Des() );
+    // Get date string in the format that current localisation requires.
+    // Date "12/12"
+    HBufC* textFromResourceFile = iCoeEnv->AllocReadResourceLC(
+                                  R_QTN_DATE_WITHOUT_YEAR_WITH_ZERO );
+
+    time.FormatL( dateText, *textFromResourceFile );
+    CleanupStack::PopAndDestroy();  // textFromResourceFile
+
+    HBufC* timeTextBuf = HBufC::NewLC( KLogsBuff128 );
+    TPtr timeText( timeTextBuf->Des() );
+    // Get time string in the format that current localisation requires.
+    // Time "hh:mm" +PM/AM if needed
+    textFromResourceFile = iCoeEnv->AllocReadResourceLC(
+                                                R_QTN_TIME_USUAL_WITH_ZERO );
+
+    time.FormatL( timeText, *textFromResourceFile );
+    CleanupStack::PopAndDestroy();  // textFromResourceFile
+
+    TBuf<KLogsBuff256> wholeTextBuf;
+    wholeTextBuf.Append( dateText );
+    wholeTextBuf.Append( KSpace );
+    wholeTextBuf.Append( timeText );
+    
+    AknTextUtils::LanguageSpecificNumberConversion( wholeTextBuf ); 
+
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>( 
+                                    iDecoratedTabGroup->
+                                    DecoratedControl() );
+    
+    tabGroup->ReplaceTabL( 0, wholeTextBuf );
+
+    // timeTextBuf, dateTextBuf
+    CleanupStack::PopAndDestroy( 2 );
+    tabGroup->SetActiveTabByIndex( 0 );  /// Activating the tab to show
+
+    //If mirrored display right and left arrow dimmed vice versa to western display
+    enum CAknNavigationDecorator::TScrollButton fwrd = 
+        AknLayoutUtils::LayoutMirrored() ? CAknNavigationDecorator::ELeftButton : 
+                                           CAknNavigationDecorator::ERightButton;  
+    enum CAknNavigationDecorator::TScrollButton back = 
+        AknLayoutUtils::LayoutMirrored() ? CAknNavigationDecorator::ERightButton : 
+                                           CAknNavigationDecorator::ELeftButton;  
+
+    //Fix for ESZG-6SYDD6. In 3.1 the platfrom seems wrongly to undim scroll buttons 
+    //when only one entry and navigating left/right.
+    if ( iView->Engine()->Model( ELogsMainModel )->Count() == 1 ) 
+        {
+        iDecoratedTabGroup->MakeScrollButtonVisible( EFalse );
+        }
+    else
+        {
+        iDecoratedTabGroup->MakeScrollButtonVisible( ETrue );
+        }
+
+    //Set scroll arrows
+    if ( iView->LogsAppUi()->EventListViewCurrent() == 0 )
+        {
+        iDecoratedTabGroup->SetScrollButtonDimmed(back, ETrue);
+        }
+    else
+        {
+        iDecoratedTabGroup->SetScrollButtonDimmed(back, EFalse);
+        }
+
+    if ( iView->LogsAppUi()->EventListViewCurrent() == 
+                iView->Engine()->Model( ELogsMainModel )->Count() - 1 )
+        {
+        iDecoratedTabGroup->SetScrollButtonDimmed(fwrd, ETrue);
+        }
+    else
+        {
+        iDecoratedTabGroup->SetScrollButtonDimmed(fwrd, EFalse);
+        }
+
+    /// Makes the whole thing visible
+    NaviPaneL()->PushL( *( iDecoratedTabGroup ) );
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::ComponentControl
+// ----------------------------------------------------------------------------
+//
+CCoeControl* CLogsDetailControlContainer::ComponentControl
+        ( TInt /*aIndex*/ ) const
+    {
+    return iListBox;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::SizeChanged
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::SizeChanged()
+    {
+    if( iListBox )
+        {
+        TInt textWidth = 0;
+
+        //parent rectangle
+        iListBox->SetRect( Rect() );  
+
+        //calculate max width in pixels available for a row
+        TRect main_pane = iListBox->Rect();
+        TAknWindowLineLayout line3 = AknLayout::list_gen_pane(0);
+        TAknLayoutRect rect2;
+        rect2.LayoutRect(main_pane, line3);
+        TRect list_gen_pane = rect2.Rect();
+        TAknWindowLineLayout line2 = AknLayout::list_single_heading_pane(0);
+        TAknLayoutRect rect;
+        rect.LayoutRect(list_gen_pane, line2);
+        TRect list_single_heading_pane = rect.Rect();
+
+        TAknTextLineLayout line = AknLayout::List_pane_texts__single_heading__Line_2(0); //Same in CLogsDetailAdapter::LineFont
+        TAknLayoutText text;
+        text.LayoutText(list_single_heading_pane, line);  
+        textWidth = text.TextRect().Width();     
+
+        // Then update this value to adapter as it needs to truncate shown data if necessary
+        iAdapter->SetLineWidth(textWidth);  
+        }                                       
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::ListBox
+// ----------------------------------------------------------------------------
+//
+CAknSingleHeadingStyleListBox* CLogsDetailControlContainer::ListBox()
+    {
+    return iListBox;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::UpdateL
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::UpdateL()
+    { 
+    iAdapter->UpdateL();
+    InitNaviPaneL();
+    iListBox->HandleItemAdditionL();  //...MdcaPoint will be called later... 
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::GetHelpContext
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iMajor = TUid::Uid( KLogsAppUID3 );
+    aContext.iContext = KLOGS_HLP_DETAIL;
+    }
+
+// ----------------------------------------------------------------------------
+// CLogsDetailControlContainer::FocusChanged
+//    
+// This is needed to hand focus changes to list. Otherwise animations are not displayed.
+// ----------------------------------------------------------------------------
+//
+void CLogsDetailControlContainer::FocusChanged(TDrawNow /* aDrawNow */ )
+    {
+    if( iListBox)
+        {
+        iListBox->SetFocus( IsFocused() );
+        }
+    }    
+
+//  End of File