diff -r 000000000000 -r 2f259fa3e83a uifw/AvKon/src/aknshut.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AvKon/src/aknshut.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,336 @@ +/* +* Copyright (c) 2002 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: +* +*/ + +// AKNSHUT.CPP +// +// Copyright (c) 1997-2001 Symbian Ltd. All rights reserved. +// + +// +// CAknShutter +// + +#include "aknshut.h" +#include +#include "aknViewAppUi.h" +#include +#include +#include +#include "aknview.h" +#include + +#include +#include +#include +#include"transitionmanager.h" +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + + +class CKludgeScheduler : public CBaActiveScheduler + { +public: + inline TInt PublicLevel() const { return Level(); } + }; + +const TInt KMaxNumEscKeysToSend=50; + + +CAknShutter::CAknShutter(CEikonEnv& aEikEnv, CAknAppUi* aBaseAppUi) + :CActive(EActivePriorityWsEvents+1), + iEikEnv(aEikEnv), + iBaseAppUi(aBaseAppUi), + iStartLevel(StartLevel()), + iCount(0) + { + CActiveScheduler::Add(this); + } + +TInt CAknShutter::StartLevel() + { + return ((CKludgeScheduler*)CActiveScheduler::Current())->PublicLevel(); + } + +CAknShutter::~CAknShutter() + { + Cancel(); + } + +void CAknShutter::DoCancel() + { + } + +void CAknShutter::Queue() + { + if (!IsActive()) + { + TRequestStatus *pS=(&iStatus); + User::RequestComplete(pS,0); + SetActive(); + } + } + +void CAknShutter::RunL() + { + if (iCount++>KMaxNumEscKeysToSend) + { + Stop(); // give up + return; + } + TInt startLevel=StartLevel(); + if (startLevel>iStartLevel) + { + Stop(); // give up: application has put up some query dialog + return; + } + iStartLevel=startLevel; + CEikAppUi* appUi=iEikEnv.EikAppUi(); + if (iBaseAppUi != appUi && appUi->ContainerAppUi()) + { + // embedded app will not be going through a view transition, so send + // events to the app UI. + if (appUi->IsDisplayingMenuOrDialog()) + { + Queue(); // before any call to CActiveScheduler::Start() from below + TKeyEvent key; + key.iRepeats=0; + key.iCode=EKeyEscape; + key.iModifiers=0; + key.iScanCode = EStdKeyNull; + iEikEnv.SimulateKeyEventL(key, EEventKey); + } + else + { + Queue(); // before any call to CActiveScheduler::Start() from below + appUi->StopDisplayingMenuBar(); + appUi->HandleCommandL(EEikCmdExit); + } + } + else if (IsDisplayingMenuOrDialog()) + { + Queue(); // before any call to CActiveScheduler::Start() from below + TKeyEvent key; + key.iRepeats=0; + key.iCode=EKeyEscape; + key.iModifiers=0; + key.iScanCode = EStdKeyNull; + SimulateKeyEventL(key); + } + else if (iEikEnv.EikAppUi()->IsDisplayingMenuOrDialog()) + { // app ui control stack check - only works in view shutter, already checked in app shutter + Queue(); // before any call to CActiveScheduler::Start() from below + TKeyEvent key; + key.iRepeats=0; + key.iCode=EKeyEscape; + key.iModifiers=0; + key.iScanCode = EStdKeyNull; + iEikEnv.SimulateKeyEventL(key,EEventKey); + } + else + { // shut menus + StopDisplayingMenuBar(); + ExitL(); + Stop(); // give up + DeleteSelfIfSelfOwned(); + return; + } + } + +void CAknShutter::DeleteSelfWhenReady() + { + if (!iSelfOwned) + delete this; + } + +void CAknShutter::DeleteSelfIfSelfOwned() + { + if (iSelfOwned) + delete this; + } + +TInt CAknShutter::RunError(TInt aError) + { + DeleteSelfIfSelfOwned(); + return aError; + } + +LOCAL_C CAknEnv& AknEnv(CEikonEnv& aEnv) + { + return static_cast(*aEnv.Extension()); + } + + +CAknAppShutter* CAknAppShutter::NewL(CEikonEnv& aEikEnv, CAknAppUi* aBaseAppUi, CAknAppShutter** aSelfPtr) + { + return new(ELeave) CAknAppShutter(aEikEnv, aBaseAppUi, aSelfPtr); + } + +CAknAppShutter::CAknAppShutter(CEikonEnv& aEikEnv, CAknAppUi* aBaseAppUi, CAknAppShutter** aSelfPtr) +: CAknShutter(aEikEnv, aBaseAppUi), iSelfPtr(aSelfPtr) + { + } + +void CAknAppShutter::Start() + { + if(iBaseAppUi->IsForeground() && iBaseAppUi->Document() ) + { + //only if focused, otherwise next app HandleForeground may never come. + AknEnv(iEikEnv).TransitionEvent(AknTransEffect::EApplicationExit, iBaseAppUi->Application()->AppDllUid()); + } + + iStartLevel = StartLevel(); + iCount = 0; + Queue(); + } + +TBool CAknAppShutter::IsDisplayingMenuOrDialog() const + { + return iEikEnv.EikAppUi()->IsDisplayingMenuOrDialog(); + } + +void CAknAppShutter::SimulateKeyEventL(const TKeyEvent& aKeyEvent) + { + iEikEnv.SimulateKeyEventL(aKeyEvent,EEventKey); + } + +void CAknAppShutter::StopDisplayingMenuBar() + { + iEikEnv.EikAppUi()->StopDisplayingMenuBar(); + } + +void CAknAppShutter::ExitL() + { + StopDisplayingToolbar(); + // app ui can't delete this object in destructor if it's running + iSelfOwned = ETrue; + CAknAppShutter** appUiSelfPtr = iSelfPtr; + if (iSelfPtr) + { + ASSERT(*iSelfPtr == this); + *iSelfPtr = NULL; + iSelfPtr = NULL; + } + iEikEnv.EikAppUi()->HandleCommandL(EEikCmdExit); + + // If we got here, app has not closed as requested. Tell the OOM monitor + ROomMonitorSession oomMonitor; + if (oomMonitor.Connect() == KErrNone) + { + oomMonitor.ThisAppIsNotExiting(iEikEnv.RootWin().Identifier()); + oomMonitor.Close(); + } + + // also check that the app has not started another app shutter + if (appUiSelfPtr && *appUiSelfPtr && (*appUiSelfPtr)->IsActive()) + { + (*appUiSelfPtr)->DeleteSelfWhenReady(); + *appUiSelfPtr = NULL; + } + } + +void CAknAppShutter::Stop() + { + AknEnv(iEikEnv).TransitionEvent(KAknTransitionExitCancel); + + Cancel(); + } + +void CAknAppShutter::StopDisplayingToolbar() + { + CAknAppUi* appUi = static_cast( iEikEnv.EikAppUi() ); + CAknToolbar* appToolbar = 0; + + if ( appUi && appUi->CurrentPopupToolbar() ) + { + appToolbar = appUi->CurrentPopupToolbar(); + } + else if ( appUi && appUi->PopupToolbar() ) + { + appToolbar = appUi->PopupToolbar(); + } + + if ( appToolbar ) + { + appToolbar->HandleResourceChange( KAknToolbarSetHidden ); + } + } + +CAknViewShutter::~CAknViewShutter() + { + iViews.Reset(); + } + +CAknViewShutter* CAknViewShutter::NewL(CEikonEnv& aEikEnv, CAknAppUi* aBaseAppUi) + { + return new(ELeave) CAknViewShutter(aEikEnv, aBaseAppUi); + } + +void CAknViewShutter::Start( const RPointerArray& aViews ) + { + iViews.Reset(); + + for ( TInt i = 0; i < aViews.Count(); i++ ) + { + TRAP_IGNORE( iViews.AppendL( aViews[i] ) ); + } + + iStartLevel = StartLevel(); + iCount = 0; + Queue(); + } + +CAknViewShutter::CAknViewShutter(CEikonEnv& aEikEnv, CAknAppUi* aBaseAppUi) +: CAknShutter(aEikEnv, aBaseAppUi) + { + } + +TBool CAknViewShutter::IsDisplayingMenuOrDialog() const + { + return iEikEnv.EikAppUi()->IsDisplayingMenuOrDialog(); + } + +void CAknViewShutter::SimulateKeyEventL(const TKeyEvent& aKeyEvent) + { + iEikEnv.SimulateKeyEventL(aKeyEvent,EEventKey); + } + +void CAknViewShutter::StopDisplayingMenuBar() + { + for ( TInt i = 0; i < iViews.Count(); i++ ) + { + iViews[i]->StopDisplayingMenuBar(); + } + } + +void CAknViewShutter::ExitL() + { + for ( TInt i = 0; i < iViews.Count(); i++ ) + { + iViews[i]->AknViewDeactivated(); + } + } + +void CAknViewShutter::Stop() + { + Cancel(); + } + +// End of File