browserui/browser/FeedsSrc/FeedsFolderView.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 24 Sep 2009 12:40:29 +0300
changeset 19 16a119033e3e
parent 18 4530440261a8
child 31 868cceedabd3
permissions -rw-r--r--
Revision: 200937 Kit: 200939

/*
* Copyright (c) 2005-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:  A view to browse a user's list of feeds.
*
*/



#include <avkon.rsg>

#include <aknviewappui.h>
#include <aknutils.h>
#include <AknToolbar.h>
#include <eikmenup.h>
#include <hlplch.h>
#include <s32mem.h>

#include "Browser.hrh"
#include <BrowserNG.rsg>

#include "BrowserAppUi.h"
#include "CommonConstants.h"
#include <FeedAttributes.h>
#include <FolderAttributes.h>
#include "FeedsFolderContainer.h"
#include "FeedsFolderView.h"
#include "Display.h"


// -----------------------------------------------------------------------------
// CFeedsFolderView::NewL
//
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CFeedsFolderView* CFeedsFolderView::NewL( MApiProvider& aApiProvider, TRect& aRect )
	{
    CFeedsFolderView* self = new (ELeave) CFeedsFolderView(aApiProvider);
    
    CleanupStack::PushL(self);
    self->ConstructL(aRect);
    CleanupStack::Pop();

    return self;
	}


// -----------------------------------------------------------------------------
// CFeedsFolderView::CFeedsFolderView
//
// C++ default constructor.
// -----------------------------------------------------------------------------
//
CFeedsFolderView::CFeedsFolderView(MApiProvider& aApiProvider):
CBrowserViewBase( aApiProvider ),iPenEnabled(EFalse)
	{
    iPenEnabled = AknLayoutUtils::PenEnabled(); 
	}


// -----------------------------------------------------------------------------
// CFeedsFolderView::ConstructL
//
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::ConstructL(TRect& aRect)
    {
    BaseConstructL(R_FEEDS_FOLDER_VIEW);
    
    iContainer = CFeedsFolderContainer::NewL( this, ApiProvider(), aRect );
    iContainer->MakeVisible(EFalse);
    
    if(iPenEnabled)
        {
        Toolbar()->SetToolbarObserver(this);        
        }
    }


// -----------------------------------------------------------------------------
// CFeedsFolderView::~CFeedsFolderView
//
// Deconstructor.
// -----------------------------------------------------------------------------
//
CFeedsFolderView::~CFeedsFolderView()
    {
    DoDeactivate();

    delete iContainer;
    }

// -----------------------------------------------------------------------------
// CFeedsFolderView::Id
//
// Returns the id of the view.
// -----------------------------------------------------------------------------
//
TUid CFeedsFolderView::Id() const
    {
    return KUidBrowserFeedsFolderViewId;
    }

// -----------------------------------------------------------------------------
// CFeedsFolderView::HandleCommandL
//
// Processes commands.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::HandleCommandL(TInt aCommand)
    {   
    TBool  handled = EFalse;
    
    // Handle softkeys and some standard commands first.
    switch (aCommand)
        {
		case EAknSoftkeyBack:
            if (!iContainer->HandleShowParentFolderL())
            	{
            	// If we are in embedded mode (perhaps someone imported a feed from the messaging app)
            	// then we want to close the browser vs. returning to the bookmark view
            	if (iApiProvider.IsEmbeddedModeOn())
            		{
					AppUi()->HandleCommandL( EWmlCmdCloseBrowser );
            		}
              	// Go back to content view only if we came from there. Note that ContentView can be 
               	// on the history if another application launched a URL.                 
                else if(((ApiProvider().GetPreviousViewFromViewHistory() == KUidBrowserContentViewId) 
                	&& (ApiProvider().FeedsClientUtilities().CalledFromView() == KUidBrowserContentViewId))
                	||(ApiProvider().GetPreviousViewFromViewHistory() == KUidBrowserFeedsTopicViewId)
                	&& (ApiProvider().FeedsClientUtilities().CalledFromView() != KUidBrowserBookmarksViewId))
                	{
                	 	iApiProvider.SetViewToBeActivatedIfNeededL( KUidBrowserContentViewId );	
                	}
            	else
            		{
                  	iApiProvider.SetViewToBeActivatedIfNeededL( KUidBrowserBookmarksViewId );
            		}
                }
            handled = ETrue;
            break;
        case EAknSoftkeyOk:
            iContainer->HandleOkL();
            handled = ETrue;
            break;

        case EAknSoftkeyCancel:
            iContainer->HandleCancelL();
            handled = ETrue;
            break;

		case EAknCmdMark:    	        
		case EAknCmdUnmark:    	        
		case EAknMarkAll:    	        
		case EAknUnmarkAll:
            iContainer->HandleMarkL(aCommand);
            handled = ETrue;
          	iContainer->UpdateCbaL();
            iContainer->UpdateToolbarButtonsState();
            break;
            
#ifdef __SERIES60_HELP
        case EAknCmdHelp:
            {
            iApiProvider.SetLastActiveViewId(Id());
            HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), 
                    AppUi()->AppHelpContextL());
            handled = ETrue;
            break;
            }
