// Copyright (c) 2005-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:
// Tests CEikStatusPane APIs.\n
// 
//

/**
 @file
 @internalComponent - Internal Symbian test code
*/

 
#include <e32keys.h>
#include <coemain.h>
#include <eikenv.h>
#include <eikdef.h>
#include <tspane.rsg>
#include "tspane.hrh"
#include "tspane.h"
#include <techview/eikmenup.h>
#include <techview/eiklabel.h>
#include <techview/eikclock.h>
#include <barsread.h>
#include <techview/eikmenub.h>
#include <ecom/ecom.h>
#include <test/testexecutelog.h>
#include <test/testexecutelogext.h>
#include <uikon/eikdefmacros.h>

_LIT(KTSpaneResourceFilePath, "z:\\system\\test\\uiktest\\tspane.rsc");


void Panic(TInt aPanic)
	{
	User::Panic(_L("Tspane App"),aPanic);
	}


CControlStackedGlobalTextEditor::~CControlStackedGlobalTextEditor()
/**
   Destructor
 */
	{
	CCoeAppUi* const appUi=iEikonEnv->EikAppUi();
	if (appUi!=NULL)
		{
		appUi->RemoveFromStack(this);
		}
	}

// Class CTspaneContainer

/**
   Auxiliary function for all Test Cases
  
   This method creates the status pane control on which all tests are
   carried out & a window to hold the control.
   
 */
void CTspaneContainer::ConstructL(const TRect& aRect)
    {
	CreateWindowL();
	CreateStatusPaneL();
	TRect rect(aRect);
	iStatusPane->ReduceRect(rect);
	SetRect(rect);
	ActivateL();
    }

CTspaneContainer::~CTspaneContainer()
/**
   Destructor
 */
    {
	delete iStatusPane;
    }

/**
   Auxiliary function for Container
  
   The method is an override from CCoeControl. The method is called by
   the windows server or the application itself to redraw the status pane.
  
 */
void CTspaneContainer::Draw(const TRect& /*aRect*/) const
	{
	CWindowGc& gc = SystemGc();
	gc.SetPenColor(KRgbWhite);
	gc.SetPenSize(TSize(2,2));
	gc.SetPenStyle(CGraphicsContext::ESolidPen);
	gc.SetBrushColor(KRgbGray);
	gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
	gc.DrawRect(Rect());
	}

/**
   Auxiliary function for Container
  
   The method is an override from MEikStatusPaneObserver. The method is
   invoked on a change in the position or size of the screen area
   occupied by the status pane.
  
 */
void CTspaneContainer::HandleStatusPaneSizeChange()
	{
	TRect rect = iEikonEnv->EikAppUi()->ClientRect();
	iStatusPane->ReduceRect(rect);
	SetRect(rect);
	DrawNow();
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Performs automated tests
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method initiates the following tests:\n
   (1) Out of Memory Tests.\n
   (2) Tests status pane observer provided by MEikStatusPaneObserver.\n
   (3) API testing for the following:\n
   (a) CEikStatusPane::NewL()\n
   (b) CEikStatusPaneBase::ReduceRect()\n
   (c) CEikStatusPaneBase::SwitchLayoutL()\n
   (d) CEikStatusPaneBase::PaneCapabilities()\n
   (e) CEikStatusPaneBase::PaneRectL()\n
   (f) CEikStatusPaneBase::ControlL()\n
   (g) CEikStatusPaneBase::ContainerControlL()\n
  
   @SYMTestExpectedResults All automated tests should complete.
    
 */
void CTspaneContainer::AutoTestL(TAutoTest aTestId)
	{
	switch (aTestId)
		{
		case ETotal:
			ASSERT(CEikStatusPaneBase::Current()!=NULL);
			AutoTestL(EAllNormal);
			AutoTestL(EOOM);
			break;

		case EOOM:
			AutoTestOom();
			if (CEikStatusPaneBase::Current()==NULL)
				{
				CreateStatusPaneL();
				}
			ASSERT(CEikStatusPaneBase::Current()!=NULL);
			break;

		case EAllNormal:
			{
			CreateStatusPaneL();
			for (TInt i=0; i<ENumNormalTests; i++)
				AutoTestL(TAutoTest(i));
			if (CEikStatusPaneBase::Current()==NULL)
				{
				CreateStatusPaneL();
				}
			ASSERT(CEikStatusPaneBase::Current()!=NULL);
			break;
			}

		case EObserver:
			AutoTestObserverL();
			break;

		case ENew:
			AutoTestNewL();
			break;

		case EReduceRect:
			AutoTestReduceL();
			break;

		case ESwitchLayout:
			AutoTestSwitchL();
			break;

		case ECaps:
			AutoTestCapsL();
			break;

		case ERect:
			AutoTestRectL();
			break;

		case EControl:
			AutoTestControlL();
			break;

		case ESwap:
			AutoTestSwapL();
			break;

		case EContainer:
			AutoTestContainerL();
			break;

		case EBackground:
			AutoTestBackgroundL();
			break;
		
		default:
			Panic(0);
			break;
		}
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestOom
  
   @SYMPREQ
  
   @SYMTestCaseDesc Perform Out of Memory tests
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method runs all auto tests under a simulated OOM situation.
  
   @SYMTestExpectedResults All tests should pass under the simulated OOM situation.
   
 */
void CTspaneContainer::AutoTestOom()
	{
	TInt i = 0;
	TInt err = KErrNoMemory;

	while (err != KErrNone)
		{
		User::__DbgSetAllocFail(RHeap::EUser, RHeap::EFailNext, i);

		TRAP(err, 
			{
			AutoTestL(EAllNormal);
			});

		i++;

		TBuf<32> buf;
		buf.Format(_L("OOM %d"), i);
		iEikonEnv->InfoMsg(buf);
		}

	User::__DbgSetAllocFail(RHeap::EUser, RHeap::ENone, i);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestObserverL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Tests status pane observer.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The test resets two status pane observers and allocates
   one of them to be the observer for the test status pane.
   The method then changes the layout and checks whether the observer
   set for the test status pane receives notification of the change. The
   same test is carried out when no observer is set for the status pane.
  
   @SYMTestExpectedResults Only the observer to which the test status pane
   is set should receive the position change notification. The other
   observers should not receive any notifications.
  
 */
void CTspaneContainer::AutoTestObserverL()
	{
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_TOP);
	iObs1.Reset();
	iObs2.Reset();
	iStatusPane->SetObserver(&iObs1);
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_BOTTOM);
	if (!iObs1.Test() || iObs2.Test())
		Panic(0);
	iObs1.Reset();
	iStatusPane->SetObserver(&iObs2);
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_TOP);
	if (iObs1.Test() || !iObs2.Test())
		Panic(0);
	iObs2.Reset();
	iStatusPane->SetObserver(NULL);
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_BOTTOM);
	if (iObs1.Test() || iObs2.Test())
		Panic(0);
	iStatusPane->SetObserver(this);
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_COMPLEX);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestReduceL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::ReduceRect() API.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests CEikStatusPaneBase::ReduceRect() API
   under the following situations:
   (1)When status pane does not extend beyond the screen size.
   (2)When status pane extends beyond the screen size.
  
   @SYMTestExpectedResults Test checks results against expected values.
   
 */
