diff -r 6ca72c0fe49a -r a941bc465d9f wvuing/IMPSConnectionUI/UISrc/CCnUiTermsOfUseDlg.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wvuing/IMPSConnectionUI/UISrc/CCnUiTermsOfUseDlg.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,720 @@ +/* +* Copyright (c) 2006 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: UI dialog for showing the Terms of use of a certain server +* +*/ + +#include "ccnuitermsofusedlg.h" + +#include "CnUiCommon.hrh" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // CEikRichTextEditor +#include +#include //cdl +#include +#include +// item finder (Automatic highlight) +#include +#include +#include +#include +// title pane handling +#include +#include +#include +#include +#include + +#include "impscommonuibuilddefinitions.h" + +const TInt KTextMargin = 100; // normal text margin in twips +const TInt KSpaceBefore = 10; // space before each paragraph (twips) +const TInt KPixelsBetweenLines = 5; // pixels between text lines +const TInt KIMAcceptIndex = 1; // which item "Accept" is in the resource file + +_LIT( KLineBreak, "\n" ); + +// ======== MEMBER FUNCTIONS ======== + + +// --------------------------------------------------------------------------- +// RunDialogLD +// --------------------------------------------------------------------------- +// +TInt CCnUiTermsOfUseDlg::RunDialogLD( TInt aResourceId ) + { + TInt retVal; + iRetVal = &retVal; + + ExecuteLD( aResourceId ); + + return retVal; + } + +// --------------------------------------------------------------------------- +// NewL() +// --------------------------------------------------------------------------- +// +CCnUiTermsOfUseDlg* CCnUiTermsOfUseDlg::NewL( const TDesC& aToUFileName ) + { + CCnUiTermsOfUseDlg* self = CCnUiTermsOfUseDlg::NewLC( aToUFileName ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// NewLC() +// --------------------------------------------------------------------------- +// +CCnUiTermsOfUseDlg* CCnUiTermsOfUseDlg::NewLC( const TDesC& aToUFileName ) + { + CCnUiTermsOfUseDlg* self = new( ELeave ) CCnUiTermsOfUseDlg; + CleanupStack::PushL( self ); + self->ConstructL( aToUFileName ); + return self; + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::ConstructL() +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::ConstructL( const TDesC& aToUFileName ) + { + CAknDialog::ConstructL( R_CNUI_TERMS_OF_USE_MENUBAR ); + + // This dlg uses only context menu + iMenuBar->SetMenuType( CEikMenuBar::EMenuContext ); + + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMainMessage, Rect(), ETrue ); + + iFindItemMenu = CFindItemMenu::NewL( EIMPSCommonUIFindMenuPlaceHolder ); + iFindItemMenu->AttachItemFinderMenuL( R_CNUI_TERMS_OF_USE_MENUBAR ); + iFindItemMenu->HandleItemFinderCommandL( EFindItemCmdEnableAutoFind ); + + iItemFinder = CItemFinder::NewL(); + iItemFinder->AddObserver( *this ); + + iToUFileName = aToUFileName.AllocL(); + + SetNewTitleTextL(); + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CCnUiTermsOfUseDlg::~CCnUiTermsOfUseDlg() + { + TRAP_IGNORE( RestoreTitlePaneTextL() ); + + AknsUtils::DeregisterControlPosition( this ); + + delete iBgContext; + delete iItemFinder; + delete iFindItemMenu; + delete iOldTitleText; + delete iToUFileName; + } + +// --------------------------------------------------------------------------- +// C++ constructor +// --------------------------------------------------------------------------- +// +CCnUiTermsOfUseDlg::CCnUiTermsOfUseDlg() + { + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::ProcessCommandL( TInt aCommand ) +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::ProcessCommandL( TInt aCommand ) + { + if ( iFindItemMenu && iFindItemMenu->CommandIsValidL( aCommand ) ) + { + iFindItemMenu->HandleItemFinderCommandL( aCommand ); + return; + } + } + +// ----------------------------------------------------------------------------- +// CCnUiTermsOfUseDlg::DynInitMenuPaneL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::DynInitMenuPaneL( TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + switch ( aResourceId ) + { + case R_CNUI_TERMS_OF_USE_MENU: + { + iFindItemMenu->AddItemFindMenuL( iItemFinder, aMenuPane, + EIMPSCommonUIFindMenuPlaceHolder, + KNullDesC ); // we can ignore the sender here + + // remove placeholder + aMenuPane->SetItemDimmed( EIMPSCommonUIFindMenuPlaceHolder, ETrue ); + aMenuPane->SetItemDimmed( EFindItemCmdDisableAutoFind, ETrue ); + break; + } + default: + { + // update find menu + iFindItemMenu->UpdateItemFinderMenuL( aResourceId, aMenuPane ); + break; + } + } + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::HandleParsingComplete() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::HandleParsingComplete() + { + TRAPD( err, UpdateCbaL() ); + if ( err ) + { + CActiveScheduler::Current()->Error( err ); + } + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::PreLayoutDynInitL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::PreLayoutDynInitL() + { + CAknDialog::PreLayoutDynInitL(); + AknsUtils::RegisterControlPosition( this ); + + iEditor = static_cast( Control( ETOURichEditorId ) ); + + iParaFormatLayer = CParaFormatLayer::NewL(); + iEditor->SetParaFormatLayer( iParaFormatLayer ); // takes the ownership + + iCharFormatLayer = CCharFormatLayer::NewL(); + iEditor->SetCharFormatLayer( iCharFormatLayer ); // takes the ownership + + // Update text color from skin + UpdateTextColorL(); + + // Get ToU message + HBufC* touText = ReadToUMessageLC(); + iEditor->SetTextL( touText ); + CleanupStack::PopAndDestroy( touText ); + + iEditor->CreateScrollBarFrameL(); + // Only vertical scrollbar is needed + iEditor->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + } + +// ----------------------------------------------------------------------------- +// CCnUiTermsOfUseDlg::PostLayoutDynInitL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::PostLayoutDynInitL() + { + CAknDialog::PostLayoutDynInitL(); + + // Insert paragraph delimiter to make + // iItemFinder scroll the view all the way down + TChar lb( CEditableText::EParagraphDelimiter ); + iEditor->Text()->InsertL( iEditor->TextLength(), lb ); + + iItemFinder->SetEditor( &iEditor ); + + if ( iBgContext ) + { + iBgContext->SetRect( Rect() ); + iBgContext->SetParentPos( PositionRelativeToScreen() ); + } + } + +// ----------------------------------------------------------------------------- +// CCnUiTermsOfUseDlg::SetSizeAndPosition +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::SetSizeAndPosition( const TSize& /*aSize*/ ) + { + // dialog fills the mainpane + TRect mainPane; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, mainPane ); + SetRect( mainPane ); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::OkToExitL( TInt aButtonId ) +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CCnUiTermsOfUseDlg::OkToExitL( TInt aButtonId ) + { + switch ( aButtonId ) + { + case EAknSoftkeyCancel: + { + if ( AskCancelConfirmationL() ) + { + // user cancelled + *iRetVal = EAknSoftkeyCancel; + return ETrue; + } + return EFalse; + } + case EIMPSCommonUITOUContinue: + { + // Try to scroll down + if ( iItemFinder->NextItemOrScrollL( CItemFinder::ENextDown ) ) + { + // Not yet at bottom => return + UpdateCbaL(); + return EFalse; + } + + TInt retVal = AcceptTermsL(); + switch ( retVal ) + { + case KIMAcceptIndex: + { + // user accepted the terms + *iRetVal = EAknSoftkeyOk; + return ETrue; + } + + case EAknSoftkeyCancel: + { + return EFalse; + } + default: + { + // user did not accept the query + *iRetVal = EAknSoftkeyCancel; + return ETrue; + } + } + } + case EAknSoftkeyContextOptions: // MSK command + { + DisplayMenuL(); + return EFalse; + } + case EAknSoftkeyEmpty: + { + return EFalse; + } + default: + { + return ETrue; + } + } + } + +// ----------------------------------------------------------------------------- +// CCnUiTermsOfUseDlg::OfferKeyEventL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TKeyResponse CCnUiTermsOfUseDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + if ( aType != EEventKey ) + { + return EKeyWasNotConsumed; + } + + switch ( aKeyEvent.iCode ) + { + case EKeyEnter: // flowthrough + case EKeyOK: + { + CItemFinder::CFindItemExt& curItem = iItemFinder->CurrentItemExt(); + if ( curItem.iItemType != CItemFinder::ENoneSelected ) + { + DisplayMenuL(); + } + return EKeyWasConsumed; + } + case EKeyBackspace: + { + return EKeyWasConsumed; + } + + case EKeyUpArrow: + { + TKeyResponse res = + iItemFinder->NextItemOrScrollL( CItemFinder::ENextUp ) ? + EKeyWasConsumed : EKeyWasNotConsumed; + if ( res == EKeyWasConsumed ) + { + UpdateCbaL(); + } + return res; + } + + case EKeyDownArrow: + { + TKeyResponse res = + iItemFinder->NextItemOrScrollL( CItemFinder::ENextDown ) ? + EKeyWasConsumed : EKeyWasNotConsumed; + if ( res == EKeyWasConsumed ) + { + UpdateCbaL(); + } + return res; + } + + case EKeyRightArrow: + { + return EKeyWasConsumed; + } + + case EKeyEscape: // handle dialog shutdown. + { + TryExitL( EAknSoftkeyExit ); + return EKeyWasConsumed; + } + default: + { + return EKeyWasNotConsumed; + } + } + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::MopSupplyObject +// +// --------------------------------------------------------- +// + +TTypeUid::Ptr CCnUiTermsOfUseDlg::MopSupplyObject( TTypeUid aId ) + { + if ( aId.iUid == MAknsControlContext::ETypeId ) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + + return CCoeControl::MopSupplyObject( aId ); + } + + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::SizeChanged +// +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::SizeChanged() + { + // base class method + CAknDialog::SizeChanged(); + + if ( iBgContext ) + { + iBgContext->SetRect( Rect() ); + iBgContext->SetParentPos( PositionRelativeToScreen() ); + } + + if ( iEditor ) + { + iEditor->SetRect( Rect() ); + } + + // Update the font to correct size + if ( iParaFormatLayer && iCharFormatLayer ) + { + // Correct font + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontSecondaryFont ); + + // format richtext + TInt lineSpacing( font->HeightInPixels() + KPixelsBetweenLines ); + CParaFormat paraFormat; + TParaFormatMask paraFormatMask; + paraFormat.iLineSpacingControl = + CParaFormat::ELineSpacingExactlyInPixels; + paraFormatMask.SetAttrib( EAttLineSpacingControl ); + paraFormat.iLineSpacingInTwips = lineSpacing; + paraFormatMask.SetAttrib( EAttLineSpacing ); + paraFormat.iLanguage = + CAknEnv::Static()->SettingCache().InputLanguage(); + paraFormatMask.SetAttrib( EAttParaLanguage ); + paraFormat.iLeftMarginInTwips = KTextMargin; + paraFormatMask.SetAttrib( EAttLeftMargin ); + paraFormat.iSpaceBeforeInTwips = KSpaceBefore; + paraFormatMask.SetAttrib( EAttSpaceBefore ); + + TCharFormat charFormat; + TCharFormatMask charFormatMask; + charFormat.iFontSpec = font->FontSpecInTwips(); + charFormatMask.SetAttrib( EAttFontTypeface ); + charFormatMask.SetAttrib( EAttFontHeight ); + + //can't leave here + TRAPD( err, iParaFormatLayer->SetL( ¶Format, paraFormatMask ); + iCharFormatLayer->SetL( charFormat, charFormatMask ); + iEditor->HandleTextChangedL(); ); + if ( err != KErrNone ) + { + CActiveScheduler::Current()->Error( err ); + } + } + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::AskCancelConfirmationL +// +// --------------------------------------------------------- +// +TInt CCnUiTermsOfUseDlg::AskCancelConfirmationL() + { + HBufC* prompt = iCoeEnv->AllocReadResourceLC( R_QTN_CHAT_CANCEL_TERMSOFUSE ); + CAknQueryDialog* query = CAknQueryDialog::NewL(); + CleanupStack::PushL( query ); + query->SetPromptL( *prompt ); + CleanupStack::Pop( query ); //query + TInt ret( query->ExecuteLD( R_GENERAL_QUERY ) ); + CleanupStack::PopAndDestroy( prompt ); //prompt + return ret; + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::AcceptTermsL +// +// --------------------------------------------------------- +// +TInt CCnUiTermsOfUseDlg::AcceptTermsL() + { + TInt selection = -1; + // CodeScanner warning "neglected to put variable on cleanup stack (id: 35)" + // Ignored, because PrepareLC is called after this one + CAknListQueryDialog* listQuery = + new ( ELeave ) CAknListQueryDialog( &selection ); // CSI: 35 # see above + listQuery->PrepareLC( R_CNUI_ACCEPT_TERMS_OF_USE_LISTQUERY ); + + // Set item texts + CDesCArray* listTexts = NULL; + listTexts = CCoeEnv::Static()->ReadDesC16ArrayResourceL( + R_CNUI_ACCEPT_TERMS_OF_USE_LISTQUERY_ARRAY ); + listQuery->SetItemTextArray( listTexts ); + listQuery->SetOwnershipType( ELbmOwnsItemArray ); + + if ( listQuery->RunLD() == EAknSoftkeyCancel ) + { + return EAknSoftkeyCancel; + } + else + { + return selection; + } + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::SetNewTitleText +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::SetNewTitleTextL() + { + CAknTitlePane* title = GetTitlePaneInstanceL(); + + // Store old one + HBufC* tmp = title->Text()->AllocL(); + delete iOldTitleText; + iOldTitleText = tmp; + + // Clear the navi pane + // Get pointer to status-pane + CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()-> + StatusPane(); + // Get pointer to navi-pane + CAknNavigationControlContainer* naviPane = + static_cast( + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + naviPane->PushDefaultL( ETrue ); + + // Set the new text + HBufC* tempTitle = iEikonEnv->AllocReadResourceLC( R_QTN_CHAT_TOU_TITLE ); + title->SetTextL( *tempTitle ); + CleanupStack::PopAndDestroy( tempTitle ); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::GetTitlePaneInstanceL +// Gets titlepane instance from CEikonEnv +// (other items were commented in a header). +// --------------------------------------------------------- +// +CAknTitlePane* CCnUiTermsOfUseDlg::GetTitlePaneInstanceL() const + { + CAknTitlePane* title = static_cast< CAknTitlePane* > + ( CEikonEnv::Static()->AppUiFactory()->StatusPane()->ControlL( + TUid::Uid( EEikStatusPaneUidTitle ) ) ); + if ( !title ) + { + User::Leave( KErrNotSupported ); + } + return title; + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::DoRestoreTitlePaneTextL() const +// Does the actual restoring. +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::RestoreTitlePaneTextL() const + { + CAknTitlePane* title = GetTitlePaneInstanceL(); + + if ( iOldTitleText ) + { + title->SetTextL( *iOldTitleText ); + } + else + { + title->SetTextToDefaultL(); + } + + // restore the navi pane + // Get pointer to status-pane + CEikStatusPane* statusPane = CEikonEnv::Static()->AppUiFactory()-> + StatusPane(); + // Get pointer to navi-pane + CAknNavigationControlContainer* naviPane = + static_cast( + statusPane->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) ); + naviPane->Pop(); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::UpdateCbaL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::UpdateCbaL() + { + TInt cbaRes = R_CNUI_TERMS_OF_USE_DIALOG_CBA; + CItemFinder::CFindItemExt& curItem = iItemFinder->CurrentItemExt(); + + if ( curItem.iItemType != CItemFinder::ENoneSelected ) + { + cbaRes = R_CNUI_SOFTKEYS_CONTINUE_CANCEL__CONTEXTOPTIONS; + } + + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + cba->SetCommandSetL( cbaRes ); + cba->DrawNow(); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::UpdateTextColorL() +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::UpdateTextColorL() + { + if ( !iEditor ) + { + return; + } + + // Get text color from skin + TRgb textColor( KRgbBlack ); + AknsUtils::GetCachedColor( AknsUtils::SkinInstance(), + textColor, + KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG6 ); + TCharFormat charFormat; + TCharFormatMask charFormatMask; + charFormat.iFontPresentation.iTextColor = textColor; + charFormatMask.SetAttrib( EAttColor ); + + // Apply format + int length = iEditor->RichText()->DocumentLength(); + iEditor->RichText()->SetInsertCharFormatL( charFormat, charFormatMask, length ); + iEditor->RichText()->ApplyCharFormatL( charFormat, charFormatMask, 0, length ); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::HandleResourceChange +// (other items were commented in a header). +// --------------------------------------------------------- +// +void CCnUiTermsOfUseDlg::HandleResourceChange( TInt aType ) + { + if ( aType == KAknsMessageSkinChange ) + { + // When skin changes, we need to update text color + TRAP_IGNORE( UpdateTextColorL(); + iEditor->HandleTextChangedL(); ); + } + CAknDialog::HandleResourceChange( aType ); + } + +// --------------------------------------------------------- +// CCnUiTermsOfUseDlg::ReadToUMessageLC +// (other items were commented in a header). +// --------------------------------------------------------- +// +HBufC* CCnUiTermsOfUseDlg::ReadToUMessageLC() + { + // Open file + RFile handle; + RFs& rfsSession = CCoeEnv::Static()->FsSession(); + User::LeaveIfError( handle.Open( rfsSession , *iToUFileName, EFileRead ) ); + CleanupClosePushL( handle ); + + // Read tou message + TInt size = -1; + User::LeaveIfError( handle.Size( size ) ); + HBufC8* touText = HBufC8::NewLC( size ); + TPtr8 touMsg( touText->Des() ); + User::LeaveIfError( handle.Read( touMsg ) ); + + // Convert result to HBufC* + HBufC* temp = CnvUtfConverter::ConvertToUnicodeFromUtf8L( *touText ); + CleanupStack::PopAndDestroy( 2 ); // toutext, handle + CleanupStack::PushL( temp ); + + // Convert '\n' linebreaks to CEditableText::ELineBreak type line breaks + TPtr ptr( temp->Des() ); + AknTextUtils::ReplaceCharacters( ptr, KLineBreak, CEditableText::ELineBreak ); + + return temp; + } + +// End of file