diff -r 8e5f6eea9c9f -r 5b3385a43d68 photosgallery/controllers/fetcher/src/glxfetcherdialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/photosgallery/controllers/fetcher/src/glxfetcherdialog.cpp Wed Sep 01 12:33:26 2010 +0100 @@ -0,0 +1,477 @@ +/* +* 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: Creates a Fetcher Dialog +* +*/ + + + +// EXTERNAL INCLUDES +#include +#include +#include // for CEikDialog +#include +#include +#include +#include +#include // For VerifySelectionL() +#include // for CGlxResourceUtilities +#include +#include +#include // Logging macros +#include +#include //command ids +#include // KDC_APP_RESOURCE_DIR +#include // MGlxMediaList, CMPXCollectionPath + +#include +#include + +// CLASS HEADER +#include // FOR GETTING VIEW ID AND RESOURCE ID +#include "glxfetcherdialog.h" +#include "glxfetchercontainer.h" +#include "glxfetcher.hrh" + +const TInt KControlId = 1; + +_LIT(KGlxGridviewResource, "glxgridviewdata.rsc"); + +//----------------------------------------------------------------------------- +// C++ default constructor. +//----------------------------------------------------------------------------- +inline CGlxFetcherDialog::CGlxFetcherDialog( + CDesCArray& aSelectedFiles, + MMGFetchVerifier* aVerifier, + TGlxFilterItemType aFilterType, + const TDesC& aTitle, + TBool aMultiSelectionEnabled) + : iSelectedFiles( aSelectedFiles ), + iVerifier( aVerifier ), + iFilterType( aFilterType ), + iTitle( aTitle ), + iMultiSelectionEnabled(aMultiSelectionEnabled) + { + TRACER("CGlxFetcherDialog::CGlxFetcherDialog"); + // No implementation required + } + +//----------------------------------------------------------------------------- +// Two-phased constructor. +//----------------------------------------------------------------------------- +CGlxFetcherDialog* CGlxFetcherDialog::NewL(CDesCArray& aSelectedFiles, + MMGFetchVerifier* aVerifier, TGlxFilterItemType aFilterType , + const TDesC& aTitle, TBool aMultiSelectionEnabled ) + { + TRACER("CGlxFetcherDialog::NewL"); + CGlxFetcherDialog* self= + new( ELeave ) CGlxFetcherDialog( + aSelectedFiles, aVerifier, aFilterType, aTitle, aMultiSelectionEnabled ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +//----------------------------------------------------------------------------- +// Destructor +//----------------------------------------------------------------------------- +CGlxFetcherDialog::~CGlxFetcherDialog() + { + TRACER("CGlxFetcherDialog::~CGlxFetcherDialog"); + if (iResourceOffset) + { + CCoeEnv::Static()->DeleteResourceFile(iResourceOffset); + } + + if(iMMCNotifier) + { + delete iMMCNotifier; + iMMCNotifier = NULL; + } + if(iFetcherContainer) + { + // Restore the Toolbar as it was in the Calling application + if(iAvkonAppUi->CurrentFixedToolbar()) // there is Hardware Specific Output for Fixed ToolBar + { + iAvkonAppUi->CurrentFixedToolbar()->SetToolbarVisibility(ETrue); + } + + TRAP_IGNORE(iFetcherContainer->SetPreviousTitleL()); + } + if (iUiUtility) + { + iUiUtility->Close(); + } + } + +//----------------------------------------------------------------------------- +// Symbian 2nd phase constructor can leave. +// Create the alfscreenbuffer with a generic buffer screen id +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::ConstructL() + { + TRACER("CGlxFetcherDialog::ConstructL"); + // always first call the base class + CAknDialog::ConstructL( R_MULTISELECT_FETCHER_MENUBAR ); + + // Get the Instance of the toolbar and disable it as it is note required in the Fetcher Application + if (iAvkonAppUi->CurrentFixedToolbar()) // there is Hardware Specific Output for Fixed ToolBar + { + iAvkonAppUi->CurrentFixedToolbar()->SetToolbarVisibility(EFalse); + } + + // Load resource file for grid view empty text + TParse parse; + parse.Set(KGlxGridviewResource, &KDC_APP_RESOURCE_DIR, NULL); + TFileName resourceFile; + resourceFile.Append(parse.FullName()); + CGlxResourceUtilities::GetResourceFilenameL(resourceFile); + iResourceOffset = CCoeEnv::Static()->AddResourceFileL(resourceFile); + + // Get the Hitchcock environment. + iUiUtility = CGlxUiUtility::UtilityL(); + iFetchUri = EFalse; + iMMCNotifier = CGlxMMCNotifier::NewL(*this); + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::CreateCustomControlL +//----------------------------------------------------------------------------- +SEikControlInfo CGlxFetcherDialog::CreateCustomControlL(TInt aControlType) + { + TRACER("CGlxFetcherDialog::CreateCustomControlL"); + // Create Carousal control and add it to HUI CCoecontrol + SEikControlInfo controlInfo; + controlInfo.iControl = NULL; + controlInfo.iTrailerTextId = 0; + controlInfo.iFlags = 0; + + switch( aControlType ) + { + case EFetcherControl : + { + iFetcherContainer = CGlxFetcherContainer::NewL( + iFilterType, iTitle, *this, iMultiSelectionEnabled ); + controlInfo.iControl = iFetcherContainer; // transfers ownership + break; + } + default : + break; + } + return controlInfo; + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::ProcessCommandL +// This processes the events to the OkToExitL +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::ProcessCommandL(TInt aCommandId) + { + TRACER("CGlxFetcherDialog::ProcessCommandL"); + + if( iMenuBar ) + { + iMenuBar->StopDisplayingMenuBar(); + } + switch( aCommandId ) + { + case EAknSoftkeyCancel : + { + TryExitL( aCommandId ); + break; + } + case EAknSoftkeySelect : + case EGlxCmdSelectMarked : + case EAknSoftkeyOk : + { + GLX_LOG_INFO("CGlxFetcherDialog::ProcessCommandL() : EAknSoftkeyOk"); + TryExitL( aCommandId ); + break; + } + default : + { + iFetcherContainer->DoExecuteL( aCommandId ); + break; + } + } + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::OkToExitL +//----------------------------------------------------------------------------- +TBool CGlxFetcherDialog::OkToExitL(TInt aKeycode) + { + TRACER("CGlxFetcherDialog::OkToExitL"); + GLX_LOG_INFO1("CGlxFetcherDialog::OkToExitL : %d",aKeycode ); + TBool retVal = ETrue; + TBool retrieveUriValue = EFalse; + switch (aKeycode) + { + case EAknSoftkeySelect: + case EGlxCmdSelectMarked: + case EAknSoftkeyOk: + case EAknCmdOpen: + { + // Retreives the uri's of the selected files and verifies if it is a + // supported format + if (!iFetchUri) + { + iFetchUri = ETrue; + retrieveUriValue = iFetcherContainer->RetrieveUrisL( + iSelectedFiles, iFetchUri); + if (iVerifier + && !iVerifier->VerifySelectionL(&iSelectedFiles)) + { + GLX_LOG_INFO("CGlxFetcherDialog::OkToExitL : " + " VerifySelectionL() failed!"); + iSelectedFiles.Reset(); + retVal = EFalse; + //if the corrupt file is selected then reset the flag to again enable + //the selection. + iFetcherContainer->SetFileAttached(EFalse); + } + if (!retrieveUriValue) + { + retVal = EFalse; + } + if (iMultiSelectionEnabled && retVal) + { + iFetcherContainer->DoExecuteL(EGlxCmdEndMultipleMarking); + } + } + else + { + // if uri is being fetched then do not set the return value true, else it would cause + // Destructor of Dialog to be called and result in a crash when OKtoExitL is called multiple times. + retVal = EFalse; + } + break; + } + case EAknSoftkeyCancel: // exit dialog + case EAknCmdExit: + { + break; + } + case EAknCmdMark: + case EAknSoftkeyMark: + { + if (iMultiSelectionEnabled) + { + if (iUiUtility->IsPenSupported()) + { + //Since the MSK is disabled we always get EAknCmdMark + //when we select msk hardkey in touch phone, so we need + //to toggle between mark/unmark on the same hardkey event + if (!iMarkStarted) + { + iFetcherContainer->DoExecuteL( + EGlxCmdStartMultipleMarking); + iMarkStarted = ETrue; + } + else + { + MGlxMediaList& mediaList = + iFetcherContainer->MediaList(); + TInt focusIdx = mediaList.FocusIndex(); + if (mediaList.IsSelected(focusIdx)) + iFetcherContainer->DoExecuteL(EAknCmdUnmark); + else + iFetcherContainer->DoExecuteL(EAknCmdMark); + } + } + else + { + if (!iMarkStarted) + { + iFetcherContainer->DoExecuteL( + EGlxCmdStartMultipleMarking); + iMarkStarted = ETrue; + } + else + { + iFetcherContainer->DoExecuteL(EAknCmdMark); + } + } + } + retVal = EFalse; + break; + } + case EAknCmdUnmark: + case EAknSoftkeyUnmark: + { + if (iMultiSelectionEnabled) + { + iFetcherContainer->DoExecuteL(EAknCmdUnmark); + + //@ fix for ELWU-7RA7NX + //@ Reset the flag on no selection, else it'll not pass the events to container for + //@ EGlxCmdStartMultipleMarking case. + MGlxMediaList& mediaList = iFetcherContainer->MediaList(); + if (mediaList.SelectionCount() <= 0) + { + iMarkStarted = EFalse; + } + + HBufC* mskTextMark = StringLoader::LoadLC(R_GLX_MARKING_MARK); + HBufC* rskTextCancel = StringLoader::LoadLC( + R_GLX_SOFTKEY_CANCEL); + iUiUtility->ScreenFurniture()->ModifySoftkeyIdL( + CEikButtonGroupContainer::EMiddleSoftkeyPosition, + EAknCmdMark, 0, *mskTextMark); + iUiUtility->ScreenFurniture()->ModifySoftkeyIdL( + CEikButtonGroupContainer::ERightSoftkeyPosition, + EAknSoftkeyCancel, 0, *rskTextCancel); + CleanupStack::PopAndDestroy(rskTextCancel); + CleanupStack::PopAndDestroy(mskTextMark); + } + retVal = EFalse; + break; + } + default: + break; + } + + GLX_LOG_INFO1("CGlxFetcherDialog::OkToExitL : retVal(%d)", retVal); + return retVal; + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::SizeChanged +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::SizeChanged() + { + TRACER("CGlxFetcherDialog::SizeChanged"); + if (iFetcherContainer) + { + TRAP_IGNORE (iFetcherContainer->HandleSizeChangeL()); + } + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::PreLayoutDynInitL +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::PreLayoutDynInitL() + { + TRACER("CGlxFetcherDialog::PreLayoutDynInitL"); + CreateLineByTypeL( KNullDesC, KControlId, EFetcherControl, NULL ); + } +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::PostLayoutDynInitL +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::PostLayoutDynInitL() + { + TRACER("CGlxFetcherDialog::PostLayoutDynInitL"); + + if (!iUiUtility->IsPenSupported()) + { + CEikButtonGroupContainer& cbaContainer = ButtonGroupContainer(); + if (iMultiSelectionEnabled) + { + cbaContainer.SetCommandSetL(R_AVKON_SOFTKEYS_OK_CANCEL__MARK); + } + else + { + cbaContainer.SetCommandSetL( + R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT); + } + cbaContainer.DrawNow(); + } + + // Create and Display Grid widget + iFetcherContainer->CreateAndDisplayGridL(); + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::OfferKeyEventL +//----------------------------------------------------------------------------- +TKeyResponse CGlxFetcherDialog::OfferKeyEventL(const TKeyEvent& aKeyEvent, + TEventCode aType) + { + TRACER("CGlxFetcherDialog::OfferKeyEventL"); + TKeyResponse response = EKeyWasNotConsumed; + response = iFetcherContainer->OfferKeyEventL(aKeyEvent,aType); + + if(response == EKeyWasNotConsumed) + { + response = CAknDialog::OfferKeyEventL(aKeyEvent,aType); + } + + return response; + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::HandleDoubleTapEventL +// Callback from the container for double tap events +// Offers the event from container to Dialog +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::HandleDoubleTapEventL(TInt aCommandId) + { + TRACER("CGlxFetcherDialog::HandleDoubleTapEventL"); + Extension()->iPublicFlags.Set(CEikDialogExtension::EDelayedExit); + ProcessCommandL(aCommandId); + Extension()->iPublicFlags.Clear(CEikDialogExtension::EDelayedExit); + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::HandleMarkEventL +// Callback from the container to process the mark/unmark events. +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::HandleMarkEventL() + { + TRACER("CGlxFetcherDialog::HandleMarkEventL"); + if ( iUiUtility->IsPenSupported() ) + { + MGlxMediaList& mediaList = iFetcherContainer->MediaList(); + CEikButtonGroupContainer& cbaContainer = ButtonGroupContainer(); + if (mediaList.SelectionCount()) + { + cbaContainer.SetCommandSetL(R_AVKON_SOFTKEYS_OK_CANCEL__MARK); + } + else + { + cbaContainer.SetCommandSetL(R_AVKON_SOFTKEYS_CANCEL); + } + cbaContainer.DrawNow(); + } + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::CallCancelFetcherL +// This function will be called from CGlxFetcher::CancelFetcherL +// This will ensure exit of fetcher dialog & fetcher app +//----------------------------------------------------------------------------- + +void CGlxFetcherDialog::CallCancelFetcherL(TInt aCommandId) + { + TRACER("CGlxFetcherDialog::CallCancelFetcherL"); + TryExitL(aCommandId); + } + +//----------------------------------------------------------------------------- +// CGlxFetcherDialog::HandleMMCRemovalL +// This function will be called when MMC is removed +// This will ensure exit of fetcher dialog. +//----------------------------------------------------------------------------- +void CGlxFetcherDialog::HandleMMCRemovalL() + { + TRACER("CGlxFetcherDialog::HandleMMCRemovalL"); + /* + * need to delay the destruction of dialog. + */ + Extension()->iPublicFlags.Set(CEikDialogExtension::EDelayedExit); + ProcessCommandL(EAknSoftkeyCancel); + Extension()->iPublicFlags.Clear(CEikDialogExtension::EDelayedExit); + } +// End of File