#endif //__SERIES60_HELP 


        case EEikCmdExit:
        case EAknSoftkeyExit:
            AppUi()->HandleCommandL(aCommand);
            handled = ETrue;
            break;
        }
        
    if (handled)
        {
        return;
        }
        
    // Handle menu commands.
    switch (aCommand)
        {
        case EFeedsOpen:
        case EFeedsActivate:
            iContainer->HandleSelectionL();
            break;

		case EFeedsUpdate:    
		    iContainer->HandleUpdateFeedL();
            break;

		case EFeedsUpdateAll:
		    iContainer->HandleUpdateFeedL(ETrue);
            break;

		case EFeedsNewFeed: 	        
            iContainer->HandleNewFeedL();
            iContainer->UpdateToolbarButtonsState();
            break;
		
		case EFeedsNewFolder:    	        
            iContainer->HandleNewFolderL();
            iContainer->UpdateToolbarButtonsState();
            break;

		case EFeedsEdit:
		case EFeedsRename:
            iContainer->HandleEditL();
            iContainer->UpdateToolbarButtonsState();
            break;

		case EFeedsDelete:
            iContainer->HandleDeleteL();
            break;

		case EFeedsMove:    	        
            iContainer->HandleMoveL();
            break;

		case EFeedsMoveToFolder:    	        
            iContainer->HandleMoveToFolderL();
            break;

		case EFeedsExport:
			iContainer->HandleExportL();
			break;
			
        case EWmlCmdDownloads:            
            ApiProvider().BrCtlInterface().HandleCommandL(
                							(TInt)TBrCtlDefs::ECommandShowDownloads +
                							(TInt)TBrCtlDefs::ECommandIdBase );
            break;

        default:
            iApiProvider.FeedsClientUtilities().HandleCommandL(Id(),aCommand);
            break;
        }        
    }


// -----------------------------------------------------------------------------
// CFeedsFolderView::DoActivateL
//
// Called when the view is activated.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::DoActivateL(const TVwsViewId& /*aPrevViewId*/, 
        TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/)
    {
   	StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL );
  	StatusPane()->MakeVisible( ETrue );
	ApiProvider().Display().ClearMessageInfo();

    if (!iContainer)
        {
		iContainer = CFeedsFolderContainer::NewL( this, ApiProvider(), ClientRect() );

        // Set the root folder.
        if (iRootFolder != NULL)
            {
            iContainer->RootFolderChangedL(*iRootFolder);
            }
        }

    if (!iContainerOnStack)
        {
        AppUi()->AddToViewStackL(*this, iContainer);
        iContainer->SetRect(ClientRect());
        iContainer->MakeVisible(ETrue);
        iContainerOnStack = ETrue;
        // resize screen after calling SetRect.  This way looks better
        iContainer->HandleResourceChange(KEikDynamicLayoutVariantSwitch);
        }

	iApiProvider.SetLastActiveViewId(Id());
    iContainer->UpdateTitleL();
    iContainer->UpdateNavigationPaneL();
    iContainer->UpdateListBoxL(iInitialItem);

	iContainer->UpdateCbaL();	

    }


// -----------------------------------------------------------------------------
// CFeedsFolderView::DoDeactivate
//
// Called when the view is deactivated.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::DoDeactivate()
    {
    if (iContainerOnStack)
        {
        AppUi()->RemoveFromViewStack(*this, iContainer);
        iContainer->MakeVisible(EFalse);
        iContainer->ClearNavigationPane();
        iContainerOnStack = EFalse;
        
        iInitialItem = iContainer->CurrentItemIndex();
        }
	}


