photosgallery/viewframework/views/cloudview/src/glxcloudviewimp.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 29 Nov 2010 11:47:03 +0000
branchRCL_3
changeset 78 dbcb928abe9c
parent 75 01504893d9cb
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* Copyright (c) 2008-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:    Implementation of Cloud view
 *
*/




// INCLUDE FILES
#include "glxcloudviewimp.h" //header file

//ALF headers
#include <alf/alfcontrolgroup.h> //for Alfcontrolgroup
#include <alf/alfwidgetcontrol.h> //for alfwidget controls
#include <alf/alfgridlayout.h> // For CAlfGridLayout
#include <alf/ialflayoutmanager.h> // For CAlfLAyoutManager
#include <alf/ialfscrollbarmodel.h> // For CAlfScrollBarModel
#include <alf/ialfscrollbardefaultbaseelement.h> // For CAlfScrollBarDefaultBaseelement
#include <alf/alfwidgetenvextension.h>
#include <glxuiutility.h>
#include <glxresourceutilities.h>  // for CGlxResourceUtilities
#include <glxcollectionplugintags.hrh>
#include <glxfiltergeneraldefs.h>

#include <mpxcollectionutility.h>
#include <mpxcollectionpath.h>
#include <glxtracer.h>	
#include <glxlog.h>					// For Logs
#include <glxsetappstate.h> // For view state
#include <mglxmedialist.h> //medialist
#include <data_caging_path_literals.hrh> // For directory paths 

#include <aknlayoutscalable_uiaccel.cdl.h>
#include <glxtagsbrowserview.rsg>               // For resources

#include "glxcloudviewcontrol.h"//cloud view control

// For transition effects
#include <akntranseffect.h>                             
#include <gfxtranseffect/gfxtranseffect.h>
#include "glxgfxtranseffect.h"  // For transition effects
    
const TInt KViewId = 0x200071B7;

using namespace Alf;
// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
// 
EXPORT_C CGlxCloudViewImp *CGlxCloudViewImp::NewL(MGlxMediaListFactory
		*aMediaListFactory, const TDesC &aFileName, TInt aViewResId, 
		TInt aEmptyListResId, TInt aSoftKeyResId, TInt aSoftkeyMskDisabledId)
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::NewL");
	CGlxCloudViewImp *self = CGlxCloudViewImp::NewLC(aMediaListFactory,
		aFileName, aViewResId, aEmptyListResId, aSoftKeyResId
		, aSoftkeyMskDisabledId);
	CleanupStack::Pop(self);
	return self;
	}

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
EXPORT_C CGlxCloudViewImp *CGlxCloudViewImp::NewLC(MGlxMediaListFactory
		*aMediaListFactory, const TDesC &aFileName, TInt aViewResId,
		TInt aEmptyListResId, TInt aSoftKeyResId, TInt aSoftkeyMskDisabledId)
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::NewLC");
    CGlxCloudViewImp *self = new(ELeave)CGlxCloudViewImp(aSoftKeyResId,aSoftkeyMskDisabledId);
    CleanupStack::PushL(self);
    self->ConstructL(aMediaListFactory, aFileName, aViewResId, aEmptyListResId, aSoftKeyResId);
    return self;
    }

// ---------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------
//
CGlxCloudViewImp::CGlxCloudViewImp(TInt aSoftKeyResId,
		TInt aSoftkeyMskDisabledId) :
	         iSoftKeyResId(aSoftKeyResId), iSoftkeyMskDisabledId(aSoftkeyMskDisabledId)
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::CGlxCloudViewImp");
	}

