diff -r 000000000000 -r e686773b3f54 logsui/AppSrc/CLogsDetailControlContainer.cpp --- /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 +#include +#include //Dynamic layout functions +#include +#include + +#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 + +// 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( + 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 tmp; + TBuf 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 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 wholeTextBuf; + wholeTextBuf.Append( dateText ); + wholeTextBuf.Append( KSpace ); + wholeTextBuf.Append( timeText ); + + AknTextUtils::LanguageSpecificNumberConversion( wholeTextBuf ); + + CAknTabGroup* tabGroup = static_cast( + 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