// -----------------------------------------------------------------------------
// CFeedsFolderView::DynInitMenuPaneL
//
// Disables unrelated menu options.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::DynInitMenuPaneL(TInt aResourceId, CEikMenuPane* aMenuPane)
    {
    const CFeedsEntity*      item = NULL;
    
    // Get the current item.
    item = iContainer->CurrentItem();

    // Handle the main menu.
    if (aResourceId == R_FEEDS_FOLDER_VIEW_MENU)
        {
        // Dynamically build the menu.
        		
        // Downloads (only if download menu not empty (ie, ongoing downloads)
        if (ApiProvider().BrCtlInterface().BrowserSettingL( TBrCtlDefs::ESettingsNumOfDownloads ))
            {
            iApiProvider.FeedsClientUtilities().AddItemL( *aMenuPane, EWmlCmdDownloads, R_FEEDS_OPTIONS_GO_DOWNLOADS);
            }

        iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsGoto,
            R_FEEDS_OPTIONS_GOTO, R_FEEDS_OPTIONS_GOTO_SUBMENU);

        iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsFeedsActions,
            R_FEEDS_OPTIONS_FEEDSACTIONS, R_FEEDS_OPTIONS_FEEDSACTIONS_SUBMENU);

        iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsEdit,
            R_FEEDS_OPTIONS_EDIT, R_FEEDS_OPTIONS_EDIT_SUBMENU);
      
        // these items only visible for non-empty folder
        if (item != NULL)
            {            
            // Mark/Unmark submenu - only for non-empty folder
            iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsMarkUnmark,
                R_FEEDS_OPTIONS_MARKUNMARK, R_FEEDS_OPTIONS_MARKUNMARK_SUBMENU);
            }

        // ie, privacy submenu
        //iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsClear,
        //    R_FEEDS_OPTIONS_CLEAR, R_FEEDS_OPTIONS_CLEAR_SUBMENU);
        
        iApiProvider.FeedsClientUtilities().AddCascadeL(*aMenuPane,EFeedsOptionsClear,
            R_FEEDS_OPTIONS_CLEAR, R_CLEAR_SUBMENU);
        }
     else if(aResourceId == R_FEEDS_OPTIONS_GOTO_SUBMENU)
        {     
        // Back to Page (if page loaded)
        if ( iApiProvider.IsPageLoaded() )
            {
            iApiProvider.FeedsClientUtilities().AddItemL( *aMenuPane, EWmlCmdBackToPage, R_BROWSER_MENU_ITEM_BACK_TO_PAGE );
            }
        
        // Bookmarks view (if browser wasn't launched directly into feeds)
        if ( !iApiProvider.BrowserWasLaunchedIntoFeeds() )
		    {
    	    iApiProvider.FeedsClientUtilities().AddItemL( *aMenuPane, EWmlCmdFavourites, R_BROWSER_MENU_ITEM_FAVOURITES );
		    } 
        }
     else if(aResourceId == R_FEEDS_OPTIONS_FEEDSACTIONS_SUBMENU)
        {
        if(iContainer &&
           iContainer->iCurrentFolder &&
           iContainer->iCurrentFolder->GetChildren().Count() > 0)
            {        
            if (!(item->GetType() == EFolder) && !iContainer->IsMarkedItemFolder())
                {
                // Update (only if feed has focus)
                iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsUpdate, R_FEEDS_UPDATE);
                }
        
            // Update All (only for non-empty views/folders)
            if(iContainer->SearchForFeedL(iRootFolder))
                {
                iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsUpdateAll, R_FEEDS_UPDATE_ALL);    
                }
  
        
            // Send (only for non-empty views/folders)
	    	iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsExport, R_OPTIONS_EXPORT_FEEDS);
            }
        
        // Import Feeds
		iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsImport, R_OPTIONS_IMPORT_FEEDS);

        // Create Feed
        iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsNewFeed, R_FEEDS_NEW_FEED);        
        }
    else if(aResourceId == R_FEEDS_OPTIONS_EDIT_SUBMENU)
        {        
        if (item != NULL)
        	{
        	TInt markedcount = (iContainer && iContainer->MarkedItems()) ? iContainer->MarkedItems()->Count() : 0;

	        // "Edit Feed" or "Rename Folder" depending upon which has focus
	        if (markedcount < 1)// don't allow edit/rename if feed(s)/folder(s) are marked
                {
                if (item->GetType() == EFolder)
    	            {
    	            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsRename, R_FLDR_RENAME);
    	            }
    	        else
    	            {
    	            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsEdit, R_FEEDS_EDIT);
    	            }
                }
	            
	        // Delete (only if editable item has focus)
	        iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsDelete, R_FEEDS_DELETE);
	            
	        // move
	        if ( iContainer &&
	             iContainer->iCurrentFolder &&
             iContainer->iCurrentFolder->GetChildren().Count() >= 2 )
	            {
	            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsMove, R_OPTIONS_ORG_MOVE);
	            }
	        
	        // move to folder only if a feed has focus and there are folders available
        if (!(item->GetType() == EFolder))
	            {            
                TInt folderCount = 0;
                iContainer->CountFolderFolders(iContainer->iRootFolder, folderCount);
                
                if(iContainer && (folderCount> 0) && !iContainer->IsMarkedItemFolder())
	                {   
	                iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsMoveToFolder, R_OPTIONS_ORG_MOVE_TO_FOLDER);
	                }            
	            }
        	}
                
        // Create Folder
        iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EFeedsNewFolder, R_OPTIONS_ORG_NEW_FOLDER);
        }
    else if( (aResourceId == R_FEEDS_OPTIONS_MARKUNMARK_SUBMENU) || (aResourceId == R_FEEDS_FOLDER_VIEW_MARK_UNMARK_MENU ) )
        {
        // Mark (or unmark)
        if(IsCurrentItemMarked())
            {
            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EAknCmdUnmark, R_OPTIONS_LIST_UNMARK_ONE);            
            }
        else
            {
            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EAknCmdMark, R_OPTIONS_LIST_MARK_ONE);  
            }
        
        // Mark All
        if (  iContainer && iContainer->iCurrentFolder &&
                        iContainer->iCurrentFolder->GetChildren().Count() != iContainer->MarkedItems()->Count() )
            {
            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EAknMarkAll, R_OPTIONS_LIST_MARK_ALL);
            }
        
        // Unmark ALL
        if (AnyMarkedItems())
            {
            iApiProvider.FeedsClientUtilities().AddItemL(*aMenuPane, EAknUnmarkAll, R_OPTIONS_LIST_UNMARK_ALL);            
            }
        }
    else if(aResourceId == R_FEEDS_OPTIONS_CLEAR_SUBMENU)
        {
        
        
        }
    else if(aResourceId == R_FEEDS_FOLDER_MENU_PANE_CONTEXT_MENU) 
            {
            // move
            if ( iContainer &&
                    iContainer->iCurrentFolder &&
                       iContainer->iCurrentFolder->GetChildren().Count() < 2 )
                 {
                    aMenuPane->SetItemDimmed(EFeedsMove,ETrue);
                 }
            aMenuPane->SetItemDimmed(EFeedsMoveToFolder,ETrue);

            if (!(item->GetType() == EFolder))
                {            
                TInt folderCount = 0;
                iContainer->CountFolderFolders(iContainer->iRootFolder, folderCount);
                
                if(iContainer && (folderCount> 0) && !iContainer->IsMarkedItemFolder())
                    {   
                    aMenuPane->SetItemDimmed(EFeedsMoveToFolder,EFalse);
                    }            
                }
            else
            	{
            	aMenuPane->SetItemDimmed(EFeedsUpdate, ETrue);
            	}
            }
    iApiProvider.FeedsClientUtilities().DynInitMenuPaneL(aResourceId, aMenuPane );
    }


