uifw/AvKon/src/AknPreviewPopUpController.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
child 14 3320e4e6e8bb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknPreviewPopUpController.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,536 @@
+/*
+* Copyright (c) 2005-2009 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:  Preview pop-up controller.
+*
+*/
+
+
+// INCLUDE FILES
+#include "AknPreviewPopUpController.h"
+#include "AknPreviewPopUpContentProvider.h"
+#include "AknPreviewPopUp.h"
+#include <AknUtils.h>
+#include <aknappui.h>
+#include <AknSgcc.h>
+#include <w32std.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+
+// CONSTANTS
+const TInt KDefaultPopUpShowDelay = 1000000;
+const TInt KDefaultPopUpHideDelay = 10000000;
+const TInt KObserverArrayGranularity = 1;
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknPreviewPopUpController* CAknPreviewPopUpController::NewL(
+        CCoeControl& aContent, 
+        MAknPreviewPopUpContentProvider& aContentProvider )
+    {
+    return CAknPreviewPopUpController::NewL( aContent, 
+                                             aContentProvider, 
+                                             ELayoutDefault );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknPreviewPopUpController* CAknPreviewPopUpController::NewL(
+        CCoeControl& aContent )
+    {
+    return CAknPreviewPopUpController::NewL( aContent, ELayoutDefault);
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknPreviewPopUpController* CAknPreviewPopUpController::NewL(
+        CCoeControl& aContent, 
+        MAknPreviewPopUpContentProvider& aContentProvider,
+        const TInt aStyle )
+    {
+    CAknPreviewPopUpController* self = new ( ELeave ) CAknPreviewPopUpController(
+        &aContentProvider );
+    CleanupStack::PushL( self );
+    self->ConstructL( aContent, aStyle );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknPreviewPopUpController* CAknPreviewPopUpController::NewL( 
+        CCoeControl& aContent,
+        const TInt aStyle )
+    {
+    CAknPreviewPopUpController* self = new ( ELeave ) CAknPreviewPopUpController(
+        NULL );
+    CleanupStack::PushL( self );
+    self->ConstructL( aContent, aStyle );
+    CleanupStack::Pop( self );        
+    return self;        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::CAknPreviewPopUpController
+// -----------------------------------------------------------------------------
+//
+CAknPreviewPopUpController::CAknPreviewPopUpController(
+        MAknPreviewPopUpContentProvider* aContentProvider )
+    : CTimer( CActive::EPriorityStandard ),
+      iContentProvider( aContentProvider ),
+      iPopUpShowDelay( KDefaultPopUpShowDelay ),
+      iPopUpHideDelay( KDefaultPopUpHideDelay ),
+      iObservers( KObserverArrayGranularity ),
+      iResetting( EFalse )
+    {
+        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CAknPreviewPopUpController::ConstructL( CCoeControl& aContent, 
+                                             const TInt aStyle )
+
+    {
+    iPopUp = CAknPreviewPopUp::NewL( aContent, *this, aStyle );
+    CTimer::ConstructL();
+    CActiveScheduler::Add( this );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::~CAknPreviewPopUpController
+// -----------------------------------------------------------------------------
+//
+CAknPreviewPopUpController::~CAknPreviewPopUpController()
+    {
+    Cancel();
+    delete iPopUp;
+    iObservers.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::ContentSizeInLayout
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CAknPreviewPopUpController::TAknPreviewPopUpContentSize 
+    CAknPreviewPopUpController::ContentSizeInLayout()
+    {
+    // feature removed
+    return CAknPreviewPopUpController::ELarge;        
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::SetPopUpShowDelay
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::SetPopUpShowDelay(
+        const TTimeIntervalMicroSeconds32& aDelay )
+    {
+    iPopUpShowDelay = aDelay;
+    }
+
+    
+ // -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::SetPopUpHideDelay
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::SetPopUpHideDelay(
+        const TTimeIntervalMicroSeconds32& aDelay )
+    {
+    iPopUpHideDelay = aDelay;
+    }
+
+   
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::ShowPopUp
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::ShowPopUp()
+    {
+    Cancel();
+    UpdateContentSize();
+    iState = EShowing;
+    After( iPopUpShowDelay );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::HidePopUp
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::HidePopUp()
+    {
+    Cancel();
+    iPopUp->Hide();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::ContentReady
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::ContentReady()
+    {
+    TRequestStatus* status = &iStatus;
+    User::RequestComplete( status, KErrNone );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::SetPosition
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::SetPosition( const TPoint& aPoint )
+    {
+    if ( !( iPopUp->Flags() & EFixedMode ) )
+        {
+        TPoint askedPoint( aPoint );
+        TSize popupSize( iPopUp->MinimumSize() );
+        
+        // if popup's position is to be mirrored then open it right from the asked
+        // location
+        if ( ( iPopUp->Flags() & EAutoMirror ) && AknLayoutUtils::LayoutMirrored() )
+            {
+            askedPoint.iX += popupSize.iWidth;
+            }
+        
+        TBool resize = EFalse;
+
+        if ( popupSize != iPopUp->Size() )
+            {
+            resize = ETrue;
+            }
+
+        // allowed rect
+        TRect clientRect;
+        AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, clientRect );
+        
+        // Control is allowed to be on top of the status pane but it cannot
+        // overlay either stacon pane or control pane.
+        
+        //switch ( iAvkonAppUi->StatusPane()->CurrentLayoutResId() )
+        CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current();
+        TInt currentStatusPaneLayoutResId = 0;
+        if (statusPane)
+            {
+            currentStatusPaneLayoutResId = statusPane->CurrentLayoutResId();
+            }
+        else
+            {
+            // If this app does not have statuspane, then we ask the layout from AknCapServer.
+            currentStatusPaneLayoutResId = CAknSgcClient::CurrentStatuspaneResource();        
+            }
+            
+        switch ( currentStatusPaneLayoutResId )
+            {
+            case R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_RIGHT:
+            case R_AVKON_STACON_PANE_LAYOUT_USUAL_SOFTKEYS_LEFT:
+            case R_AVKON_STACON_PANE_LAYOUT_IDLE_SOFTKEYS_RIGHT:
+            case R_AVKON_STACON_PANE_LAYOUT_IDLE_SOFTKEYS_LEFT:
+            case R_AVKON_STACON_PANE_LAYOUT_EMPTY_SOFTKEYS_RIGHT:
+            case R_AVKON_STACON_PANE_LAYOUT_EMPTY_SOFTKEYS_LEFT:
+                break;
+                
+            default:
+                TRect statusPaneRect;
+                AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EStatusPane, 
+                                                   statusPaneRect );
+
+                clientRect.BoundingRect( statusPaneRect );
+            }
+
+        TPoint finalPosition;
+
+        // resize if the popup is too wide
+        if ( popupSize.iWidth > clientRect.Width() )
+            {
+            resize = ETrue;
+            popupSize.iWidth = clientRect.Width();
+            }
+
+        // resize if the popup is too tall
+        if ( popupSize.iHeight > clientRect.Height() )
+        	{
+            resize = ETrue;
+            popupSize.iHeight = clientRect.Height();
+        	}
+
+        // default horizontal position is left from the given point
+        if ( askedPoint.iX - popupSize.iWidth >= clientRect.iTl.iX )
+            {
+            finalPosition.iX = askedPoint.iX - popupSize.iWidth;
+            }
+        else
+            {
+            // outside left border, move to left border
+            finalPosition.iX = clientRect.iTl.iX;
+            }
+
+        // check the right border
+        if ( finalPosition.iX + popupSize.iWidth > clientRect.iBr.iX )
+            {
+            finalPosition.iX = clientRect.iBr.iX - popupSize.iWidth;
+            }
+
+        // default vertical position is up from the given point
+        // coordinates grow from top to bottom
+        if ( askedPoint.iY > clientRect.iTl.iY )
+            {
+            finalPosition.iY = askedPoint.iY;
+            }
+        else
+            {
+            // outside top border, move to top border
+            finalPosition.iY = clientRect.iTl.iY;
+            }
+
+        // outside bottom border, move to bottom border
+        if ( ( askedPoint.iY + popupSize.iHeight ) > clientRect.iBr.iY )
+            {
+            finalPosition.iY = clientRect.iBr.iY - popupSize.iHeight;
+            }
+
+        if ( resize )
+            {
+            iPopUp->SetSize( popupSize );
+            }
+
+        iPopUp->SetPosition( finalPosition );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::SetPositionByHighlight
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::SetPositionByHighlight( 
+    const TRect& aHighlightRect )
+    {
+    if ( !( iPopUp->Flags() & EFixedMode ) )
+        {
+        TRect rect( AknLayoutUtils::HighlightBasedRect( aHighlightRect, iPopUp ) );
+
+        // Call SetRect only when truly necessary in order to avoid unnecessary 
+        // SizeChanged calls in the pop-up side.
+        if ( rect.Size() != iPopUp->Size() )
+            {
+            iPopUp->SetRect( rect );
+            }
+        else
+            {
+            iPopUp->SetPosition( rect.iTl );
+            }
+        }
+    }
+
+    
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::AddObserverL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::AddObserverL(
+        const MAknPreviewPopUpObserver& aObserver )
+    {
+    iObservers.InsertInAddressOrderL( &aObserver );
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::RemoveObserver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::RemoveObserver(
+        const MAknPreviewPopUpObserver& aObserver )
+    {
+    TInt index = iObservers.FindInAddressOrder( &aObserver );
+    
+    if ( index != KErrNotFound )
+        {
+        iObservers.Remove( index );
+        }
+    }
+
+        
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::UpdateContentSize
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::UpdateContentSize()
+    {
+    TSize popupSize( iPopUp->MinimumSize() );
+
+    if ( popupSize != iPopUp->Size() )
+        {
+        iPopUp->SetSize( popupSize );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::Size
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSize CAknPreviewPopUpController::Size() const
+    {
+    return iPopUp->Size();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::SetHeadingTextL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::SetHeadingTextL( const TDesC& aText )
+    {
+    iPopUp->SetHeadingTextL( aText );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::NotifyObservers
+// -----------------------------------------------------------------------------
+//
+void CAknPreviewPopUpController::NotifyObservers(
+        MAknPreviewPopUpObserver::TPreviewPopUpEvent aEvent )
+    {
+    for ( TInt i = 0; i < iObservers.Count(); ++i )
+        {
+        TRAP_IGNORE( iObservers[i]->HandlePreviewPopUpEventL( this, aEvent ) );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::RunL
+// -----------------------------------------------------------------------------
+//
+void CAknPreviewPopUpController::RunL()
+    {
+    switch ( iState )
+        {
+        case EShowing:
+            if ( iContentProvider )
+                {
+                iState = EBuildingContent;
+                iStatus = KRequestPending;
+                SetActive();
+                iContentProvider->StartContentBuildingL();
+                }
+            else
+                {
+                iPopUp->Show();
+                
+                if ( iPopUpHideDelay.Int() > 0 && 
+                     !( iPopUp->Flags() & EPermanentMode ) )
+                    {
+                    iState = EHiding;
+                    After( iPopUpHideDelay );
+                    }
+                }
+            break;
+            
+        case EHiding:
+            iPopUp->Hide();
+            break;
+            
+        case EBuildingContent:
+            iPopUp->Show();
+
+            if ( iPopUpHideDelay.Int() > 0 && 
+                 !( iPopUp->Flags() & EPermanentMode ) )
+                {
+                iState = EHiding;
+                After( iPopUpHideDelay );
+                }
+            break;
+            
+        default:
+            User::Panic( _L( "Preview pop-up" ), KErrUnknown );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::DoCancel
+// -----------------------------------------------------------------------------
+//
+void CAknPreviewPopUpController::DoCancel()
+    {
+    if ( iState == EBuildingContent )
+        {
+        iContentProvider->CancelContentBuilding();
+        if ( iStatus.Int() == KRequestPending )
+            {
+            TRequestStatus* status = &iStatus;
+            User::RequestComplete( status, KErrCancel );    
+            }
+        }
+    else
+        {
+        CTimer::DoCancel();
+
+        if(iResetting)
+        	{       	
+        	iResetting = EFalse;
+        	}
+        else
+        	{
+        	iPopUp->Hide();	
+        	}
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::ResetTimer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CAknPreviewPopUpController::ResetTimer()
+    {
+	iResetting = ETrue;
+	Cancel();
+	After( iPopUpHideDelay );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CAknPreviewPopUpController::RunError
+// -----------------------------------------------------------------------------
+//
+TInt CAknPreviewPopUpController::RunError( TInt /*aError*/ )
+    {
+    return KErrNone;
+    }
+    
+//  End of File