// ---------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave.
// ---------------------------------------------------------------------------
// 
void CGlxCloudViewImp::ConstructL(MGlxMediaListFactory *aMediaListFactory,
		const TDesC &aFileName, TInt aViewResId, TInt aEmptyListResId,
		TInt /*aSoftKeyResId*/)

	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::ConstructL");
	
	TFileName resourceFile(KDC_APP_RESOURCE_DIR);
	resourceFile.Append (aFileName);
	CGlxResourceUtilities::GetResourceFilenameL (resourceFile);
	iResourceOffset = iCoeEnv->AddResourceFileL (resourceFile);
	BaseConstructL (aViewResId);
	ViewBaseConstructL ();
	MLViewBaseConstructL (aMediaListFactory);
	
	//Register the view to recieve toolbar events. ViewBase handles the events    
	SetToolbarObserver(this);
	ShowToolbarOnViewActivation(ETrue);
	
	iEmptyListText = iEikonEnv->AllocReadResourceL(aEmptyListResId);
	iDisplay = iUiUtility->Display ();
	CAknToolbar* toolbar = Toolbar();
	if(toolbar)
        {
        toolbar->DisableToolbarL(ETrue);  
        }
	}

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CGlxCloudViewImp::~CGlxCloudViewImp()
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::~CGlxCloudViewImp");
        
    CleanupVisuals ();
    delete iEmptyListText;
    if ( iResourceOffset )
        {
        CCoeEnv::Static()->DeleteResourceFile (iResourceOffset);
        }    
    }

// ---------------------------------------------------------------------------
// From CAknView
// Returns views id.
// ---------------------------------------------------------------------------
//
TUid CGlxCloudViewImp::Id()const
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::Id()");
	return TUid::Uid (KViewId);
	}

// ---------------------------------------------------------------------------
// HandleViewCommandL
// ---------------------------------------------------------------------------
//
TBool CGlxCloudViewImp::HandleViewCommandL(TInt aCommand)
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::HandleViewCommandL");
	
	TBool consumed = EFalse;
	switch (aCommand)
		{
		case EAknCmdOpen:
		case EKeyEnter:
			{
            // Processing of this Command depends on Medialist Count ( > 0 tags Available) 
            if (iMediaList->Count())
                {
                // There can be no selection in cloud view, so assume that path contains focused item
                iUiUtility->SetViewNavigationDirection(EGlxNavigationForwards);
                CMPXCollectionPath* path = iMediaList->PathLC(
                        NGlxListDefs::EPathFocusOrSelection);
                // When a collection is opened for browsing, 
                // there are two queries executed with similar filter. 
                // First query to open the collection from list / cloud view.
                // Second one from grid view construction. To improve the grid opening
                // performance, the first query will be completed with empty Id list.
                RArray<TMPXAttribute> attributeArray;
                CleanupClosePushL(attributeArray);
                attributeArray.AppendL(KGlxFilterGeneralNavigationalStateOnly);
                iCollectionUtility->Collection().OpenL(*path,
                        attributeArray.Array());
                CleanupStack::PopAndDestroy(&attributeArray);
                CleanupStack::PopAndDestroy(path);
                consumed = ETrue;
                }
            break;
            }
		}
		
	return consumed;
	}


// ---------------------------------------------------------------------------
// From CAknView
// Handles a view activation.
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::DoMLViewActivateL(const TVwsViewId & /* aPrevViewId */,
		TUid /* aCustomMessageId */, const TDesC8 & /* aCustomMessage */)
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::DoMLViewActivateL");
        
    TUint transitionID = (iUiUtility->ViewNavigationDirection()==
          EGlxNavigationForwards)?KActivateTransitionId:KDeActivateTransitionId; 
    
    GfxTransEffect::BeginFullScreen( transitionID, TRect(),
            AknTransEffect::EParameterType, 
            AknTransEffect::GfxTransParam( KPhotosUid,
            AknTransEffect::TParameter::EEnableEffects) );   

    
    if(StatusPane())
        {
        StatusPane()->MakeVisible(ETrue);
        }
    ConstructCloudControlL();
    GLX_LOG_INFO("CGlxCloudViewImp::DoMLViewActivateL Cloud View Control Created" );  
    
    GfxTransEffect::EndFullScreen();
	
    // set app state to tag-browser view
    GlxSetAppState::SetState (EGlxInTagBrowserView);
    iMMCNotifier = CGlxMMCNotifier::NewL(*this);
    }

// ---------------------------------------------------------------------------
// From CAknView
// View deactivation function.
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::DoMLViewDeactivate()
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::DoMLViewDeactivate");
	
	delete iMMCNotifier;
	iMMCNotifier = NULL;
	
	//Hide softkeys and toolbar upon view de-activation.
	iViewWidget->enableControlPane(EFalse);
	if ( EGlxNavigationForwards == iUiUtility->ViewNavigationDirection() )
        {
        iViewWidget->enableStatusPane(EFalse);    
        }
	CleanupVisuals ();
	}

