diff -r aecbbf00d063 -r d48ab3b357f1 uifw/AvKon/src/AknTextSettingPage.cpp --- a/uifw/AvKon/src/AknTextSettingPage.cpp Tue Aug 31 15:28:30 2010 +0300 +++ b/uifw/AvKon/src/AknTextSettingPage.cpp Wed Sep 01 12:16:19 2010 +0100 @@ -34,7 +34,120 @@ #include #include +#include +#include +#include + +/* + * this class is a fixing for bug ESLM-8395MP + * Settingpage will keep watch the RProperty(set by Fep) to hide it self + */ +NONSHARABLE_CLASS( CAknFepSettingDialogStatusWatcher ) : public CActive + { +public: + static CAknFepSettingDialogStatusWatcher* NewL( CAknTextSettingPage* aControl ) + { + CAknFepSettingDialogStatusWatcher* watcher = new (ELeave) CAknFepSettingDialogStatusWatcher( aControl ); + CleanupStack::PushL( watcher ); + watcher->ConstructL(); + CleanupStack::Pop(watcher); + return watcher; + } + + CAknFepSettingDialogStatusWatcher( CAknTextSettingPage* aControl ) + : CActive( EPriorityNormal ) + , iControl( aControl ) + , iAttachSucceed( EFalse ) + { + CActiveScheduler::Add( this ); + } + + ~CAknFepSettingDialogStatusWatcher() + { + StopWatching(); + iFepSettingDialogStatusProperty.Close(); + } + + void StartWatching() + { + if ( !IsActive() && iAttachSucceed ) + { + iFepSettingDialogStatusProperty.Subscribe( iStatus ); + SetActive(); + } + } + + void StopWatching() + { + Cancel(); + } + +private: + + void ConstructL() + { + TInt ret = iFepSettingDialogStatusProperty.Attach( KPSUidAknFep + , KAknFepSettingDialogState + , EOwnerThread ); + iAttachSucceed = ( ret == KErrNone ); + } + + void HandleAknFepSettingDialogStatusChangeNotification() + { + TInt isOpen = 0; + iFepSettingDialogStatusProperty.Get( isOpen ); + if ( !iControl ) + { + return; + } + + if ( isOpen ) + { + iControl->MakeVisible( EFalse ); + } + else + { + iControl->MakeVisible( ETrue ); + } + } + +private: // from CActive + + void RunL() + { + if ( iStatus.Int() == KErrNone ) + { + HandleAknFepSettingDialogStatusChangeNotification(); + StartWatching(); + } + } + + void DoCancel() + { + iFepSettingDialogStatusProperty.Cancel(); + } + +private: + // + // not owned + // + CAknTextSettingPage* iControl; + + RProperty iFepSettingDialogStatusProperty; + + // + // If RProperty attach succeed + // + TBool iAttachSucceed ; + }; + + +// ============================================================================ +// text settingpage private extented class +// +// ============================================================================ +// class CAknTextSettingPageExtension : public CBase , public MEikEdwinObserver { @@ -51,16 +164,24 @@ ~CAknTextSettingPageExtension() { iExtensionOwner = 0; + + if( iAknFepSettingDialogStatusWatcher ) + { + iAknFepSettingDialogStatusWatcher->StopWatching(); + } + delete iAknFepSettingDialogStatusWatcher; } TInt PreviousCba() { return iPreviousCba; }; + void SetPreviousCba(TInt aCbaId) { iPreviousCba = aCbaId; } + TBool PopupState() { return iPopupState; @@ -82,10 +203,13 @@ private: void ConstructL() { + iAknFepSettingDialogStatusWatcher = CAknFepSettingDialogStatusWatcher::NewL( iExtensionOwner ); + iAknFepSettingDialogStatusWatcher->StartWatching(); } CAknTextSettingPageExtension(CAknTextSettingPage* aExtensionOwner ) - : iPreviousCba( 0 ), iExtensionOwner( aExtensionOwner ) + : iPreviousCba( 0 ) + , iExtensionOwner( aExtensionOwner ) , iPopupState( EFalse ) { } @@ -94,6 +218,11 @@ TInt iPreviousCba; CAknTextSettingPage* iExtensionOwner; TBool iPopupState; // when open the popup set popup state flag to 1 + + // + // active object keep watching Fep's property (Owned) + // + CAknFepSettingDialogStatusWatcher* iAknFepSettingDialogStatusWatcher; }; /** @@ -227,6 +356,7 @@ iBackupText = iText.AllocL(); CEikEdwin* editor = TextControl(); + editor->EnableKineticScrollingL( ETrue ); // Inhibit predictive text entry unless allowed by API if ( !(iTextSettingPageFlags & EPredictiveTextEntryPermitted) ) editor->SetAknEditorFlags( EAknEditorFlagNoT9 | editor->AknEdwinFlags() ); @@ -269,7 +399,14 @@ // Construct an appropriate control context for the contained editor areas. // Context produced is owned by CAknSettingPage. SetEditedItemFrameIID( KAknsIIDQsnFrInput, KAknsIIDQsnFrInputCenter ); - TextControl()->ScrollBarFrame()->VerticalScrollBar()->SetMopParent(this); + + // ScrollBarFrame always exists in this phase + CEikScrollBar* sb = editor->ScrollBarFrame()->VerticalScrollBar(); + if ( sb ) + { + sb->SetMopParent( this ); + sb->MakeVisible( ETrue ); + } } /** @@ -423,8 +560,12 @@ for ( TInt i = textLimits.FirstRow(); i <= textLimits.LastRow(); ++i ) { - array.Append( - AknLayoutScalable_Avkon::set_text_pane_t1_copy1( 0, 0, i ) ); + TInt err = array.Append( AknLayoutScalable_Avkon::set_text_pane_t1_copy1( 0, 0, i ) ); + if ( err != KErrNone) + { + array.Close(); + return; + } } AknLayoutUtils::LayoutEdwin( TextControl(),