void CTspaneContainer::AutoTestReduceL()
	{
	const TRect spRect(TPoint(0,0), TSize(iEikonEnv->ScreenDevice()->SizeInPixels().iWidth, ETspaneTopHeight));
	TRect test;

	// Normal edge of rectangle reduces, top, left, bottom & right.
	test = spRect;
 
	test.iBr.iY += 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == 0 && test.iTl.iY == spRect.iBr.iY && 
		 test.iBr.iX == spRect.iBr.iX && test.Height() == 10))
		Panic(0);
	
	test = spRect;
	test.iBr.iX += 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == spRect.iBr.iX && test.iTl.iY == 0 && 
		  test.Width() == 10 && test.iBr.iY == spRect.iBr.iY))
		Panic(0);
	
	test = spRect;
	test.iTl.iY -= 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == 0 && test.iTl.iY == -10 && 
		  test.iBr.iX == spRect.iBr.iX && test.Height() == 10))
		Panic(0);
	
	test = spRect;
	test.iTl.iX -= 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == -10 && test.iTl.iY == 0 && 
		  test.Width() == 10 && test.iBr.iY == spRect.iBr.iY))
		Panic(0);
	
	// reductions where status pane extends beyond edge of rect.
	test = spRect;
	test.Shrink(2,2);
	test.iBr.iY += 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == 2 && test.iTl.iY == spRect.iBr.iY && 
		  test.iBr.iX == spRect.iBr.iX-2 && test.Height() == 8))
		Panic(0);
	
	test = spRect;
	test.Shrink(2,2);
	test.iBr.iX += 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == spRect.iBr.iX && test.iTl.iY == 2 && 
		  test.Width() == 8 && test.iBr.iY == spRect.iBr.iY-2))
		Panic(0);
	
	test = spRect;
	test.Shrink(2,2);
	test.iTl.iY -= 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == 2 && test.iTl.iY == -8 && 
		  test.iBr.iX == spRect.iBr.iX-2 && test.Height() == 8))
		Panic(0);

	test = spRect;
	test.Shrink(2,2);
	test.iTl.iX -= 10;
	iStatusPane->ReduceRect(test);
	if (!(test.iTl.iX == -8 && test.iTl.iY == 2 && 
		  test.Width() == 8 && test.iBr.iY == spRect.iBr.iY-2))
		Panic(0);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestSwitchL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::SwitchLayoutL() API.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests switching of layouts with valid &
   invalid layouts. The leave error code is observed on each attempt to
   verify success or failure of layout switch. It also tests whether an
   observer is notified on change in layout.
  
   @SYMTestExpectedResults For all valid layouts CEikStatusPaneBase::SwitchLayoutL()
   should change to the specified layout and should return KErrNone. Otherwise
   the method should return KErrNotFound
   
 */
void CTspaneContainer::AutoTestSwitchL()
	{
	iLayoutNum = 0;

	for (TInt ii=0; ii<7; ii++)
		{
		TRAPD(err, SwitchLayoutL());
		if (err != KErrNone && err != KErrNotFound)
			User::Leave(err);
		if ((ii!=5 && err!=KErrNone) || (ii==5 && err!=KErrNotFound))
			Panic(0);
		}

	iStatusPane->SetObserver(&iObs1);
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_DIFSIZE);
	iObs1.Reset();
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_TOP);
	if (!iObs1.Test())
		Panic(0);
	iObs1.Reset();
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_COMPLEX);
	if (iObs1.Test())
		Panic(0);
	iObs1.Reset();
	iStatusPane->SetObserver(this);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestCapsL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::PaneCapabilities() API
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests whether CEikStatusPanBase::PaneCapabilities()
   sets flags to indicate that the subpane specified is present and part of the
   current status pane layout owned by an application. The test is carried out
   on subpanes that are defined and undefined.
  
   @SYMTestExpectedResults For a defined subpane 
   CEikStatusPanBase::PaneCapabilities() should set flags to represent that
   the subpane is present & owned by the application. For an undefined subpane
   specified the method should not set any flag.
   
 */
