uifw/AvKon/src/AknInputBlock.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/AknInputBlock.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,180 @@
+/*
+* Copyright (c) 2006-2008 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:  AVKON input blocker.
+*
+*/
+
+
+#include "akninputblock.h"
+#include <eikenv.h>
+#include <eikappui.h>
+#include <eikbtgpc.h>
+#include <avkon.rsg>
+#include <eikcba.h>
+#include <avkon.hrh>
+
+//Define command for MSK.
+const TInt KBlockCBAMSKEmptyID = -100;
+
+EXPORT_C CAknInputBlock* CAknInputBlock::NewLC()
+	{
+	CAknInputBlock* self = new(ELeave) CAknInputBlock;
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+EXPORT_C CAknInputBlock* CAknInputBlock::NewCancelHandlerLC(MAknInputBlockCancelHandler* aHandlerToCancel)
+	{
+	CAknInputBlock* self = NewLC();
+	self->SetCancelHandler(aHandlerToCancel);
+	return self;
+	}
+
+EXPORT_C CAknInputBlock* CAknInputBlock::NewCancelActiveLC(CActive* aActiveObjectToCancel)
+	{
+	CAknInputBlock* self = NewLC();
+	self->SetCancelActive(aActiveObjectToCancel);
+	return self;
+	}
+
+EXPORT_C CAknInputBlock* CAknInputBlock::NewCancelDeleteLC(CBase* aObjectToDelete)
+	{
+	CAknInputBlock* self = NewLC();
+	self->SetCancelDelete(aObjectToDelete);
+	return self;
+	}
+
+EXPORT_C CAknInputBlock::~CAknInputBlock()
+	{
+	iAppUi->RemoveFromStack(this);
+	if (CapturesPointer())
+		SetPointerCapture(EFalse);
+	delete iCba;
+	Cancel();
+	}
+
+EXPORT_C void CAknInputBlock::SetCancelHandler(MAknInputBlockCancelHandler* aHandlerToCancel)
+	{
+	iHandlerToCancel = aHandlerToCancel;
+	}
+
+EXPORT_C void CAknInputBlock::SetCancelActive(CActive* aActiveObjectToCancel)
+	{
+	iActiveObjectToCancel = aActiveObjectToCancel;
+	}
+
+EXPORT_C void CAknInputBlock::SetCancelDelete(CBase* aObjectToDelete)
+	{
+	iObjectToDelete = aObjectToDelete;
+	}
+
+EXPORT_C void CAknInputBlock::Cancel()
+	{
+	// move ownership to stack in case this is deleted
+	MAknInputBlockCancelHandler* handlerToCancel = iHandlerToCancel;
+	iHandlerToCancel = NULL;
+	
+	CActive* activeObjectToCancel = iActiveObjectToCancel;
+	iActiveObjectToCancel = NULL;
+	
+	CBase* objectToDelete = iObjectToDelete;
+	iObjectToDelete = NULL;
+
+	if (handlerToCancel)
+		{
+		handlerToCancel->AknInputBlockCancel();
+		}
+
+	if (activeObjectToCancel)
+		{
+		activeObjectToCancel->Cancel();
+		}
+
+	if (objectToDelete)
+		{
+		delete objectToDelete;
+		}
+	}
+
+CAknInputBlock::CAknInputBlock()
+: iAppUi(iEikonEnv->EikAppUi())
+	{
+	}
+
+
+void CAknInputBlock::ConstructL()
+	{
+	CreateWindowL();
+	SetExtent(TPoint(0,0), TSize(0,0));
+	ActivateL();
+	iAppUi->AddToStackL(this, ECoeStackPriorityDialog);
+
+    iCba = CEikButtonGroupContainer::NewL(
+        CEikButtonGroupContainer::ECba,
+        CEikButtonGroupContainer::EHorizontal,
+        this,
+        R_AVKON_SOFTKEYS_EMPTY);
+    
+    iCba->ButtonGroup()->AsControl()->DrawableWindow()->SetOrdinalPosition(ECoeWinPriorityNeverAtFront);
+    
+    static_cast<CEikCba*>( iCba->ButtonGroup() )->SetButtonGroupFlags(
+        iCba->ButtonGroup()->ButtonGroupFlags() | EAknCBAFlagRespondWhenInvisible );
+    
+    //Set the msk command to consume the EKeyOk event.  
+    TBuf<5> tmp(_L(""));    
+    iCba->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, KBlockCBAMSKEmptyID, tmp );
+    iCba->MakeVisible( EFalse );
+    iCba->SetBoundingRect(TRect(iEikonEnv->ScreenDevice()->SizeInPixels()));
+	}
+
+
+TKeyResponse CAknInputBlock::OfferKeyEventL(const TKeyEvent& aKeyEvent, TEventCode aType)
+	{
+	if (aType == EEventKey && aKeyEvent.iCode == EKeyEscape)
+		{
+#ifdef _DEBUG
+		if (!IsCancellable())
+			RDebug::Print(_L("CAknInputBlock received Escape key while not cancellable"));
+#endif
+		Cancel();
+		}
+    return (aKeyEvent.iScanCode == EStdKeyYes ? EKeyWasNotConsumed : EKeyWasConsumed);	
+	}
+
+void CAknInputBlock::ProcessCommandL(TInt /*aCommandId*/)
+    {
+    }
+
+void CAknInputBlock::FocusChanged(TDrawNow /*aDrawNow*/)
+	{
+	if (IsFocused())
+		{
+		SetPointerCapture(ETrue);
+		ClaimPointerGrab(ETrue);
+		}
+	else
+		{
+		SetPointerCapture(EFalse);
+		}
+	}
+
+bool CAknInputBlock::IsCancellable() const
+	{
+	bool cancellable = 
+		iHandlerToCancel || 
+		iActiveObjectToCancel ||
+		iObjectToDelete;
+	return cancellable;
+	}