// -----------------------------------------------------------------------------
// CFeedsFolderView::UpdateCbaL
//
// Updates the options softkey to reflect the command set.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::UpdateCbaL(TInt aCommandSet)
    {
    if (Cba())
        {
        Cba()->SetCommandSetL(aCommandSet);
        Cba()->DrawDeferred();
        }
    }

// -----------------------------------------------------------------------------
// CFeedsFolderView::RootFolderChangedL
//
// Called to notify the view the that root folder has changed.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::RootFolderChangedL(const CFeedsEntity& aRootFolder)
    {
    iRootFolder = &aRootFolder;
    
    if (iContainer != NULL)
        {        
        iContainer->RootFolderChangedL(aRootFolder);
        iContainer->UpdateToolbarButtonsState();        
        }
    }


// -----------------------------------------------------------------------------
// CFeedsFolderView::SetCurrentFolder
//
// Changes the current folder.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::SetCurrentFolder(const CFeedsEntity& aFolder, TBool aResetSelection)
    {
    if (iContainer != NULL)
        {        
        iContainer->SetCurrentFolder(&aFolder, aResetSelection);
        }
        
    if (aResetSelection)
        {
        iInitialItem = 0;
        }
    }
    
// ---------------------------------------------------------------------------
// CFeedsFolderView::CommandSetResourceIdL
// ---------------------------------------------------------------------------
TInt CFeedsFolderView::CommandSetResourceIdL()
    {
    // It is never called, but this function have to be implemented
    return KWmlEmptyResourceId;
    }
    