void CTspaneContainer::AutoTestCapsL()
	{
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_TOP);
	TInt ii;
	for (ii = ETSpanePaneUid1; ii <= ETSpanePaneUid7; ii++)
		{
		CEikStatusPaneBase::TPaneCapabilities caps = iStatusPane->PaneCapabilities(TUid::Uid(ii));
		if (!caps.IsPresent() || !caps.IsAppOwned())
			Panic(0);
		}
	iStatusPane->SwitchLayoutL(R_TSPANE_LAYOUT_COMPLEX);
	for (ii = ETSpanePaneUid1; ii <= ETSpanePaneUid7; ii++)
		{
		CEikStatusPaneBase::TPaneCapabilities caps = iStatusPane->PaneCapabilities(TUid::Uid(ii));
		if (!caps.IsPresent() || !caps.IsAppOwned())
			Panic(0);
		}

	CEikStatusPaneBase::TPaneCapabilities caps = iStatusPane->PaneCapabilities(TUid::Uid(0x12345678));
	if (caps.IsPresent() || caps.IsAppOwned())
		Panic(0);	
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestRectL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::PaneRectL() API
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests CEikStatusPaneBase::PaneRectL() retrieves the
   size of subpanes present in the current status pane. The tests is carried
   by specifying defined & undefined subpane uids.
  
   @SYMTestExpectedResults For each defined sub-pane 
   CEikStatusPaneBase::PaneRectL() should return it's size.For undefined
   subpane the method should return leave error code KErrNotFound.
   
 */