// ---------------------------------------------------------------------------
// HandleMskChangedL().
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::HandleMskChangedL(TBool aMskEnabled)
    {
    TRACER("GLX_CLOUD ::CGlxCloudViewImp::HandleMskChangedL");
    GLX_LOG_INFO1("GLX_CLOUD ::GLX_CLOUD ::CGlxCloudViewImp::HandleMskChangedL MSk State  %d ",
        aMskEnabled);
	 }

// ---------------------------------------------------------------------------
// HandleLayoutChanged().
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::HandleLayoutChanged()
    {	
    iViewWidget->setRect( ClientRect() );
    SetScrollBarRect();   
    }

// --------------------------------------------------------------------------- 
//ControlGroupId()
// ---------------------------------------------------------------------------
//
TInt CGlxCloudViewImp::ControlGroupId()const
	{
	TRACER("GLX_CLOUD::CGlxCloudViewImp::ControlGroupId");
	return reinterpret_cast < TInt > (this);
	}
	
// ---------------------------------------------------------------------------
// CleanupVisuals
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::CleanupVisuals()
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::CleanupVisuals()");
    if( iViewWidget )
        {        
        iViewWidget->show(false); 
        }  

    if(iScrollWidget)
        {
        iScrollWidget->control()->removeEventHandler(*iCloudControl);
        iScrollWidget =  NULL;
        }
    if( iUiUtility )
        {
		IAlfWidgetFactory& widgetFactory = AlfWidgetEnvExtension::widgetFactory(*(iUiUtility->Env ())); 
        widgetFactory.destroyWidget(iViewWidget);
        }
    iViewWidget = NULL; 
    iScrollbarDefaultBaseElement = NULL;
    }

// ---------------------------------------------------------------------------
// HandleEnterKeyEventL
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::HandleEnterKeyEventL(TInt aCommand)
    {
    HandleViewCommandL(aCommand);
    }

// ---------------------------------------------------------------------------
// HandleEnterKeyEventL
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::ConstructCloudControlL()
    {
   	const char* KScrollBarWidget("scrollbarwidget");
	const char* KVerScrollbarWidgetName("alfscrollbarwidget_ver");
	const char* KScrollBarModel(/*"mulmodel"*/"scrollbarmodel");

	IAlfWidgetFactory& widgetFactory = AlfWidgetEnvExtension::widgetFactory(*(iUiUtility->Env ())); 

    iViewWidget = widgetFactory.createViewWidget("viewwidget", 0,0,iDisplay);
    
    iViewWidget->setRect( ClientRect() );
   iViewWidget->show(true); 
    
    IAlfLayoutManager* layoutmanager = IAlfInterfaceBase::makeInterface<IAlfLayoutManager>(iViewWidget->control());
    iViewWidget->setRect(ClientRect());
   
    // parent layout handle for scrollbar
    iScrollPaneHandle = AknLayoutScalable_UiAccel::aa_scroll_pane(0).LayoutLine();

    iAnchorlayout = &((CAlfAnchorLayout&)layoutmanager->getLayout());

    iAnchorlayout->SetFlag(EAlfVisualFlagLayoutUpdateNotification);
    iAnchorlayout->SetFlag(EAlfVisualFlagAutomaticLocaleMirroringEnabled);
    
    iCloudControl = CGlxCloudViewControl::NewL (*iDisplay, *iUiUtility->Env (), *iMediaList,
               *iEmptyListText, *this,*this,iAnchorlayout,*this,*this); 
    
    CAlfControlGroup * ctrlGroup = iUiUtility->Env ()->FindControlGroup(0);
    if(ctrlGroup)
        {
        ctrlGroup->AppendL(iCloudControl);
        }
   iScrollWidget = widgetFactory.createWidget<IAlfScrollBarWidget>
    	( KScrollBarWidget, KVerScrollbarWidgetName, *iViewWidget, 0 );
    	
    IAlfScrollBarModel* verScrollModel = widgetFactory.createModel<IAlfScrollBarModel> (KScrollBarModel);
        
    iScrollWidget->setModel( verScrollModel );
    
    IAlfElement* vertBaseElement =(iScrollWidget->control()->findElement ("BaseElement"));

    iScrollbarDefaultBaseElement=static_cast<IAlfScrollBarDefaultBaseElement*> (
        vertBaseElement->makeInterface (IAlfScrollBarDefaultBaseElement::type() ) );
  
	if(iScrollWidget) 
		{		
        if(iScrollbarDefaultBaseElement)
	        {
			iCloudControl->InitializeScrollBar(iScrollWidget);    
	        }
        (iScrollWidget->control())->addEventHandler (iCloudControl);
		}		

    SetScrollBarRect();
    
     //acquire the focus so as to get events to your control instead of widgets
    iCloudControl->AcquireFocus();
    }
	