// ---------------------------------------------------------
// CFeedsFolderView::HandleClientRectChange
// ---------------------------------------------------------
//
void CFeedsFolderView::HandleClientRectChange()
	{
	if( iContainer )
	    {
        iContainer->SetRect( ClientRect() );
        }
	}

// -----------------------------------------------------------------------------
// CFeedsFolderView::UnreadCountChangedL
//
// Calculate the unread count based on delta, return the calculated value.
// -----------------------------------------------------------------------------
//
TInt CFeedsFolderView::UnreadCountChangedL( TInt aUnreadCountDelta )
{
    TInt unreadCount = 0;

    if (iContainer != NULL)
        {        
        unreadCount = iContainer->UnreadCountChangedL( aUnreadCountDelta );
        }
        
    return unreadCount;
}

// -----------------------------------------------------------------------------
// CFeedsFolderView::SetUnreadCount
//
// Set the unread count.
// -----------------------------------------------------------------------------
//
void CFeedsFolderView::SetUnreadCountL( TInt aUnreadCount )
{
    if (iContainer != NULL)
        {        
        iContainer->SetUnreadCountL( aUnreadCount );
        }
}


// -----------------------------------------------------------------------------
// CFeedsFolderView::AnyFoldersMarked
//
// returns ETrue if any Feeds folders are marked otherwise returns EFalse
// -----------------------------------------------------------------------------
//
TBool CFeedsFolderView::AnyFoldersMarked()
{
    const CArrayFix<TInt>*  markedIndexes = iContainer->MarkedItems();
    const CFeedsEntity*      markedItem = NULL;
    TInt i;

    for ( i = 0; i < markedIndexes->Count(); i++ )
        {
        // Get the item.
        markedItem = iContainer->iCurrentFolder->GetChildren()[(*markedIndexes)[i]];
        if ( markedItem != NULL && markedItem->GetType() == EFolder )
            {  
            return ETrue;
            }
        }
        
    return EFalse;        
}


// -----------------------------------------------------------------------------
// CFeedsFolderView::AnyMarkedItems
//
// returns ETrue anything is marked otherwise returns EFalse
// -----------------------------------------------------------------------------
//
TBool CFeedsFolderView::AnyMarkedItems()
{
    const CArrayFix<TInt>*  markedIndexes = iContainer->MarkedItems();

    if (markedIndexes->Count() > 0 )
        {
        return ETrue;
        }
    else
        {
        return EFalse; 
        }
}

// -----------------------------------------------------------------------------
// CFeedsFolderView::IsItemMarked
//
// returns ETrue if item is marked, otherwise returns EFalse
// -----------------------------------------------------------------------------
//

TBool CFeedsFolderView::IsCurrentItemMarked()
{
    // Get the current item's index
    TInt currIndex = iContainer->CurrentItemIndex();
    const CArrayFix<TInt>*  markedIndexes = iContainer->MarkedItems();

    if (markedIndexes->Count() > 0)
        {
        TKeyArrayFix key(0, ECmpTInt);
        TInt pos = 0;
        TInt retVal = markedIndexes->Find(currIndex,key,pos);
        if( retVal == KErrNone)
            {
            return ETrue;
            }
        }
    return EFalse;
}