void CTspaneContainer::AutoTestRectL()
	{
	const TRect spRect(TPoint(0,0), TSize(iEikonEnv->ScreenDevice()->SizeInPixels().iWidth, ETspaneTopHeight));
	const TInt w = spRect.Width()/4;
	const TInt h = spRect.Height()/2;

	const TRect rects[7] = 
		{
			TRect(TPoint(0,0), TSize(w, h)),
			TRect(TPoint(0,h), TSize(w, h)),
			TRect(TPoint(w,0), TSize(w, 2*h)),
			TRect(TPoint(2*w,0), TSize(w, h)),
			TRect(TPoint(2*w,h), TSize(w/2, h)),
			TRect(TPoint(2*w+w/2,h), TSize(w/2, h)),
			TRect(TPoint(3*w,0), TSize(w, 2*h))
		};

	// This test might fail due to rounding errors if your screen is not a
	// multiple of 8 pixels across & a multiple of 2 pixels high.
	TRect rect;
	for (TInt ii = ETSpanePaneUid1; ii <= ETSpanePaneUid7; ii++)
		{
		rect = iStatusPane->PaneRectL(TUid::Uid(ii));
		if (rect != rects[ii-ETSpanePaneUid1])
			Panic(0);
		}

	TRAPD(err, rect = iStatusPane->PaneRectL(TUid::Uid(0x12345678)));
	if (err != KErrNotFound)
		Panic(0);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestControlL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::ControlL() API
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests whether CEikStatusPaneBase::ControlL() returns 
   a sub-pane control represented by the uid specified. To do this the metho 
   changes the sub-pane control properties such as visibilty, fading & dimne s.
   Then it retreives controls from the subpane by specifying their uids an 
   checks the above mentioned properties against expected results. The tes 
   also verifies the scenario where an invalid subpane control uid i 
   specified
  
   @SYMTestExpectedResults The properties of control retreived from status pane
   should match the expected results. When an invalid control uid is specified
   the method should return leave error code KErrNotFound.
   
 */
void CTspaneContainer::AutoTestControlL()
	{
	CCoeControl* control;

	for (TInt vis=0; vis<2; vis++)
		{
		iStatusPane->MakeVisible(vis);
		for (TInt dim=1; dim>=0; dim--)
			{
			iStatusPane->SetDimmed(dim);
			for (TInt fade=1; fade>=0; fade--)
				{
				iStatusPane->SetFaded(fade);
				for (TInt ii = ETSpanePaneUid1; ii <= ETSpanePaneUid7; ii++)
					{
					control = iStatusPane->ControlL(TUid::Uid(ii));
					if (!COMPARE_BOOLS(dim, control->IsDimmed()) ||
						!COMPARE_BOOLS(vis, control->IsVisible()))
						Panic(0);
					}
				}
			}
		}

	TRAPD(err, control = iStatusPane->ControlL(TUid::Uid(0x12345678)));
	if (err != KErrNotFound)
		Panic(0);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestSwapL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::SwapControlL
   
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
  
   @SYMTestActions The method tests whether CEikStatusPaneBase::SwapControlL()
   can swap control on valid sub-pane with the control specified. It
   also tests the behaviour of the method when an undefined sub-pane uid is
   specified.
  
   @SYMTestExpectedResults CEikStatusPaneBase::SwapControlL() should swap the
   control on a valid sub-pane with the control specified. If an undefined
   sub-pane uid is passed to it it should leave with error code KErrNotFound.
   
 */
void CTspaneContainer::AutoTestSwapL()
	{
	iControlNum = 0;

	for (TInt ii=0; ii<4; ii++)
		{
		SwitchControlL(EFalse);
		}

	TRAPD(err, iStatusPane->SwapControlL(TUid::Uid(0x12345678), NULL));
	if (err != KErrNotFound)
		Panic(0);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestContainerL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPaneBase::ContainerControlL() API
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests whether CEikStatusPaneBase::ContainerControlL()
   returns a sub-pane container control represented by the uid specified.
   To do this the method changes the sub-pane container control properties
   such as visibilty, fading & dimness. Then it retreives container controls
   from the subpane by specifying their uids and checks the above mentioned
   properties against expected results. The test also verifies the scenario
   where an invalid subpane container control uid is specified.
  
   @SYMTestExpectedResults The properties of container control retreived from
   status pane should match the expected results. When an invalid container 
   control uid is specified the method should return leave error code
   KErrNotFound.
   
 */
void CTspaneContainer::AutoTestContainerL()
	{
	CCoeControl* control;

	for (TInt vis=0; vis<2; vis++)
		{
		iStatusPane->MakeVisible(vis);
		for (TInt dim=1; dim>=0; dim--)
			{
			iStatusPane->SetDimmed(dim);
			for (TInt fade=1; fade>=0; fade--)
				{
				iStatusPane->SetFaded(fade);
				for (TInt ii = ETSpanePaneUid1; ii <= ETSpanePaneUid7; ii++)
					{
					control = iStatusPane->ContainerControlL(TUid::Uid(ii));
					if (!COMPARE_BOOLS(dim, control->IsDimmed()) ||
						!COMPARE_BOOLS(vis, control->IsVisible()))
						Panic(0);
					}
				}
			}
		}

	TRAPD(err, iStatusPane->ControlL(TUid::Uid(0x12345678)));
	if (err != KErrNotFound)
		Panic(0);
	}


class CEikTestLabel : public CEikLabel
{
	
protected: // from CCoeControl
 void Draw(const TRect& aRect) const;	
	
};

void CEikTestLabel::Draw(const TRect& /*aRect*/) const
	{
		
	}

class CEikTestTextButton : public CEikTextButton
{
	
 void Draw(const TRect& aRect) const;	
};

void CEikTestTextButton::Draw(const TRect& /*aRect*/) const
	{
		
	}

class CEikTestClock : public CEikClock
{
	
 void Draw(const TRect& aRect) const;	
};

void CEikTestClock::Draw(const TRect& /*aRect*/) const
	{
	}

 
 
/**
  Auxiliary function for AutoTestBackGroundL
 
  The function creates different controls and set them in the status pane.
*/
void CTspaneContainer::SwapBackgroundTestControlL(TInt aControlType)
	{
	

	CCoeControl* newControl=0;
	CCoeControl* container = iStatusPane->ContainerControlL(TUid::Uid(ETSpanePaneUid3));
	
 
	switch(aControlType)
		{
		 	case 0: 
			// Pane 1 - normal label
			newControl = new(ELeave) CEikLabel;
		 	CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
		 
			((CEikLabel*)newControl)->SetEmphasis(CEikLabel::EPartialEmphasis);
			((CEikLabel*)newControl)->SetTextL(_L("Normal Label"));
			break;
	
			case 1: 
			// Pane 2 -  label not drawn
			 
			newControl = new(ELeave) CEikTestLabel;
		 	CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);

			((CEikLabel*)newControl)->SetEmphasis(CEikLabel::EPartialEmphasis);
			((CEikLabel*)newControl)->SetTextL(_L("Test Label"));
			break;
			
			case 2: 
			// Pane 3 - normal text button	
		 
			newControl = new(ELeave) CEikTextButton;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);

			((CEikTextButton*)newControl)->SetTextL(_L(" Normal Text Button"));	
			 break;
			 
			case 3:
			// Pane 4 - text button	not drawn
		 
			newControl = new(ELeave) CEikTestTextButton;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);

			((CEikTextButton*)newControl)->SetTextL(_L("Test Text Button"));	
			break;
			
			case 4:
			// Pane 5 - normal clock
			newControl = new(ELeave) CEikClock;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			TResourceReader res;
			iEikonEnv->CreateResourceReaderLC(res, R_TSPANE_CLOCK) ;
			((CEikClock*)newControl)->ConstructFromResourceL(res);
			CleanupStack::PopAndDestroy();	// res
			break;
			
			case 5:
			// Pane 6 - test clock
			newControl = new(ELeave) CEikTestClock;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			TResourceReader res1;
			iEikonEnv->CreateResourceReaderLC(res1, R_TSPANE_CLOCK) ;
			((CEikClock*)newControl)->ConstructFromResourceL(res1);
			CleanupStack::PopAndDestroy();	// res1	    	    
			break;
		}
 
	TRect rect = iStatusPane->PaneRectL(TUid::Uid(ETSpanePaneUid3));
	newControl->SetRect(rect);
	newControl->DrawNow();
	newControl->ActivateL();

	CCoeControl* oldControl= iStatusPane->SwapControlL(TUid::Uid(ETSpanePaneUid3), newControl); // iStatusPane takes ownership of newControl
	iStatusPane->MakeVisible(ETrue); 
	iStatusPane->ApplyCurrentSettingsL();

	CleanupStack::Pop(); 
 
	delete oldControl;
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestBackgroundL
  
   @SYMPREQ 852 part 2
  
   @SYMTestCaseDesc Tests the status pane gets a background
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests whether the background of the status pane
   is set when adding or changing the controls in the pane.
  
   @SYMTestExpectedResults The background is set to blue.
   
 */
void CTspaneContainer::AutoTestBackgroundL()
	{
 
	for (TInt ii=0; ii<6; ii++)
		{
		SwapBackgroundTestControlL(ii);
		}
	}
	
/**
   @SYMTestCaseID UIF-tspane-AutoTestNewL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPane::NewL()
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions This method intiates the following:
   (1)Tests on successful creation of status pane.
   (2)Test CEikStatusPane::NewL() when system status pane specifies an
   undefined default layout.
   (3)Test CEikStatusPane::NewL() when application status pane
   specifies an undefined layout.
   (4)Test CEikStatusPane::NewL() when application status pane
   specifies an undefined override pane.
  
   @SYMTestExpectedResults NA
   
 */
void CTspaneContainer::AutoTestNewL()
	{
	AutoTestAppOverridesL();
	AutoTestBadDefaultLayoutL();
	AutoTestBadOverrideLayoutL();
	AutoTestBadOverridePaneL();
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestAppOverridesL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPane::NewL()
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions This method invokes CEikStatusPane::NewL() method by
   passing proper system status pane & application status pane to
   create a status pane. The method then tests the content & layout
   of the new status pane.
  
   @SYMTestExpectedResults The layout & content should match expected results.
   
 */
void CTspaneContainer::AutoTestAppOverridesL()
	{
	CEikStatusPane* sp = CEikStatusPane::NewL(*iEikonEnv, &iEikonEnv->RootWin(), R_TSPANE_STATUS_PANE, R_TSPANE_APP_OVERRIDES);
	CleanupStack::PushL(sp);

	// Check Layout
	const TRect spRect(TPoint(0,0), TSize(iEikonEnv->ScreenDevice()->SizeInPixels().iWidth, ETspaneTopHeight));
	TRect rect = sp->PaneRectL(TUid::Uid(ETSpanePaneUid1));
	if (rect != spRect)
		Panic(0);

	// Check Content
	CCoeControl* label = sp->ControlL(TUid::Uid(ETSpanePaneUid1));
	if (*((CEikLabel*)label)->Text() != _L("A"))
		Panic(0);

	CleanupStack::PopAndDestroy();	// sp
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestBadDefaultLayoutL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPane::NewL() when system status pane
   specifies an undefined default layout.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions This method invokes CEikStatusPane::NewL() method by
   passing a system status pane that specifies an undefined default 
   layout. The method then tests the error code returned.
  
   @SYMTestExpectedResults CEikStatusPane::NewL() should leave with
   KErrNotFound
   
 */
void CTspaneContainer::AutoTestBadDefaultLayoutL()
	{
	TRAPD(err, CEikStatusPane::NewL(*iEikonEnv, &iEikonEnv->RootWin(), R_TSPANE_BAD_LAYOUT_STATUS_PANE));
	if (err == KErrNone)
		Panic(0);
	if (err != KErrNotFound)
		User::Leave(err);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestBadOverrideLayoutL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPane::NewL() when application status
   pane specifies an undefined layout.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions This method invokes CEikStatusPane::NewL() method by
   passing a application status pane that specifies an undefined layout.
   The method then tests the error code returned.
  
   @SYMTestExpectedResults CEikStatusPane::NewL() should leave with
   KErrNotFound
   
 */
void CTspaneContainer::AutoTestBadOverrideLayoutL()
	{
	TRAPD(err, CEikStatusPane::NewL(*iEikonEnv, &iEikonEnv->RootWin(), R_TSPANE_FLOATING_STATUS_PANE, R_TSPANE_APP_BAD_OVERRIDE_LAYOUT));
	if (err == KErrNone)
		Panic(0);
	if (err != KErrNotFound)
		User::Leave(err);
	}

/**
   @SYMTestCaseID UIF-tspane-AutoTestBadOverridePaneL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test CEikStatusPane::NewL() when the application status
   pane specifies an undefined override pane.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions This method invokes CEikStatusPane::NewL() method by
   passing a application status pane that specifies an undefined override pane.
   The method then tests the error code returned.
  
   @SYMTestExpectedResults CEikStatusPane::NewL() should leave with
   KErrNotFound
   
 */
void CTspaneContainer::AutoTestBadOverridePaneL()
	{
	TRAPD(err, CEikStatusPane::NewL(*iEikonEnv, &iEikonEnv->RootWin(), R_TSPANE_FLOATING_STATUS_PANE, R_TSPANE_APP_BAD_OVERRIDE_PANE));
	if (err == KErrNone)
		Panic(0);
	if (err != KErrNotFound)
		User::Leave(err);
	}

/**
   Auxiliary function for all Test Cases
  
   This method creates a status pane control and sets it's observer.
   
 */
void CTspaneContainer::CreateStatusPaneL()
	{
	delete iStatusPane;
	iStatusPane = NULL;
	iStatusPane = CEikStatusPane::NewL(*iEikonEnv, &iEikonEnv->RootWin(), R_TSPANE_STATUS_PANE);
	//vm test(iStatusPane != NULL);
	iStatusPane->SetObserver(this);
	}

/**
   @SYMTestCaseID UIF-tspane-ReportState
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test inquiry methods for visibility, fading and dimming
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests the following inquiry methods for visibility,
   fading and dimming:
   (1)TBool CEikStatusPaneBase::IsVisible()\n
   (2)TBool CEikStatusPaneBase::IsDimmed()\n
   (1)TBool CEikStatusPaneBase::IsFaded()\n
   The test checks the visibility,dimming & fading parameters of the Status
   pane & reports the state with the help of a information message.
  
   @SYMTestExpectedResults The test verifies results against expected values.
   
 */
void CTspaneContainer::ReportState()
	{
	TBuf<64> buf;
	if (!iStatusPane->IsVisible())
		buf += _L("!");
	buf += _L("vis ");
	if (!iStatusPane->IsDimmed())
		buf += _L("!");
	buf += _L("dim ");
	if (!iStatusPane->IsFaded())
		buf += _L("!");
	buf += _L("fade");
	iEikonEnv->InfoMsg(buf);
	}

/**
   @SYMTestCaseID UIF-tspane-SwitchVis
  
   @SYMPREQ
  
   @SYMTestCaseDesc Tests CEikStatusPane::MakeVisible(TBool aVisible) API.
 
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests making the controls on the status pane
   visible and invisible by calling the method CEikStatusPane::MakeVisible().
  
   @SYMTestExpectedResults The controls on the status pane should be
   invisible / visible when EFalse / ETrue is passed to
   CEikStatusPane::MakeVisible() respectively.\n
   
 */
void CTspaneContainer::SwitchVis()
	{
	iStatusPane->MakeVisible(!iStatusPane->IsVisible());
	}

/**
   @SYMTestCaseID UIF-tspane-SwitchDim
  
   @SYMPREQ
  
   @SYMTestCaseDesc Tests CEikStatusPane::SetDimmed(TBool aDimmed) API.
  
   @SYMTestPriority High
 
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests capability to dim the controls on
   status pane by calling method CEikStatusPane::SetDimmed().
  
   @SYMTestExpectedResults The controls on the status pane should be
   dimmed / restored when ETrue / EFalse is passed to
   CEikStatusPane::SetDimmed() respectively.\n
   
 */
void CTspaneContainer::SwitchDim()
	{
	iStatusPane->SetDimmed(!iStatusPane->IsDimmed());
	}

/**
   @SYMTestCaseID UIF-tspane-SwitchFade
  
   @SYMPREQ
  
   @SYMTestCaseDesc Tests CEikStatusPane::SetFaded(TBool aFaded) API.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests capability to fade the controls on
   status pane by calling method CEikStatusPane::SetFaded().
  
   @SYMTestExpectedResults The controls on the status pane should be
   faded / unfaded when ETrue / EFalse is passed to
   CEikStatusPane::SetFaded() respectively.\n
  
 */
void CTspaneContainer::SwitchFade()
	{
	iStatusPane->SetFaded(!iStatusPane->IsFaded());
	}

/**
  Auxiliary function for TestCaseID tspane-AutoTestL, tspane-AutoTestObserverL,
  tspane_AutoTestSwitchL(), tspane_AutoTestCapsL
  
  This method changes the entire status pane layout to the one specified
  by the resource file.
  
 */
void CTspaneContainer::SwitchLayoutL()
	{
	const TInt layouts[] = 
		{
		R_TSPANE_LAYOUT_COMPLEX, 
		R_TSPANE_LAYOUT_TOP, 
		R_TSPANE_LAYOUT_LEFT, 
		R_TSPANE_LAYOUT_BOTTOM, 
		R_TSPANE_LAYOUT_RIGHT, 
		R_TSPANE_LAYOUT_DIFSIZE,
		0x12345678
		};

	iLayoutNum = (iLayoutNum+1)%(sizeof(layouts)/sizeof(TInt));
	iStatusPane->SwitchLayoutL(layouts[iLayoutNum]);
	}
	
	
/**
   Auxiliary function for TestCaseID tspane-AutoTestSwapL
  
   This method switches the control present on the sub-pane represented by
   uid ETSpanePaneUid1 on the current status pane with the following controls:
   (1) Text Button
   (2) Label
   (3) Global Text Editor
   (4) Clock Control
   
 */
void CTspaneContainer::SwitchControlL(TBool aFocus)
	{
	CCoeControl* newControl=0;
	CCoeControl* container = iStatusPane->ContainerControlL(TUid::Uid(ETSpanePaneUid1));
	
	iControlNum = (iControlNum+1)%4;
	switch(iControlNum)
		{
		case 0:
			newControl = new(ELeave) CEikTextButton;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			((CEikTextButton*)newControl)->SetTextL(_L("B"));
			break;
		case 1:
			newControl = new(ELeave) CEikLabel;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			((CEikLabel*)newControl)->SetEmphasis(CEikLabel::EPartialEmphasis);
			((CEikLabel*)newControl)->SetTextL(_L("Label which is long"));
			break;
		case 2:
			{
			newControl = new(ELeave) CControlStackedGlobalTextEditor(TGulBorder::ESingleGray);
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			TBuf<1> temp = _L("E");
			((CEikGlobalTextEditor*)newControl)->ConstructL(container, 1, 64, CEikEdwin::ENoHorizScrolling, EGulFontControlAll, EGulAllFonts);
			((CEikGlobalTextEditor*)newControl)->SetTextL(&temp);
			if (aFocus)
				{
				iEikonEnv->EikAppUi()->AddToStackL(newControl);
				newControl->SetFocus(ETrue);
				}
			break;
			}
		default:
			newControl = new(ELeave) CEikClock;
			CleanupStack::PushL(newControl);
			newControl->SetContainerWindowL(*container);
			TResourceReader res;
			iEikonEnv->CreateResourceReaderLC(res, R_TSPANE_CLOCK) ;
			((CEikClock*)newControl)->ConstructFromResourceL(res);
			CleanupStack::PopAndDestroy();	// res
			break;
		}

	TRect rect = iStatusPane->PaneRectL(TUid::Uid(ETSpanePaneUid1));
	newControl->SetRect(rect);

	CCoeControl* oldControl = iStatusPane->SwapControlL(TUid::Uid(ETSpanePaneUid1), newControl);
	CleanupStack::Pop();	// newControl transferred to status pane
	if (aFocus && oldControl->IsFocused())
		{
		oldControl->SetFocus(EFalse);
		iEikonEnv->EikAppUi()->RemoveFromStack(oldControl);
		}
	delete oldControl;

	newControl->ActivateL();
	newControl->DrawNow();
	}

/**
   @SYMTestCaseID UIF-tspane-BoundingRectOfRegionL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Tests CEikStatusPaneBase::GetShapeL() API
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests whether GetShapeL() method selects the region
   of screen containing the status pane. The method then reads the bounding
   rectangle for the region to verify.
  
   @SYMTestExpectedResults The bounding rectangle co-ordinates of status pane
   should be displayed.
   
 */
void CTspaneContainer::BoundingRectOfRegionL()
	{
	TRect boundingRect(0,0,0,0);
	if(iStatusPane)
		{
		TRegionFix<40> region;	
		iStatusPane->GetShapeL(region,ETrue,ETrue);
		boundingRect = region.BoundingRect();
		}
	TBuf<80> messageBuf;
	_LIT(KBoundingInfoBuf,"Status pane bounding rectangle = %d,%d,%d,%d");
	messageBuf.AppendFormat(KBoundingInfoBuf,boundingRect.iTl.iX,boundingRect.iTl.iY,boundingRect.iBr.iX,boundingRect.iBr.iY);
	iEikonEnv->InfoMsg(messageBuf);
	}

//
// CFloatingSpaneKiller
//
CFloatingSpaneKiller::~CFloatingSpaneKiller()
/**
   Destructor
 */
	{
	delete iSpane;
	if (iWg)
		{
		iWg->Close();
		}
	delete iWg;
	}
	
/**
   Auxiliary function for TestCaseID tspane-CreateNewWindowGroupL
  
   This method allocates and constructs a new text button control.
  
 */	
CFloatingSpaneKiller* CFloatingSpaneKiller::NewL(CEikStatusPane* aSpane, RWindowGroup* aWg)
	{
	CFloatingSpaneKiller* self = new(ELeave) CFloatingSpaneKiller(aSpane, aWg);
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop();
	return self;
	}

/**
   @SYMTestCaseID UIF-tspane-HandleControlEventL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test Killing the floating Status pane.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The method tests deletion of the floating status pane.
  
   @SYMTestExpectedResults The method should successfully delete the floating
   status pane.
   
 */
void CFloatingSpaneKiller::HandleControlEventL(CCoeControl* /*aControl*/,TCoeEvent aEventType)
	{
	if (aEventType == EEventStateChanged)
		{
		RWindowGroup* wg = iWg;
		iWg = NULL;
		if (wg)
			{
			wg->Close();
			}
		CEikStatusPane* spane = iSpane;
		iSpane = NULL;
		delete spane;
		delete wg;
		}
	}

CFloatingSpaneKiller::CFloatingSpaneKiller(CEikStatusPane* aSpane, RWindowGroup* aWg)
: iSpane(aSpane), iWg(aWg)
/**
   Constructor
 */
	{
	}

/**
   Auxiliary function for TestCaseID tspane-CreateNewWindowGroupL
  
   This method completes construction of text button control and swaps the
   control with sub-pane control on the floating status pane.
  
 */
void CFloatingSpaneKiller::ConstructL()
	{
	CCoeControl* container = iSpane->ContainerControlL(TUid::Uid(ETSpanePaneUid2));
	
	SetContainerWindowL(*container);
	SetTextL(_L("Kill"));

	SetObserver(this);

	SetRect(container->Rect());		// the fast way to set a controls rect when swapping into status pane

	CCoeControl* oldControl = iSpane->SwapControlL(TUid::Uid(ETSpanePaneUid2), this);
	delete oldControl;

	ActivateL();
	DrawNow();
	}


//
// CTspaneAppUi
//
CTspaneAppUi::CTspaneAppUi(CTmsTestStep*		aStep) :
	CTestAppUi(aStep,
		KTSpaneResourceFilePath, 
		R_TSPANE_HOTKEYS, 
		R_TSPANE_MENUBAR)
/**
   Constructor
 */
	{
	}



CTspaneAppUi::~CTspaneAppUi()
/**
   Destructor
 */
	{
	RemoveFromStack(iAppView);
	delete iAppView;

	}

/**
   Auxiliary function for all Test Cases
  
   This method prepares the test step's user interface and prepares it
   to start the tests.
   
 */
void CTspaneAppUi::ConstructL()
    {
   	CTestAppUi::ConstructL();
	
	iAppView=new(ELeave) CTspaneContainer;
    iAppView->ConstructL(ClientRect());
	AddToStackL(iAppView);

	AutoTestManager().StartAutoTest();
	}

/**
   Auxiliary function for all Test Cases
  
   The method is an override from CTestAppUi. The method initiates all tests
   by calling CTspaneAppUi::HandleCommandL().
   
 */
void CTspaneAppUi::RunTestStepL(TInt aNumStep)
	{
#ifdef FORCE_AUTO
	User::After(TTimeIntervalMicroSeconds32(1000000));
#endif	
	switch(aNumStep)
		{
		case 1:
		SetTestStepID(_L("UIF-tspane-AutoTestL"));
		INFO_PRINTF1(_L("Normal"));
		HandleCommandL(ETspaneCmdAutoNormal);
		RecordTestResultL();
		break;
		case 2:
		SetTestStepID(_L("UIF-tspane-AutoTestL"));
		INFO_PRINTF1(_L("Oom"));
		HandleCommandL(ETspaneCmdAutoOom);
		RecordTestResultL();
		break;
		case 3:
		SetTestStepID(_L("UIF-tspane-BoundingRectOfRegionL"));
		INFO_PRINTF1(_L("Display status pane bound rectangle"));
		HandleCommandL(ETspaneCmdBoundingRegion);
		RecordTestResultL();
		break;
		case 4:
		SetTestStepID(_L("UIF-tspane-ReportState"));
		INFO_PRINTF1(_L("Manual state report"));
		HandleCommandL(ETspaneCmdManualState);
		RecordTestResultL();
		break;
		case 5:
		SetTestStepID(_L("UIF-tspane-CreateNewWindowGroupL"));
		INFO_PRINTF1(_L("Create new window group"));
		HandleCommandL(ETspaneCmdManualWg);
		RecordTestResultL();
		break;
		case 6:
		if(iFloatingPanel)
			{	
			SetTestStepID(_L("UIF-tspane-HandleControlEventL"));
			INFO_PRINTF1(_L("Kill Floating panel"));
			iFloatingPanel->HandleControlEventL(NULL, CFloatingSpaneKiller::EEventStateChanged);
			iFloatingPanel = NULL;
			RecordTestResultL();
			}
		break;
		case 7:
		SetTestStepID(_L("UIF-tspane-SwitchVis"));
		// follow on...
		case 8:
		INFO_PRINTF1(_L("Switch Vis"));
		HandleCommandL(ETspaneCmdManualVis);
		if( aNumStep == 8 )
			{
			RecordTestResultL();
			}
		break;
		case 9:
		SetTestStepID(_L("UIF-tspane-SwitchDim"));
		// follow on...
		case 10:
		INFO_PRINTF1(_L("Switch Dim"));
		HandleCommandL(ETspaneCmdManualDim);
		if( aNumStep == 10 )
			{
			RecordTestResultL();
			}
		break;
		case 11:
		SetTestStepID(_L("UIF-tspane-AutoTestSwapL"));
		// follow on...
		case 12: case 13: case 14:
		INFO_PRINTF1(_L("Switch Control"));
		HandleCommandL(ETspaneCmdManualControl);
		if( aNumStep == 14 )
			{
			RecordTestResultL();
			}
		break;
		case 15:
		SetTestStepID(_L("UIF-tspane-AutoTestSwitchL"));
		// follow on...
		case 16: case 17: case 18: case 19:
		INFO_PRINTF1(_L("Switch Layout"));
		HandleCommandL(ETspaneCmdManualLayout);
		if( aNumStep == 19 )
			{
			RecordTestResultL();
			CloseTMSGraphicsStep();
			}
		break;
		case 20:
			AutoTestManager().FinishAllTestCases(CAutoTestManager::EPass);
			break;
		}
	}

/**
   Auxiliary function for all Test Cases
  
   This method is called by CTspaneAppUi::RunTestStepL() to initiate the tests.
   
 */
void CTspaneAppUi::HandleCommandL(TInt aCommand)
	{
	switch (aCommand)
		{
		case EEikCmdExit:
			Exit();
			break;
		case ETspaneCmdAutoAll:
			iAppView->AutoTestL(CTspaneContainer::ETotal);
			iEikonEnv->InfoMsg(_L("Complete"));
			break;
		case ETspaneCmdAutoNormal:
			iAppView->AutoTestL(CTspaneContainer::EAllNormal);
			iEikonEnv->InfoMsg(_L("Complete"));
			break;
		case ETspaneCmdAutoOom:
			iAppView->AutoTestL(CTspaneContainer::EOOM);
			iEikonEnv->InfoMsg(_L("Complete"));
			break;
		case ETspaneCmdManualVis:
			iAppView->SwitchVis();
			break;
		case ETspaneCmdManualDim:
			iAppView->SwitchDim();
			break;
		case ETspaneCmdManualFade:
			iAppView->SwitchFade();
			break;
		case ETspaneCmdManualState:
			iAppView->ReportState();
			break;
		case ETspaneCmdManualLayout:
			iAppView->SwitchLayoutL();
			break;
		case ETspaneCmdManualControl:
			iAppView->SwitchControlL();
			break;
		case ETspaneCmdManualWg:
			CreateNewWindowGroupL();
			break;
		case ETspaneCmdBoundingRegion:
			iAppView->BoundingRectOfRegionL();
			break;
		default:
			Panic(0);
			break;
		}
	}

/**
   @SYMTestCaseID UIF-tspane-CreateNewWindowGroupL
  
   @SYMPREQ
  
   @SYMTestCaseDesc Test adding a floating status pane to a new window group.
  
   @SYMTestPriority High
  
   @SYMTestStatus Implemented
   
   @SYMTestActions The test method creates a new window group and adds a floating
   status pane with two sub-panes that are strechable. Now a Text Button
   control is created and swaped with second sub-pane label control.
  
   @SYMTestExpectedResults Floating status pane should display only sub-pane one
   since it is strechable. Once the Text button control is created and swapped
   with control on sub-pane two sub-pane one should reduce its size to also
   accomodate the text button.
   
 */
void CTspaneAppUi::CreateNewWindowGroupL()
	{
	RWindowGroup* wg=new(ELeave) RWindowGroup(iEikonEnv->WsSession());
	User::LeaveIfError(wg->Construct((TUint32)this));
	wg->SetOrdinalPosition(0,ECoeWinPriorityAlwaysAtFront);
	wg->EnableReceiptOfFocus(EFalse); // disable key events
	CleanupStack::PushL(wg);
	CEikStatusPane* statusPane = CEikStatusPane::NewL(*iEikonEnv, wg, R_TSPANE_FLOATING_STATUS_PANE);
	CleanupStack::PushL(statusPane);
	iFloatingPanel = CFloatingSpaneKiller::NewL(statusPane, wg);	// transfers ownership to a killer button
	CleanupStack::Pop(2);	// statusPane and wg
	// We can loose track of the status pane, window group and killer, because they
	// are in a mutual suicide pact!
	}

//--------

CTestSpaneStep::CTestSpaneStep()
/**
   Constructor
 */
	{
	SetTestStepName(KTestSpaneStep);
	}

CTestSpaneStep::~CTestSpaneStep()
/**
   Destructor
 */
	{
	}

/**
   Auxiliary function for all Test Cases
  
   The method creates & sets the application's user interface object.
   
 */
void CTestSpaneStep::ConstructAppL(CEikonEnv* aCoe)
    { // runs inside a TRAP harness
	aCoe->ConstructL();
	CTspaneAppUi* appUi= new (ELeave) CTspaneAppUi(this);
    aCoe->SetAppUi(appUi);
    appUi->ConstructL();
    }

/**
   Auxiliary function for all Test Cases
  
   The method creates & sets the test step's user interface object and
   launches the test step.
   
 */
TVerdict CTestSpaneStep::doTestStepL() // main function called by E32
	{
	PreallocateHALBuffer();
	__UHEAP_MARK;

	CEikonEnv* coe=new CEikonEnv;
	TRAPD(err,ConstructAppL(coe));

	if (!err)
		coe->ExecuteD();
	
	REComSession::FinalClose();	
	__UHEAP_MARKEND;

	return TestStepResult();
	}
	
	