// ---------------------------------------------------------------------------
// SetScrollBarRect()
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::SetScrollBarRect()
    {
    TRect rct  = ClientRect();
    rct.iBr.iX = rct.iBr.iX - iScrollPaneHandle.iW;
    // anchor points for cloud control
    iAnchorlayout->SetAnchor(
            EAlfAnchorTopLeft, 
            0,
            EAlfAnchorOriginLeft,
            EAlfAnchorOriginTop,
            EAlfAnchorMetricAbsolute,
            EAlfAnchorMetricAbsolute,
            TAlfTimedPoint(0,0));

    iAnchorlayout->SetAnchor(
            EAlfAnchorBottomRight, 
            0,
            EAlfAnchorOriginLeft,
            EAlfAnchorOriginTop,
            EAlfAnchorMetricAbsolute,
            EAlfAnchorMetricAbsolute,
            TAlfTimedPoint(ClientRect().iBr.iX - iScrollPaneHandle.iW,(ClientRect().iBr.iY  - ClientRect().iTl.iY)));

    // anchor points for scrollbar widget
    iAnchorlayout->SetAnchor(
            EAlfAnchorTopLeft, 
            1,
            EAlfAnchorOriginLeft,
            EAlfAnchorOriginTop,
            EAlfAnchorMetricAbsolute,
            EAlfAnchorMetricAbsolute,
            TAlfTimedPoint(ClientRect().iBr.iX - iScrollPaneHandle.iW,0));

    iAnchorlayout->SetAnchor(
            EAlfAnchorBottomRight, 
            1,
            EAlfAnchorOriginLeft,
            EAlfAnchorOriginTop,
            EAlfAnchorMetricAbsolute,
            EAlfAnchorMetricAbsolute,
            TAlfTimedPoint(ClientRect().iBr.iX ,(ClientRect().iBr.iY  - ClientRect().iTl.iY)));

    iAnchorlayout->UpdateChildrenLayout(0);
    }
    
// ---------------------------------------------------------------------------
// HandleGridMenuListL()
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::HandleGridMenuListL(TInt aCommand)
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::HandleGridMenuListL");
    ProcessCommandL(aCommand);
    }

// ----------------------------------------------------------------------------
// ViewDynInitMenuPaneL
// ----------------------------------------------------------------------------
// 
void CGlxCloudViewImp::ViewDynInitMenuPaneL(TInt aMenuId, CEikMenuPane* /*aMenuPane*/)
    {
    TRACER("GLX_CLOUD::CGlxCloudViewImp::ViewDynInitMenuPaneL");
    if( aMenuId == R_TAGSBROWSER_MENU)
        {
        iCloudControl->ShowContextItemMenuL(EFalse);
        }
    }

// ---------------------------------------------------------------------------
// HandleMMCInsertionL
// 
// ---------------------------------------------------------------------------
void CGlxCloudViewImp::HandleMMCInsertionL()
    {
    TRACER("CGlxCloudViewImp::HandleMMCInsertionL()");
    iMMCState = ETrue;
    ProcessCommandL(EAknSoftkeyClose);
    }

// ---------------------------------------------------------------------------
// HandleMMCRemovalL
// 
// ---------------------------------------------------------------------------
void CGlxCloudViewImp::HandleMMCRemovalL()
    {
    TRACER("CGlxCloudViewImp::HandleMMCRemovalL()");
    ProcessCommandL(EAknSoftkeyExit);
    }

// ---------------------------------------------------------------------------
// Foreground event handling function.
// ---------------------------------------------------------------------------
//
void CGlxCloudViewImp::HandleForegroundEventL(TBool aForeground)
    {
    TRACER("CGlxCloudViewImp::HandleForegroundEventL");
    CAknView::HandleForegroundEventL(aForeground);
    if(iMMCState)
        {
        iMMCState = EFalse;
        ProcessCommandL(EAknSoftkeyClose);
        }
    }